本文将剖析基于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函数

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

  1. LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU)

  2. // 注册应用程序的文档模板。文档模板

  3. // 将用作文档、框架窗口和视图之间的连接

  4. CSingleDocTemplate* pDocTemplate;

  5. pDocTemplate = new CSingleDocTemplate(

  6. IDR_MAINFRAME,

  7. RUNTIME_CLASS(CTestDoc),

  8. RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口

  9. RUNTIME_CLASS(CTestView));

  10. if (!pDocTemplate)

  11. return FALSE;

  12. AddDocTemplate(pDocTemplate);

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

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

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

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

MFC的框架程序分析3相关推荐

  1. 使用 MFC 编写打印程序

    摘要 本文首先介绍了利用MFC提供的文档视图框架来实现一个打印程序,实现打印预览,在此基础上,同时通过对MFC源代码的深入探讨,提出了利用该方法在对话框上用MFC实现打印功能,结果表明,利用MFC实现 ...

  2. RPC调用框架比较分析--转载

    原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90 什么是RPC:  RPC(Remote P ...

  3. RPC调用框架比较分析

    什么是RPC: RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC ...

  4. 关于 IR 在程序分析和优化中应用的一些思考

    作者 | 李彬 整理 | 编程语言 Lab 李彬,编程语言 Lab 程序分析应用专家,南京大学计算机系博士.研究领域是程序分析及验证. 本文以技术文章的方式回顾李老师在 SIG-程序分析 技术沙龙上的 ...

  5. 游戏服务器框架概括分析

    游戏服务器框架概括分析 关注公众号 风色年代(itfantasycc) 500G游戏开发资料随便拿! 这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章, ...

  6. Mini2440触摸屏程序分析

    mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...

  7. 【翻译】Tricorder-谷歌如何建立程序分析的生态系统

    I. 介绍II. 背景A. 开发流程B. 谷歌的程序分析III. 谷歌程序分析理念A. 0误报率B. 授权用户做出贡献C. 改进数据驱动的可用性D. 工作流集成是关键E. 项目级别定制,而不是用户定制 ...

  8. ZK框架的分析与应用

    ZK框架的分析与应用 1 ZK框架的引入 1.1 概述 ZK是一套以 AJAX/XUL/Java 为基础的网页应用程序开发框架,用于丰富网页应用程序的使用界面.最大的好处是,在设计AJAX网络应用程序 ...

  9. 软件 2.0 时代的程序分析

    作者 | 张昕 整理 | 晴天 作者经历: 2020.9 – 现在,北京大学计算机系助理教授 2017.9 – 2020.8,美国麻省理工学院计算机与人工智能实验室博士后 2017,博士,美国佐治亚理 ...

最新文章

  1. gis中的擦除_擦除—帮助 | ArcGIS for Desktop
  2. php删除数组中指定值的元素
  3. ⚡关于Eastmount博客「网络安全自学篇」系列重要通知!!!⚡
  4. MathType可以编辑省略号吗
  5. oracle导出pdm文件命令,利用PowerDesigner逆向工程导出PDM模型及生成文档
  6. poj 1466 Girls and Boys (最大独立集)
  7. Smack 4.3.2 发布,XMPP(jabber) 的 Java 客户端类库
  8. idea 未实现接口红线提示,重复代码波浪线提示,自动换行,控制台输出内容自动换行...
  9. 数据挖掘项目实战—Kaggle入门竞赛:房价预测之EDA与特征工程
  10. android大智慧安装目录,大智慧数据文件目录解读
  11. 居家短期任务赚钱好不好做容易学习吗?
  12. 华为认证报名费是多少?如何准备华为HCIP网络工程师考试?
  13. 计算机及软件工程专业基础综合,2017年东华大学854计算机及软件工程专业基础综合硕士研究生入学考试大纲...
  14. 首次 LFS 搭建全过程
  15. Apple Store教育优惠(161103)
  16. 舒老师的hu测(日常吐槽)
  17. JSON在线格式化,美化
  18. CRM的“几宗秘辛”(上篇)
  19. 没有时间进行测试? —有关在Python中对AWS Lambda进行单元测试的12条建议
  20. 栈和队列的定义、特点和用途

热门文章

  1. 验证回文串Python解法
  2. 0-1背包问题(C语言)
  3. datagridview滚动条自动滚动_微软新贡献:进一步优化Chromium的滚动特性
  4. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
  5. spark用scala读取hive表数据(不同版本区别)
  6. linux 隐藏脚本运行,linux – 为什么在运行ls时隐藏此文件?
  7. linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...
  8. 如何判断三极管好坏?
  9. Java加个书名编号约束条件_java 按照题目所给变量名称、类型和方法名称进行编程 求帮助...
  10. windows7下darknet配置yolov3训练及测试完整教程