深入浅出MFC——MFC程序的生死因果(三)

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. 通用对话框:

 

posted @ 2015-10-02 10:47  小天_y  阅读(625)  评论(0编辑  收藏  举报