《VC++深入详解》学习笔记 第三章 MFC框架程序剖析
(周顾徘徊无觅处,今日方知我是我)
工程的开始
以Test工程进行测试
1、CTestApp的全局变量定义(全局变量在程序开始前预编译?)
2、CTestApp构造函数
3、WinMain函数(特殊封装的函数见下文)
4、MFC框架的窗口类的的设计已经预制完成,根据需求选择,通过AfxEndDeferRegisterClass完成设计,AfxEndDeferRegisterClass的调用通过CMainFrame调用PreCreatWindow调用CFarmeWnd中的PreCreateWindow调用其中的AfxDeferRegisterClass(该函数是AfxEndDeferRegisterClass宏定义)从而开始注册
5、制作完成的框架设计通过AfxEndDeferRegisterClass中调用的AfxRegisterClass进行注册
6、CMainFrame继承CFrameWnd继承CWnd,调用CWnd的CreateEx创建窗口
7、CTestApp中的m_pMainWnd(Cwnd类型)指向应用程序窗口框架,在InitInstance中通过其实现框架窗口的显示和刷新
8、位于CWinThread定义的Run函数实现消息循环,当接收到WM_QUIT消息是退出,其中的PumpMessage为消息处理代码
以上一个Test工程的基本流程,另外补充一些功能函数
WinMain的特殊封装
微软将MFC底层框架进行封装,工程开始时所经过的步骤如下
1)MFC中将 wWinMain 宏定义为 _tWinMain (Unicode编码格式中为wWinMain,而ANSI编码格式中为常见的WinMain;前者支持中文)
2)工程和WinMain建立联系方式是通过 this 指针。
3)在执行WinMain之前,通过全局变量形式执行了CTestApp的构造函数。而CTestApp的父类CWinApp会先一步被构造,在其构造过程中将this对象指向CTestApp即我们工程对象
4)上述步骤是在WinMain执行之前发生,所以在执行WinMain后此时的this已经指向工程对象
5)WinMain通过AfxWinMain来实现其功能
6)AfxWinMain函数内容大致分为两块:指针的定向以及工程构建
7)指针定向:声明CWinThread和CWinApp的类型指针分别指向AfxGetThread和AfxGetApp,通过AfxGetThred返回值为AfxGetApp的结果,从而使两者指针一致
8)工程构建:CWinApp的类型指针调用InitApplication完成MFC内部管理工作
CWinThread的类型指针调用InitInstance函数, CWinThread中的InitInstance函数是虚函数被CWinApp所重写,从而继续框架搭建工作。
CWinThread的类型指针调用Run函数,进入消息循环
窗口过程函数
通过AfxEndDeferRegisterClass中的DefWindowProc进行设置(默认设计,MFC采用消息映射机制处理消息
消息映射机制
所谓消息映射机制的根本在与消息映射表,消息映射表就是在接收和处理消息的类中定义一个消息和消息函数静态对照表(消息函数处理指针)
当出现新消息,搜寻该表就能处理该消息,具体步骤如下:
DefWindowProc函数调用OnwndMsg函数,而OnwndMsg函数首先搜寻子类头文件中的定义,其次子类源文件中的消息映射宏,最后触发响应函数
当在子类搜索不到时就进入基类寻找
一些其他类说明
视图类:CTestView (视类窗口是框架窗口的一个子类,其中留白部分)
文档类:CTestDoc
;文档/视结构进行处理数据和显示
帮助类:CAboutDlg
窗口类、窗口类对象、窗口
窗口类实例化:窗口类对象
窗口类对象创建窗口,得到该窗口的句柄,从而操控?窗口
窗口关闭时,对象中句柄清空
对象销毁时,其析构函数关闭窗口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具