MFC骨干分析
所谓MFC骨干程序,指的是有AppWizard产生出来的MFC程序。MFC程序设计的第一要务是要熟记各类的层次结构,如下所示:
一 Document/View模型
在MFC中,你可以吧Document简单想做事“数据”,CDocument简单的说就是负责处理数据的类。
CDocument的另一价值在于它所搭配的一个重要的类CView,CView就是为了数据的表现而设计的。除了负责显示外,View还负责程序与使用者之间的交谈接口。使用者对数据的编辑、修改都需要仰赖窗口上的鼠标与键盘操作才得以完成,这些消息都将由View接受后再通知Document。
Document/View的价值在于,这些MFC类已经把一个应用程序所需的“数据处理与显示”的函数空壳都涉及好了,这些函数都是虚函数,所以你可以在派生类中改写它们。
二 MFC骨干分析
程序流程说明:
①-④ 流程与上一篇博客差不多。
⑤ 改写InitInstance这个虚函数。
⑥ new一个CMultiDocTemplate对象,此对象规划Document、View以及Document Frame窗口三者之关系。
⑦ new一个CMainFrame(CMDIFrameWnd-derived)对象,作为主窗口对象。
⑧ 调用LoadFrame,产生主窗口并加挂菜单等诸元素,并指定窗口标题、文件标题、文件扩展名(关键在IDR_MAINFRAME常量)。LoadFrame内部将调用Create,后者将调用CreateWindowEx,于是触发WM_CREATE消息。
⑨ 由于我们曾于CMainFrame之中拦截WM_CREATE(利用ON_WM_CREATE宏),所以WM_CREATE产生之际Framework会调用OnCreate。我们在此主窗口挂上工具栏和状态栏。
⑩ 回到InitInstance,执行ShowWindow显示窗口。
(1) InitInstance结束,回到AfxWinMain,执行Run,进入消息循环。期间的黑盒子已经在上一篇博客分析过了。
(2) 消息经由Message Routing机制,在各类的Message Map中寻求其处理程序。WM_COMMAND/ID_FILE_OPEN消息将由CWinApp::OnFileOpen函数处理。此函数有MFC提供,它在显示过【File Open】对话框后调用Serialize函数。
(3) 我们改写Serialize函数已进行我们自己的文件读写操作。
(4) WM_COMMAND/ID_APP_ABOUT消息将由OnAppAbout函数处理。
(5) OnAppAbout函数利用CDialog的性质很方便产生一个对话框。
主窗口的诞生
建构MDI主窗口,有两个步骤。第一个步骤是new一个CMDIFrameWnd对象,第二个步骤是调用LoadFrame函数。窗口产生之际会发出WM_CREATE消息,因此CMainFrame::OnCreate会被执行起来,哪里将进行工具栏和状态栏的建立工作。
工具栏和状态栏的诞生
工具栏和状态栏分别由CToolBar和CSatusBar掌管,所以我们在CMainFrame中一两个变量表示。主窗口产生之际会立刻发出WM_CREATE,我们应该利用这个实际把工具栏和状态栏建立起来。
消息映射
每一个派生自CCmdTarget的类都可以有自己的Message Map用于处理消息。首先你应该在类声明处加上DECLARE_MESSAGE_MAP宏,然后在.CPP文件中使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP两个宏,宏中间夹带的就是“消息与函数对应关系”的一笔笔记录。
版权声明:本文为博主原创文章,未经博主允许不得转载。