1. 仿真MFC目的:以MFC为例,学习application framework的内部运行。MFC六大关键技术:

  (1)MFC程序的初始化过程

  (2)RTTI(Runtime Type Information)运行时类型识别

  (3)Dynamic Creation 动态创建

  (4)Persistence 永久保存

  (5)Message Mapping 消息映射

  (6)Message Routing 消息传递(回溯)

2. MFC数个最重要的类的层次结构:

3. 以下范例展示了类层次及其成员(对于那些“除了构造函数与析构函数之外没有其他成员”的类就不展开):

注:

  (1)从上图可以看到,theApp是一个全局对象(同时也是静态对象),上一篇说过,全局对象的构造函数将更早于main。换句话说,你所看到的执行结果中的那些构造函数输出操作全都是在main函数之前完成的。main函数调用全局函数AfxGetApp以取得theApp的对象指针。这完全是仿真MFC程序的手法。

  (2)InitApplication和InitInstance是MFC的CWinApp的两个虚函数。前者负责“每一个程序只做一次”的操作,后者负责“每一个例程都得做一次”的操作。

4. RTTI(运行时类型识别):构建类别型录网与CRuntimeClass。类库的设计者一定要在类构建起来的时候,记录必要的信息,以建立型录。型录中的类信息,最好以链表方式连接起来。我们的“类别型录”的链表元素将以CRuntimeClass描述之:

  (1)CRuntimeClass内容如下:

  (2)DECLARE_DYNAMIC宏:为了神不知鬼不觉把CRuntimeClass对象塞到类之中,并声明一个可以抓到该对象地址的函数。

  (3)IMPLEMENT_DYNAMIC宏:类别型录(也就是各个CRuntimeClass对象)的内容指定以及连接工作也神不知鬼不觉加入。

注:AFX_CLASSINIT结构体,会导致在宏"IMPLEMENT_DYNAMIC"中创建一个名字为"_init_##class_name"的对象。

  (4)示范例子:

5. 动态创建:要根据一个类名称让程序产生一个对象,我们需要把类的大小记录在类别型录中,把建构函数(注意,这里并非指C++构造函数,而是指即将出现的CRuntimeClass::CreateObject)也记录在类别型录中。当程序在执行期间获得一个类名称,它就可以在“类别型录网”中找出对应的元素,然后调用其建构函数(这里并非指C++构造函数),产生出对象。

  (1)CRuntimeClass修改如下:

  (2)为了适应CRuntimeClass中新增的成员变量,我们再添两个宏:DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE.如下:

  (3)示范例子:

  (4)图示如下:

6. Persistence(永久保存)机制:MFC有一套Serialize机制,目的在于把文件名的选择、文件的开关、缓冲区的建立、数据的读写、提取运算符(>>)和插入运算符(<<)的重载、对象的动态创建等都包装起来。最主要的是执行数据的读写和对象的动态创建;动态创建如上所述,接下来便是数据的读写(本小节不对serialization进行仿真,原因在于很多东西需要仿真:CFile、CArchive、CObject、CDWordArray、CRect、CPoint、运算符重载、serialize函数……,所以,persistence机制直接使用MFC讲解,详见XXXXXX):

  (1)DECLARE_SERIAL/IMPLEMENT_SERIAL:将<<和>>两个运算符重载,还要让Serialize函数神不知鬼不觉地放入类声明之中。类之所以能够进行文件读写操作,前提是拥有动态创建的能力。如下:

  (2)为了在每一个对象被处理(读或写)之前,能够处理琐屑的工作,诸如判断是否第一次出现、记录版本号码、记录文件名等工作,CRuntimeClass需要两个函数Load和Store:

  (3)Load和Store函数实现类似如下:

  (4)为了让整个Serialization机制运气起来,我们在自定义类的时候,加上这样的宏声明,然后实现serialize函数:

7. Message Mapping(消息映射):把消息和其处理程序关联起来。是将消息于表格中的元素比较,然后调用对应的处理程序。

  (1)准备必要的数据结构:

  (2)定义DECLARE_MESSAGE_MAP:

  (3)定义宏填塞数据结构:

  (4)示范例子:

图示表示为:

注意:CObject并不属于消息传递网的一分子;(抽象基类)。CWinThread并不属于消息传递网的一分子;(多线程)。

  (5)图示消息传递网:

8. Command Routing(命令传递):命令传递提供消息横流的机会;上面消息映射表能很简单的实现消息从子类流向父类(纵向流动),但作为application framework的重要结构之一的document/view,也具有处理消息的能力,所以,我们应该提供消息横流的机会。MFC对于消息循环的规定是:

  (1)示范例子:新增成员函数:(参见《深入浅出MFC》第三章)

  (2)下图所示命令传递过程中的函数调用次序:

------------------------------------------------------------------------------------------------------------------------------------

8. MFC重要的开发工具:

