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() { 进入消息循环处理,直到退出 }


工具栏和状态栏的诞生

窗口处理函数

相关推荐
m0_734571762 小时前
深入理解C++ 析构函数<一>基本概念
开发语言·c++
t-think3 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners4 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴4 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
David猪大卫5 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
广州山泉婚姻5 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
莫生灬灬5 小时前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc
浅念-5 小时前
C++ Protobuf 入门实战:基于通讯录项目吃透proto3语法与序列化
linux·服务器·网络·c++·protobuf·proto·proto3
汉克老师7 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程7 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio