24课时VC之思考->文档与视图结构

 

                                                                文档与视图结构

 

CObject是MFC类结构的根类。任何代表一个窗口或控件的类是CWnd类的派生类,它处理所有 窗口共同的基本函数。

CObject和CWnd类使用虚函数,它使程序利用基类指针能够访问通用对象函数。 这样就可以很方便地利用CObject或CWnd派生类的对象与MFC交互。

……动态创建支持机制用CRuntimeClass允许时创建对象。

……串行化支持机制允许以面向对象方式存储和装载对象。

文档类对程序的数据负责,视图类处理文档与用户间的交互,框架结构类包含有视图及其他用户 接口数据,如菜单和工具栏,应用类负责启动程序的运行和处理程序与Windows间的数据交互。

CString strMsg; strMsg.Format("Foo=%d",pFoo);

 

@虚拟函数是在运行时决定的函数,当使用虚拟函数时,编译器会建立一个特殊的表,称作虚拟函数表 。这个表用来决定调用该类的哪一个对象的函数。当调用虚拟函数时,虚拟函数表就保证了调用正确 的函数

class CUser {

public:

virtual void ClenrInfo();

};

 

 

探索Document/View接口

1.GetDocument CView的一个成员函数,用来检索其文档的指针。

2.UpdateAllViews CDocument的一个成员函数,用来更新与某文件相连的视图。

3.OnNewDocument CDocument的一个成员函数,用来初始化文档的成员。

4.TRACE宏显示一行文本信息。让你的程序没遇到有趣的事件时都显示跟踪信息是 一个好主意。

5.ASSERT_VALID宏来使指针有效。你可以经常使用该宏来使旧的指针有效。

6.TEXTMETRICS结构。该结构中成员tnHeight是所有中字体的最高高度,成员 tmExternalLeading是行间距,添加这两个值使得文本的显示有很好的风格。

 

                                                          

 

 

问题与解答  

int *pBadInt;

*pBadInt=42;//错误

 

第一,指针变量没有初始化,初始化指针变量为NULL或指向一段动态分配的内存

int *pInt=NULL; int *pInt=new int;

第二,指针不会自动地指向闲置内存区,pBadInt位初始化,指向的是一块随机 的内存区。必须使指针变量要么为已存在的变量的地址,要么位一块动态分配 的内存的地址,例如:

int n;

int *pInt;

pInt=&n;

*pInt=42;


 

pInt=new int;

*pInt=42;

delete pInt;

 

 

第一部分:CDVTestDoc.h中声明


public:
 CString GetName(int nIndex) const;
 int AddName(const CString& szName);
 int GetCount() const;
private:
 CArray<CString,CString> m_arNames;

 

第二部分:CDVTestDoc.cpp实现

 

CString CDVTestDoc::GetName(int nIndex) const

{

ASSERT(nIndex<m_arNames.GetSize());

return m_arNames[nIndex];

}

int CDVTestDoc::AddName(const CString& szName)

{

return m_arNames.Add(szName);

}

int CDVTestDoc::GetCount() const

{

return m_arNames.GetSize();

}

 

第三部分:文档的初始化

 

BOOL CDVTestDoc::OnNewDocument()

{    

TRACE("CDVTest::OnNewDocument");

 if (!CDocument::OnNewDocument())  

 return FALSE;

 // TODO: add reinitialization code here  

// (SDI documents will reuse this document)  

m_arNames.RemoveAll();  

m_arNames.Add("Curty");  

m_arNames.Add("Moe");  

m_arNames.Add("Shemp");

 return TRUE;

}

 

第四部分:视图的更新显示

 

void CDVTestView::OnDraw(CDC* pDC)

{  

CDVTestDoc* pDoc = GetDocument();  

ASSERT_VALID(pDoc);

 // TODO: add draw code for native data here

 TEXTMETRIC tm;  

pDC->GetTextMetrics(&tm);

 int nLineHeight=tm.tmHeight+tm.tmExternalLeading;

 CPoint ptText(0,0);  

for(int nIndex=0;

nIndex<pDoc->GetCount();nIndex++)  

{    

CString szName=pDoc->GetName(nIndex);    

pDC->TextOut(ptText.x,ptText.y,szName);

 ptText.y+=nLineHeight;

 }

}

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-08-09 16:52  Alan Perlis  阅读(224)  评论(0编辑  收藏  举报