9. 强大的资源编辑器:

  (1)Icon编辑器

  (2)Cursor编辑器

  (3)Bitmap编辑器

  (4)工具栏(Toolbar)编辑器

  (5)VERSIONINFO资源编辑器

  (6)字符串表格(String Table)编辑器

  (7)菜单(menu)编辑器

  (8)加速键(Accelerator)编辑器

  (9)对话框(Dialog)编辑器

------------------------------------------------------------------------------------------------------------------------------------

10. 什么是Application Framework?

11. Microsoft Foundation Classes(MFC):

12. 纵览MFC:

13. Windows API classes:

14. Application framework classes:

15. AFX全局函数:

16. MFC宏(macros):

17. MFC数据类型(data types)——定义于WINDEF.H:

深入浅出MFC——MFC六大关键技术仿真(二)的更多相关文章

  1. MFC六大关键技术

    视频教程地址观看:http://pan.baidu.com/s/1mhKQ6kK 1.MFC六大关键技术sada)MFC程序的初始化过程:从CWinApp类派生一个应用程序类:使用派生类定义的全局变量 ...

  2. 深入浅出MFC学习笔记 第三章 MFC六大关键技术之仿真

    0:MFC类层次结构 1:MFC程序的初始化过程CWinApp::InitApplication()CMyWinApp::InitInstance()CMyFrameWnd::CMyFrameWnd( ...

  3. 剖析MFC六大关键技术(五六)--消息映射与命令传递

    说到消息,在MFC中,“最熟悉的神秘”可算是消息映射,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样.特别是窗口消息及对消息的处理跟以前 ...

  4. 【设计经验】4、SERDES关键技术总结

    一.SERDES介绍 随着大数据的兴起以及信息技术的快速发展,数据传输对总线带宽的要求越来越高,并行传输技术的发展受到了时序同步困难.信号偏移严重,抗干扰能力弱以及设计复杂度高等一系列问题的阻碍.与并 ...

  5. SERDES关键技术总结

    转自https://www.cnblogs.com/liujinggang/p/10125727.html 一.SERDES介绍 随着大数据的兴起以及信息技术的快速发展,数据传输对总线带宽的要求越来越 ...

  6. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  7. MFC的六大机制

    MFC的六大机制 程序的初始化过程 运行时类型识别 动态创建 永久保存 消息映射 命令传递 运行时类型识别 MFC的运行时类型识别就是在程序运行过程中判断某个对象是否属于某个类,MFC通过为需要进行运 ...

  8. 小小知识点(二十七)20大5G关键技术

    5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(MEC). 1 网络功能虚拟 ...

  9. Windows平台下C++插件系统实现的几个关键技术问题及其解决思路

    根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题.下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路.由于我主要专注于Windows平台C++程序 ...

随机推荐

  1. 关于Unity中Cg的基本语法和使用

    Cg是类似于C语言的发展起来的图形编程语言,Cgraphics,它的很多表达式if...else...和C语言非常相像,也和C#非常相像. 由于Shader是写给显卡执行的,所以没有输出语句来调试,很 ...

  2. WFA 认证 启动 sigma_dut方法

    WFA认证需要启动sigma_dut,记录记录一下启动过程. Android O平台命令如下 adb shell svc wifi disable adb shell rmmod wlan adb s ...

  3. 飞机找不到,流量哪去了?记一次移动WAP网关导致的问题

    这几天随着客户端一个新版本发布,运维发现CDN的流量猛跌: 话说流量就是金钱,流量就是工资.领导很生气,后果很严重.没什么好说的,赶紧查!一开始怀疑服务端有问题,先受伤的总是我们,当然这也是没错的,因 ...

  4. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  5. 导入Maven项目后,Eclipse提示“Missing artifact ”类的错误

    导入Maven项目后,Eclipse提示“Missing artifact ”类的错误 标签: Maven Missing art 2016-08-15 16:05 679人阅读 评论(0) 收藏 举 ...

  6. Yii2.0 to(), toRoute(), current()区别用法

    [Url::current] - 现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) a: //获取当 ...

  7. 关于TensorFlow多种安装方式

    Tensorflow的官网其实给出了很详细的安装教程,细分包括: Pip install: Install TensorFlow on your machine, possibly upgrading ...

  8. ASP.NET C# 登陆窗体 限制用户名只输入字母 数字以及下划线

    文本框的输入限制,我们主要集中两个问题: 一.怎样限制用户名输入的长度? 答:设置txtName的属性 MaxLength="; (我们这里以10个字符为例) 二.怎样限制用户名只输入字母 ...

  9. thinkphp 3.2 多表查询 group

    分析一 $res = M('member') ->table('__MEMBER__ as a') ->join('__ORDER__ as b') ->field('a.id,b. ...

  10. 【WP8】仿QQ提示消息

    WP版的QQ提示消息的时候从顶部滑入,3秒后从顶部滑出,本文模仿该效果实现一个MessageToastManager类用于显示提示消息 思路很简单,就是动画而已,支持配置颜色和回掉 // ****** ...