第七章 简单而完整的MFC骨干程序。
这一章主要是剖析有AppWizard产生的完整的MFC骨干程序。
首先要熟记MFC类层次结构,这是理解MFC构建的前提。
MFC层次结构图:文档视图结构是MFC进化为应用程序框架的灵魂,在MFC中CDocument负责处理数据,它只是个空壳,我们可以重写Serialze函数,派生符合我们需求的类。与CDocument相辅相成的是CView类,它是负责数据得显示的类,同时它还负责程序与使用者之间的交互。使用者对数据的修改都需要依赖CView类的响应。
有关文件读写的操作是由CDocument中的Serilize虚函数负责的。有关显示的操作是在CView中的OnDraw虚函数中处理的。当我们派生自己的两个类CMyDoc和CMyView,只要把所有精力花在CMyDoc::Serialize和CMyView::OnDraw身上就可以了。
先介绍Document Template,在文档视图结构中,虽然CView负责显示,但是它的外围必须有一个外框窗口作为舞台。也可以说Document Template是View窗口的一个容器,数据,数据的显示,以及容纳数据显示的窗口,它们是一体的。缺一不可。
程序每打开一个文件就应该产生三个对象:
1:CDocument对象。
2:CView对象。
3:外框窗口CMDIChildWnd对象。
这些对象是由Document Template对象进行管理
如:CMultiDocTemplate *pDocTemplate=new CMultiDocTemplate ( IDR_SCRIBTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMyView)
);
AddDocTemplate(pDocTemplate);
如果程序支持不同的文件格式,就需要不同的CMultiDocTemplate 。它的第一个参数,表示此文件类型所使用的资源,如ICON,MENU和字符串资源。字符串资源用以完整描述文件类型。这可以在程序中获得,通过调用CDocTemplate::GetDocString。
RUNTIME_CLASS是一个宏,返回传递来的类中的CRuntimeClass静态对象。因此,每当使用者打开一份文件,Document template就能根据此创建三个对象,打开并显示相应文件。
因此在CMyWinApp的InitInstance中首先new了一个CMultiDocTemplate 对象,它用于管理Document,view和Frame窗口。
LoadFrame用于产生主窗口并加载菜单,同时制定窗口标题、文件标题、扩展名等。LoadFrame内部将调用Create,后者将调用CreateWindowEx,触发WM_CREATE消息。
一份Document可以映射给多个View显示,使用者对Document的任何操作都必须通过Document Frame窗口,消息随后传到CView。
构建主窗口有两个步骤,首先new一个CMDIFrameWnd对象,然后调用其LoadFrame函数,在此函数内会调用Create函数