news 2026/7/1 23:01:06

MFC运行原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MFC运行原理

窗口的生命周期

程序的诞生:
■ Application object 产生,内存于是获得配置,初值亦设立了。
■ Afx WinMain 执行AfxWinInit,后者又调用AfxInitThread,把消息队列尽量加大到
96。
■ Afx WinMain 执行InitApplication。这是CWinApp 的虚拟函数,但我们通常不改
写它。
■ AfxWinMain 执行InitInstance。这是CWinApp 的虚拟函数,我们必须改写它
■ CMyWinApp::InitInstance 'new' 了一个CMyFrameWnd 对象。
■ CMyFrameWnd 构造式调用Create,产生主窗口。我们在Create 参数中指定的
窗口类别是NULL, 于是MFC 根据窗口种类, 自行为我们注册一个名为
"AfxFrameOrView42d" 的窗口类别。
■ 回到InitInstance 中继续执行ShowWindow,显示窗口。
■ 执行UpdateWindow,于是发出WM_PAINT。
■ 回到AfxWinMain,执行Run,进入消息循环。

程序开始运作:
■ 程序获得WM_PAINT 消息(藉由CWinApp::Run 中的::GetMessage 循环)。
■ WM_PAINT 经由::DispatchMessage 送到窗口函数CWnd::DefWindowProc 中。

■ CWnd::DefWindowProc 将消息绕行过消息映射表格(Message Map)。
■ 绕行过程中发现有吻合项目,于是调用项目中对应的函数。此函数是应用程序
利用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间的宏设立起来的。
■ 标准消息的处理例程亦有标准命名,例如WM_PAINT 必然由OnPaint 处理。

程序的死亡:
■ 使用者选按【File/Close】,于是发出WM_CLOSE。
■ CMyFrameWnd 并没有设置WM_CLOSE 处理例程,于是交给预设之处理例程。
■ 预设函数对于WM_CLOSE 的处理方式是调用::DestroyWindow, 并因而发出
WM_DESTROY。
■ 预设之WM_DESTROY 处理方式是调用::PostQuitMessage,因此发出WM_QUIT。
■ CWinApp::Run 收到WM_QUIT 后会结束其内部之消息循环, 然后调用
ExitInstance,这是CWinApp 的一个虚拟函数。
■ 如果CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所调用的就是
CMyWinApp::ExitInstance,否则就是CWinApp::ExitInstance。
■ 最后回到AfxWinMain,执行AfxWinTerm,结束程序。

窗口的产生

CMyWinApp::InitInstance -> new CMyFrameWnd() -> Create() -> CreateEx() -> PreCreateWindow() -> AfxDeferRegisterClass() {注册窗口类、设置窗口}

窗口的显示和更新

CMyWinApp::InitInstance -> new CMyFrameWnd() -> Create() -> CreateEx() -> PreCreateWindow() -> AfxDeferRegisterClass()-> ShowWindow() -> UpdateWindow()

窗口的运行

CMyWinApp::InitInstance -> new CMyFrameWnd() -> Create() -> CreateEx() -> PreCreateWindow() -> AfxDeferRegisterClass() -> ShowWindow() -> UpdateWindow()->

Run() { 进入消息循环处理,直到退出 }


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 1:11:44

柠檬 软件测试之python全栈自动化测试工程师第25期

在自动化测试领域,我们常常将接口自动化和 UI 自动化视为两个独立的“山头”。接口测试团队负责后端逻辑的验证,快而准;UI 测试团队负责用户流程的验证,直观但脆弱。然而,随着业务复杂度的提升,这种“各扫门…

作者头像 李华
网站建设 2026/7/1 18:21:58

基于php的微信小程序的学习交流平台系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦学习交流场景的数字化需求,设计实现一套基于PHP后端与微信小程序前端的学习交流平台系统。随着移动学习热潮兴起,微信小程序凭借无需安装、触达便捷的优势,成为搭建轻量化学习场景的理想载体,而PHP语言成熟稳定…

作者头像 李华
网站建设 2026/6/26 14:03:37

springboot高校读书分享系统的设计与实现_34ur7fyk-

目录 已开发项目效果实现截图已开发项目效果实现截图开发技术系统开发工具: 核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底…

作者头像 李华
网站建设 2026/6/30 4:53:43

如何快速解锁RouterOS无限权限:MikroTikPatch的终极指南

想要免费体验RouterOS的全部高级功能吗?MikroTikPatch项目为你提供了一套完整的RouterOS权限解锁解决方案,支持x86、ARM和MIPS多种硬件架构,让网络管理员能够轻松管理设备权限和功能扩展。这个开源工具通过智能化的密钥生成和系统补丁&#x…

作者头像 李华
网站建设 2026/7/1 17:31:04

测试工程师的增值型职业休假策略:从技术深耕到跨界突破

重新定义职业休憩期 2025年的科技行业正经历着人工智能与自动化测试的深度融合,传统测试岗位面临价值重构。在这样的背景下,职业休假(Sabbatical)不再是简单的休息间隔,而应成为测试工程师实现技术迭代、能力扩展和职…

作者头像 李华