MFC框架程序剖析

原创 2016年09月02日 21:04:24

本文将剖析基于MFC的框架程序,探讨MFC框架程序的内部组织结构,MFC是微软为了简化程序员的开发工作而设计的一套c++类集合,利用这些类有

效地帮助程序员完成windows应用程序开发。


代码结构


我们利用VS2008 IDE创建一个名为Test的工程,程序类型选择为单文档,其他默认不变,最终会生成一套代码,这套代码可以直接运行。在生成的单

文档应用程序中,都有五个类,部分类名和工程名相关联。图1展示了IDE向导生成的代码结构示意图以及对应的类功能。


                                                                                       图1 代码结构


在MFC程序有且仅有一个从应用程序类(CWinApp)派生的类,而且仅有一个该派生类的实例化对象;我们发现该程序中确实存在一个theApp的全局变

量,该全局变量就代表了这个应用程序本身;win32和MFC应用程序实例表示区别如下:


知识点:

        1.Afx前缀的函数代表应用程序框架(Application Framework)函数,属于全局函数,它们可以在程序的任何地方被调用

        2.以域作用符“::”开始的表示的函数,表明该函数是一个全局函数。

         

MFC运行流程


现在直接给出MFC程序执行顺序,但着重分析其运行机制和功能分析,其流程是“theApp全局对象定义->TestApp构造函数->WinMain函数”。在执行

theApp对象的构造函数之前先执行CWinApp基类的构造函数,从而把我们自己创建的类和MFC类相关联起来了。


流程详解:


1.全局变量定义程序入口函数WinMain加载时,系统先为全局对象分配内存空间,从而利用theApp完成应用程序的启动。

2.创建对象时会调用对象的构造函数;theApp是子类CTestApp是实例对象,子类继承于CWinApp,因此会先调用基类的构造函数,再调用子类的构造

函数,从而完成应用程序的初始化工作,例如基类中保存theApp的this指针。

3.进入WinMain函数;在AfxWinMain函数中可以获取子类的this指针,利用此指针调用InitApplication、InitInstance、Run等函数,从而完成窗口类的注

册,创建,消息循环、显示,更新。

4.进入消息循环,响应各种消息,直到退出;MFC程序实际上是采用消息映射机制,来完成各种消息的处理,收到WM_QUIT消息时,退出消息循环。



                                                                                      图2 MFC 运行流程示意图

代码跟踪


下面将给出MFC运行过程的代码跟踪,主要列出MFC框架涉及到的主要函数以及所在的文件名,具体的代码流程可以自行debug跟踪,并利用调用栈

完成函数跟踪。细致函数跟踪和分析,这不详细给出,代码跟踪,如图3所示。

相关的源码文件位置是:...\VC\atlmfc\src\mfc;                         

          图3 代码跟踪


文档/视类结构


我们创建的MFC程序除了主框架窗口外,还有一个窗口就是视类窗口,对应的是CView类。框架窗口是视类窗口的一个父窗口,它们的关系如图4.红色包围的是主框架窗口,蓝色包围的是视窗口


      图4 主框架和视窗口的关系


微软在设计基础类库时,采用数据存储和数据显示分离的模式,数据存储由CDocument类完成,数据显示和修改由CView类完成。在CTestApp的

Initstance方法中定义一个单文档模板对象指针,该对象就把文档类对象、框架类对象、视窗类对象有机地组织在一起,接着利用AddDocTemplate函数

把这个单文档模板添加到文档模板中,从而把这个三个类组织成为一个整体,源码如下:

    LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CTestDoc),
		RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
		RUNTIME_CLASS(CTestView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

窗口类、窗口类对象和窗口


C++窗口类对象和窗口并不是一回事,它们之间唯一的关系式C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个c++窗口

类对象相关的那个窗口句柄。窗口销毁时,与之对应的c++窗口类对象销毁与否,要看其生命周期是否结束。但是c++窗口类对象销

毁时,与之关联的窗口也将销毁。


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

MFC框架的一种理解方法

MFC的水很深,如果你想搞清楚所有的的细枝末节,恐怕我这里就帮不到你了,需要看侯捷的《深入浅出MFC》之类的书籍,一般而言,我们没必要知道所有的底层技术,但是知道一点基本的框架,对于编程还是很有用的。...
  • q__y__L
  • q__y__L
  • 2016年04月27日 00:25
  • 2266

MFC框架机制详解

MFC框架机制详解
  • zt_xcyk
  • zt_xcyk
  • 2017年05月25日 20:04
  • 341

MFC类别框架图完整的图

  • 2008年11月24日 18:57
  • 86KB
  • 下载

MFC框架

MFC 就把有着相当固定行为之 WinMain 内部动作包装在 CWinApp 中,把有着相当固定行为之 WndProc 内部动作包装在 CFrameWnd 中。也就是说:     CWinApp ...
  • pud_zha
  • pud_zha
  • 2012年12月19日 01:11
  • 2804

MFC代码架构分析

MFC是微软提供给我们的基础类库,是一套面向对象的函数库,以类的方式提供给我们使用。 利用这些类,可以有效地帮助我们完成基于Windows的应用程序的开发。 里面同样有很多全局函数用于类之间的操作调用...
  • Jarily
  • Jarily
  • 2014年03月09日 14:37
  • 2807

MFC编程框架总结

MFC是一种C++类库,利用面向对象的方法封装了Windows API,为Windows应用程序的开发带来了极大便利。本文总结了使用MFC进行编程的基本方法,编程环境为VS2008 SP1。...
  • u014474185
  • u014474185
  • 2016年11月15日 21:23
  • 639

Windows-MFC框架程序剖析

MFC框架程序剖析 1.MFC Microsoft Foundation Class,微软基础类库,是微软开发的C++集合,方便我们使用它来编写Windows程序。 下面是4个基本的类,我们的V...
  • qq_22075977
  • qq_22075977
  • 2016年04月22日 16:56
  • 3027

深入理解MFC中程序框架

新建一个Example单文档工程,应用向导可以自动地生成MFC应用的各个C++类。 1. 应用类及全局对象(CExampleApp) theApp 是唯一一个在程序形成的时候就存在的全局变量,C...
  • liulianglin
  • liulianglin
  • 2014年01月09日 16:49
  • 1299

MFC的程序框架剖析

  • 2015年03月05日 09:53
  • 33KB
  • 下载

三、MFC框架结构简介

1.   利用应用程序向导创建MFC框架程序:        a. AppWizard是一个生成基础源代码的向导工具;        b. 可以利用AppWizard生成一个具有MFC基本框架的源代码...
  • u011767511
  • u011767511
  • 2013年10月25日 23:09
  • 1622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC框架程序剖析
举报原因:
原因补充:

(最多只允许输入30个字)