新建一个Example单文档工程,应用向导可以自动地生成MFC应用的各个C++类。

1. 应用类及全局对象(CExampleApp)
theApp 是唯一一个在程序形成的时候就存在的全局变量,CExampleApp类继承于CwinApp类,MSDN中CwinApp的继承关系如下

从继承关系当中,我们发现theApp是作为程序的实体而存在的,是单文档程序的核心。应用类封装了Windows应用的初始化,运行以及终止的全过程。对于每一个基于框架的应用,它必须有一个且只能有一个派生于CWinApp的类对象。这个对象是全局对象,因此它在创建任何窗口前首先被构造。类CWinApp提供了几个关键的可重载的虚成员函数,他们是InitInstance,Run,ExitInstance以及OnIdle等。而且,在程序中可以随时调用全局函数AfxGetApp,以便获得CWinApp类对象的指针。BOOL CExampleApp ::InitInstance()这个函数,包含了单文档程序中重要的信息,特别要提到的是一下的一段代码:

2. CMainFrame类

框架类表示应用程序的主框架窗口,其主要作用是响应标准的窗口消息,不过,它通常先将消息按照一定的次序传递给视图类以及文档类等其他命令处理类,另外,它还为视图类提供可视化的边框,同时也包括标题栏,一些标准的窗口组件等。Cmianframe的继承关系如下:

3.视图类(CExampleView)
该类占有框架窗口的客户区,主要负责显示文档数据,也为文档对象和用户之间提供了用以交互的可视接口,另外,也完成了与文档打印相关的操作,通常,一般的绘制操作都是在该类中完成,因此有时也称视图类窗口为“绘制窗口”。

要注意的有几点,第一,因为mianfram是没有视图的,因此如果在mainframe相应Onpaint消息,自然是可以响应这个消息的,但是在绘制当中如何也不会出现预想的绘制内容,为什么呢? 嘿嘿,可以想象一下你在一个word程序里面,当你关闭了所有的白板(视图)的时候,你会发现你已经无法在编写文字,道理是一样的,在mainframe里面进行绘制,程序是没有问题,但是绘制的内容是在灰色上面,windows不予显示的。
第二点你可以发现在对菜单,和工具条的单击消息进行相应的时候你可以将消息响应函数添加到cmainframe也没有将消息响应函数调价到cview当中,但是你会惊奇的发现,两者只在一个地方相应的时候,消息响应函数没有问题都能正确的执行,但是如果同时对一个按钮或者菜单进行单击消息响应的时候,你会发现windows会执行的Cview里面的消息响应函数。具体消息路径会在下面叙述。

5.“关于”对话框类(CAboutDlg)
该类封装了用于显示软件版本,版权等相关信息的“关于”对话框,通常不需要对它进行任何的编程。而只需要使用对话框资源编辑器对对话框模板进行简单的编辑即可。

6. 其他说明:
1) 消息路径如下:
在SDI(单文档)界面中,菜单响应遵循这样一个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函数,而是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调用CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调用CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没有,返回到CApp类中寻找。如果在CApp类中也没有找到,表示没有该菜单的响应函数。
2) 主框架(CFrameWnd)中访问视图(CView):
CView* GetActiveView() const;
通常定义的视图为CView的派生类,在调用自定义视图对象的方法时
应该这样写:((CMouseKeyView*)GetActiveView())->MyFunc();
3)主框架(CFrameWnd)中访问文档(CDocument):
       GetActiveDocument,返回CDocument对象;
4)在视图(CView)中访问文档(CDocument):
inline CMouseKeyDoc* CMouseKeyView::GetDocument() {return (CMouseKeyDoc*)m_pDocument;}
5)在视图(CView)中访问框架(CFrameWnd)
CFrameWnd* GetParentFrame() const;
6)在文档(CDocument)中访问框架(CFrameWnd)
CWnd* AfxGetMainWnd();
CWnd* AfxGetApp()->m_pMainWnd;
7)在文档(CDocument)中访问视图(CView)
UpdateAllViews
功能:通知所有的视图文档已被修改的信息
原型:
void UpdateAllViews(
CView* pSender, // 要更新的视图指针,如果希望更新所有视图,将此参数设为NULL
LPARAM lHint=0L, // 包含更改消息的通知
CObject* pHint=NULL // 保管更改消息的对象
     )
