1. 本章主要目的:从MFC程序代码中检验出一个Windows程序原本该有的程序进入点(WinMain)、窗口类注册(RegisterClass)、窗口产生(CreateWindow)、消息循环(Message Loop)、窗口函数(Window Procedure)等等操作。抽丝剥茧,彻底理解一个MFC程序的诞生与结束,以及生命过程。
2. 熟记MFC类的层次结构:
3. CWinApp和CFrameWnd:
(1)CWinApp(AFXWIN.H中声明)——取代WinMain的地位。
注:CWinApp记录主窗口的handle(或是主窗口对应之C++对象)——m_pMainWnd已经被移往CWinThread中了(它是CWinApp的父类)(AFXWIN.H)。
(2)CFrameWnd——取代WndProc的地位:CFrameWnd主要用来掌握一个窗口。
4. Application object:在CWinApp派生类(如CMyWinApp类)中定义的全局变量(如theApp)。
5. AfxWinInit——AFX内部初始化操作(APPINIT.CPP和THRDCORE.CPP,跟踪源码):
6. CWinApp::InitApplication :程序本体执行一次。
7. CMyWinApp::InitInstance:每一个实例执行一次。
8. CFrameWnd::Create:
(1)产生主窗口(并先注册窗口类)。
(2)CFrameWnd::Create在产生窗口之前,会先引发窗口类的注册操作。(跟踪CFrameWnd::Create源码),CFrameWnd::Create——>CWnd::CreateEx——>CFrameWnd::PreCreateWindow:
(3)窗口类注册相关定义:
(4)AfxEndDeferRegisterClass完成窗口类注册操作:
9. 窗口显示与更新:
10. CWinApp::Run——程序生命的活水源头
CWinApp::Run——>CWinThread::Run——>CWinThread::PumpMessage.
11. 把消息与处理函数连接在一起:Message Map机制。MFC提供了两组宏:
12. 小结MFC程序的诞生:
13. Callback函数:凡是由你设计而却由Windows系统调用的函数,统称为callback函数。(对成员函数的调用,我们知道,内存中只会有一份类成员函数,但却可能有许多份类成员变量——每个对象拥有一份。故而,C++会以隐含的this指针指出正确的对象)。callback函数是给Windows调用的,Windows并不借助任何对象调用这个函数,也就没有传递this指针给callback函数,于是导致堆栈中有一个随机变量会成为this指针,而其结果就是程序的崩溃。所以要把某个函数用作callback函数,必须告诉C++编译器,不要让this指针作为该函数的最后一个参数,可采用如下方法:
(1)不要使用类的成员函数(也就是说,要使用全局函数)作为callback函数;
(2)使用static成员函数,也就是在函数前面加上static修饰词。static的东西是类的一部分,不属于对象。
14. 通用对话框: