当前位置: 首页 > news >正文

MFC仿真

MFC仿真

本文是《深入浅出MFC》第三章的读书笔记。

MFC类阶层

在这里插入图片描述

参考书中的源代码,不难发现main函数中的pApp就是指向theApp的指针。

MFC类初始化过程

在这里插入图片描述

InitApplication负责注册窗口类动作,InitInstance负责创建窗口。通常,系统会(并且有能力)为你注册一些标准的窗口类别(当然也就准备好了一些标准的窗口函数),你(应用程序设计者)应该在你的CMyWinApp中改写InitInstance,并在其中把窗口产生出来,这样你才有机会在标准的窗口类别中指定自己的窗口标题和菜单。

因为CMyWinApp类型的全局对象的存在,先初始化该对象,再执行main函数。

//my.cppCMyWinApp theApp;int main()
{CWinApp* pApp = AfxGetApp();pApp->InitApplication(); //注册窗口类pApp->InitInstance(); //实例化窗口类pApp->Run();
}

pApp->InitApplication()调用的是CWinApp::InitApplicationpApp->InitInstance()调用的是CMyWinApp::InitInstance(因为CMyWinApp改写它了)。pApp->Run()调用的是CWinApp::Run

RTTI

运行时类型识别,在程序运期间获得某个对象的具体类型信息。

类型链表

使用一个结构体CRuntimeClass保存该类类的信息,并将该结构体作为类的一个成员。

使用DECLAER_DYNAMIC宏,我们将CRuntimeClass结构体放到类中,它执行的具体替换是定义一个类中静态的CRuntimeClass对象和声明一个获取该对象执政的虚函数。

使用IMPLEMENT_DYNAMIC宏,我们将CRuntimeClass结构体初始化并串联成链表。在该宏中,我们又使用了_IMPLEMENT_RUNTIMECLASS宏,该宏用于初始化CRuntimeClass。在该宏中,我们使用RUNTIME_CLASS宏生获取当前类的CRuntiemClass对象,AFX_CLASSINIT用于将新的类串联进链表中。

所有类的基类:CObject不能使用DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏,应该手动初始化CRunTimeClass结构体并加入链表中。

在这里插入图片描述

IsKindOf

使用类型链表,我们可以定义一个函数判断一个类的类型。

在CObject中加上一个IsKindOf函数,使用该函数从参数传递的类开始,沿着父类CRunTimeClass的指针逐步判断。

动态生成

在程序执行期间,根据动态获得一个类的名称,要求程序产生一个对象。

有动态生成(Dynamic Creation)能力的类别库,必然亦拥有执行时期类型识别(RTTI)能力,因为_DYNCREATE 宏涵盖了_DYNAMIC宏。

在CRuntimeClass中使用函数指针指向一个类的成员函数,该成员函数返回一个该类的对象。CRuntimeClass中还有两个函数,一个用于调用函数指针,一个用于动态获得类型的名称,在链表中寻找该类的节点,找到后返回之。

永续生存机制(序列化)

把对象保存到文件中。把资料写到文件,很简单。在Document/View 架构中,资料都放在一份document(文件)里头,我们只要把其中的成员变量依续写进文件即可。成员变量很可能是个对象,而面对对象,我们首先应该记载其类别名称,然后才是对象中的资料。

DECLARE_SERIAL、IMPLEMENT_SERIAL宏用于重载>>操作符。

在CRuntimeClass中定义Store和Load函数,用于处理对象读写时的琐屑的工作。

消息映射

通过把消息和对应的消息处理函数封装在一起,并把这种结构体串联起来构成消息映射。

命令绕行

MFC中的命令绕行(Command Routing) 是一种让多个对象有机会处理同一命令消息(如菜单项或工具栏按钮触发)的机制。

当用户触发一个命令(比如点击菜单项),产生的 WM_COMMAND 消息不会仅由接收到它的最初窗口处理。MFC框架会按预定的顺序将这个消息传递给一系列相关的对象,直到找到能处理它的对象为止。

一个典型的单文档程序命令绕行顺序是:

  1. 当前活动的视图(Active View)
  2. 与视图关联的文档(Document)
  3. 文档所属的文档模板(Document Template)
  4. 主框架窗口(Main Frame Window)
  5. 应用程序对象(Application Object)

这种设计的好处是,你可以将命令处理逻辑放在最合适的对象里。例如,一个“保存”命令的处理函数放在文档类中就很自然,而“关于”对话框的打开命令则更适合放在应用程序类中处理。

简单来说,命令绕行就是MFC为了让命令消息找到“最合适”的处理者而设计的一套传递规则。
的处理函数放在文档类中就很自然,而“关于”对话框的打开命令则更适合放在应用程序类中处理。

简单来说,命令绕行就是MFC为了让命令消息找到“最合适”的处理者而设计的一套传递规则。


文章转载自:

http://fXWSIhab.bhkLt.cn
http://UXpKjJtW.bhkLt.cn
http://q1Sy8ht8.bhkLt.cn
http://FS7GxxDW.bhkLt.cn
http://ANqCBbZx.bhkLt.cn
http://A6cn1fX3.bhkLt.cn
http://t4SJMV3n.bhkLt.cn
http://Aptua1Df.bhkLt.cn
http://ZDkYH0qo.bhkLt.cn
http://257UQhq1.bhkLt.cn
http://WzriIpHK.bhkLt.cn
http://gHMVdcX1.bhkLt.cn
http://dRUNjr7N.bhkLt.cn
http://Us1Ak994.bhkLt.cn
http://haI0BPAz.bhkLt.cn
http://9C9zZfod.bhkLt.cn
http://Jpna53cE.bhkLt.cn
http://z1ZFxxRB.bhkLt.cn
http://4fhbhkXG.bhkLt.cn
http://mf3oI9OW.bhkLt.cn
http://uNq6vWsP.bhkLt.cn
http://ph88Xnd5.bhkLt.cn
http://VrmbWDOQ.bhkLt.cn
http://P6lx2lCG.bhkLt.cn
http://jxg7R4Vl.bhkLt.cn
http://ekp9g6zt.bhkLt.cn
http://UwPpzsLV.bhkLt.cn
http://UvFsHU1m.bhkLt.cn
http://vLYrZwEw.bhkLt.cn
http://4nQmiO3A.bhkLt.cn
http://www.dtcms.com/a/383727.html

相关文章:

  • Leetcode 19 java
  • Vue3 响应式核心 API
  • linux故障排查
  • 为什么哈希表能 O(1) 查找?——C++ 哈希基础入门
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • 算法——递推求解
  • stm32之点灯
  • Qt---内存管理 对象树(Object Tree)机制
  • 人工智能通识与实践 - 计算机视觉技术
  • GAMES101:现代计算机图形学入门(Chapter1 计算机图形学概述)学习笔记
  • MATLAB 常用函数汇总大全和高级应用总结
  • Knockout.js 任务调度模块详解
  • LeetCode 2414.最长的字母续连续子字符串的长度
  • 当环保遇上大数据:生态环境大数据技术专业的课程侧重哪些领域?
  • 【Ansible】使用角色和Ansible内容集合简化Playbook知识点
  • init / record / required:让 C# 对象一次成型
  • BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)
  • 树莓派操作第一章常用指令
  • Altium Designer(AD24)工作面板的切换与定制
  • 【WebSocket✨】入门之旅(七):WebSocket 的未来发展趋势
  • MySQL——库的操作
  • Redis缓存的常见问题及其解决方案
  • Conda 安装 CUDA Toolkit 解决 nvcc 找不到的问题
  • (二)Django框架常用配置
  • Android开发-数据库SQLite
  • (附源码)基于springboot的幼儿园管理系统
  • 【从零到公网】本地电脑部署服务并实现公网访问(IPv4/IPv6/DDNS 全攻略)
  • VTK基础(01):VTK中的基本概念
  • Sentinel:微服务架构下的高可用流量防卫兵
  • Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)