说明
MFC AppWizard
(Microsoft Foundation Class,微软基础类库)
MFC
中的类都以“C
”开头。
包含:一个CMainFrame
类,一个C+工程名+App
为名字的类;一个C+工程名+Doc
为名字的类;一个C+工程名+View
为名字的类。
MFC类组织结构图。
- CWnd类是非常重要的类,它的子类有
-
- CFrameWnd
-
- CView
MFC的运行机制和封装原理
WinMain
函数是关键
-
因为全局对象
theApp
,先调用CWinApp
类的构造函数,并执行CTestApp
类的构造函数,启动应用程序; -
通过
AfxWinMain
函数实现WinMain
函数,获取子类CTestApp
的指针, 调用虚函数InitInstance
,完成应用程序方面的初始化工作,包括窗口类的注册、创建、窗口的显示和更新; -
进入消息循环,利用消息映射机制来处理各种消息(回调函数)
寻找WinMain
函数,F9设置断点
CTestApp
派生自CWinApp
(代表应用程序类)。
theApp
全局对象
每个MFC程序有且仅有一个从应用程序类派生的类,每一个MFC程序实例有且仅有一个该派生类的实例化对象,即theApp全局变量,表征了应用程序本身。CWinApp
类的构造函数完成一些初始化工作
初始化的东西很多,暂时没看完全
WinMain
函数是通过调用AfxWinMain
函数来完成的。
Afx
前缀的函数代表应用程序框架函数,有此前缀的函数都是全局函数
- AfxWinMain函数调用
AfxGetThread
和AfxGetApp
函数,分别获得CWinThread
和CWinApp
类型的指针(二者是一致的)。pThread和pApp指向CTestApp
类的对象,即theApp全局对象; - pApp首先调用
InitApplication
函数,完成MFC内部管理方面的工作;pThread调用nitInstance
函数(虚函数)还有一个pThread调用的run函数。
MFC框架窗口的设计步骤
- 设计和注册窗口类。窗口类的定义是由
AfxEndDeferRegisterClass
函数完成的。
AfxEndDeferRegisterClass
先判断窗口类的类型,然后再赋予相应类名(都是预先定义好的),调用AfxRegisterClass
注册窗口类。调用的还是RegisterClass函数,返回的是一个数值。窗口产生之前会调用的是CMainFrame类(派生自CFrameWnd,默认的两个窗口中的一个)的PreCreateWindow函数,完成的就是这个窗口类的注册。 - 创建窗口。窗口的创建是由CWnd类的CreateEx函数实现的(Ex后缀都表示可扩展性)。
CFrameWnd
类派生于CWnd
类。CWnd的 CreateEx函数不是虚函数,而 CFrameWnd也没有重写这个函数。因此 CFrameWnd类在Create函数内调用的CreateEx函数就是CWnd的CreateEx
函数。CWnd的CreateEx
函数中又调用了PreCreateWindow,为了在窗口之前再次修改窗口外观,它的参数是CREATESTRUCT
结构,其与CreateEx
函数中的CreateWindowEx
函数的参数对比可知二者完全相同。 - 显示和更新窗口。
CTestApp
-CWinApp
-CWinThread
,而m_pMainWnd的定义是在CWinThread中的。
消息循环
- CWinThread类的Run函数就是完成消息循环的。PumpMessage内部还是GetMessage那些。
窗口过程函数
- 通过消息映射机制来处理各种信息。