8)在其他类中访问文档类(CDocument)
CDocument* GetDocument()
{
CFrameWnd* frm=(CFrameWnd*)::AfxGetMainWnd();
ASSERT(frm);
CDocument* pDoc=frm->GetActiveDocument();
ASSERT(pDoc);
ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc)));
return (CMouseKeyDoc*)pDoc;
}
7.MFC程序流程小结
1)Windows将用户程序装入内存
2)构造全局对象theApp,在程序被装入时,所有全局对象都会立刻被创建。
3)Windows调用全局函数WinMain,它是类库的惟一实例
4)WinMain里面只调用函数AfxWinMain
5)AfxWinMain执行AfxWininit,调用AfxinitThred,接着
6)AfxWinMain执行InitApplication,然后执行Initinstance,Initinstance是CWinApp的虚函数,在此改写。
7)InitInstance函数里面启动文档的装入以及主要框架和视图显示处理过程。
8)在这里new 一个CMyFrameWnd ,CMyFrameWnd构造函数调用Create产生主窗口
9)InitInstance 执行ShowWindow,UpdateWindow,发出WM_PAINT
10)WinMain调用theApp的Run函数,它启动窗口消息和命令消息的传递处理过程。
11)单击file/close,则发出WM_CLOSE
12)CMainFrame交默认处理
13)调用::DestroyWindow发出WM_DESTROY
14)默认处理调用::postQuitMessage 发出WM_QUIT
15)CWinapp::Run收到WM_QUIT结束内部循环,调用ExitInsance(若CCExcmpleApp改写 Exitinstance,则调用CCExcmpleApp::ExitInstance;
16)ExitInstance函数负责完成应用程序结束之前的清除工作。
17)ExitInstance函数返回时,Run函数也返回了,MFC完成了一些清除工作,Windows终止应用程序
18)回到AfxWinMain,执行AfxWinTerm,程序结束!!

MFC中单文档程序框架相关推荐

  1. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  2. 【整理】MFC单文档程序窗口大小的设置

    有时候根据实际需要,比如MFC单文档程序视图里内容少.空白一大半,需要调整MFC单文档程序窗口大小.限制单文档的最大最小尺寸. 1.  要控制一个框架的的最大最小尺寸,需要做两件事情,在CFrameW ...

  3. MFC单文档程序响应菜单消息的顺序

    在MFC中,新建一个单文档应用程序,将生成四个类: 在消息传递过程中,一般对于单文档类来说,对菜单的响应顺序是View类 --- Doc类---- MainFrame----- App: 新建一个单文 ...

  4. MFC单文档程序加载web网站和html文件

    使用CHtmlView类,CHtmlView类的主要功能是访问Web网站和HTML文档:该类可说是对webbrowser控件的封装: 新建一个单文档项目:选择 CHtmlView 类作为视类的基类:项 ...

  5. VC mfc 多文档程序更改子文档标题名

    VC++新建一个多文档MDI工程:输入工程名,mditest1:其他全部默认:生成项目,运行了看一下,如下: 现在要更改子文档标题:进入类向导,按下图,找到文档类的OnNewDocument函数,进入 ...

  6. VC6.0中单文档程序窗口最大化运行的方法

    在VC6.0开发时,有时候需要程序一打开时窗口就以最大化的方式运行.最简单的方法是在C****App::InitInstance()函数中的if (!ProcessShellCommand(cmdIn ...

  7. 用MFC单文档改写ARToolKit5.4的例子simpleLite

    RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下: 1.开发环境 Win10,VS2017,ARToolkit5.4 2.新建MFC单文档程序Test 在类向导中,为CTest ...

  8. MFC单文档框架编程(二): SDI框架下的消息处理

    MFC单文档框架编程(一) ...................................................................................... ...

  9. MFC让文档/视图结构程序支持滚动条

    MFC让文档/视图结构程序支持滚动条 2009-06-30 09:26要通过滚动条显示文档,还必须知道文档滚动到了什么位置:一旦用户拖动滚动条时要告诉视图改变在文档中 的位置.所有这些,由MFC的CS ...

最新文章

  1. 【TP5.0】tp5.0实现连接多个数据库,实现类似3.2M(‘table’,'prefix_','db_config2')的CURD操作...
  2. C#抽象类和抽象方法的特征和用途
  3. Web安全之XSS漏洞
  4. 数据库设计范式实例解析
  5. C语言实现Graph图的算法(附完整源码)
  6. erlang mysql连接超时_Erlang数据库-(一)Erlang与Mysql的连接
  7. 5年财务老员工:早发现这个报表工具,也不会因为加班凄凉辞职
  8. 深度比较Map的遍历
  9. 蚂蚁金服自主研发的三地五中心异地多活解决方案获金融科技创新大奖
  10. 【Https】Spring RestTemplete支持Https安全请求
  11. html怎么设置用户登录界面设计,html怎么做用户登录界面设计步骤,登录界面设计这样做?...
  12. linux添加字体库
  13. coq学习3-形式化证明的直观理解
  14. 【转】图解领带的打法10种
  15. centos7升级python,yum出现问题“ImportError: No module named urlgrabber.grabber”
  16. windows服务简介
  17. 杂记-Macbook Pro M1芯片能玩深度学习吗?
  18. HCIA网工数通Datacom之网工初级
  19. C++读取歌词(lrc)文件,分解歌词时间标签和歌词文本的方法
  20. css单位-vh/vw

热门文章

  1. 【历史上的今天】8 月 8 日:中国第一个校园 BBS 成立;网景通信上市;EarthLink 创始人出生
  2. cmd中连接雷电模拟器时报错adb device not found
  3. (纪录片)数学的故事 The Story of Maths (2008)
  4. 单点登录(SSO)解决方案介绍
  5. 社区服务器目录迁移实际开发运用
  6. Elasticsearch:时间点 API
  7. 关于 __dirname和__filename介绍以及使用场景
  8. Android 实现一个计时器
  9. Object.assign()用法小结
  10. 计算机三级网络技术 2019.3考试