文档与视图结构
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;
}
}