当前位置: 代码迷 >> VC/MFC >> MFC中坚程序
  详细解决方案

MFC中坚程序

热度:431   发布时间:2016-05-02 03:56:45.0
MFC骨干程序

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两个宏,宏中间夹带的就是“消息与函数对应关系”的一笔笔记录。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案