学习任何一门程序语言,最基础的,你就应该知道这个程序的生命周期。
Windows程序的生命周期
- 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,作为程序的屏幕舞台,CreateWindow产生窗口之后会送出WM_CREATE直接给窗口函数,后者于是可以在此时做些初始化操作(例如配置内存、打开文件、读初始数据……)。
- 在程序活着的过程中,不断以GetMessage从消息队列中抓取消息,如果这个消息是WH_QUIT,GetMessage会传回0而结束while循环,进而结束整个程序。
- DispatchMessage通过Windows USER模块的协助与监督,把消息分派至窗口函数。消息将在该处被判别并处理。
- 程序不断进行2.和3.的操作。
- 当使用者按下系统菜单中的Close命令项时,系统送出WM_CLOSE。通常程序的窗口函数不拦截此消息,于是DefWindowProc处理它。
- DefWindowProc收到WM_CLOSE后,调用DestroyWindow把窗口清除,DestroyWindow本身又会送出WM_DESTROY。
- 程序对WM_DESTROY的标准反应是调用PostQuitMessage。
- PostQuitMessage没什么其他操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束消息循环。
出自《深入浅出MFC 第2版》
MFC的生命周期
MFC虽然是构建的Windows程序,但是又有一些不同,又进行一层封装,我现在先copy一下别人的讲解,再慢慢来理一下MFC的生命周期对应的分别是Windows生命周期中谁。
简述MFC的生命周期
- 程序的诞生:
①Application object产生,内存于是获得配置,初值亦设立了;
②Afx WinMain执行AfxWinInit,后者又调用AfxInitThread,把消息队列尽量加大到96;
③Afx WinMain执行InitApplication。这是CWinApp的虚拟函数,但我们通常不改写它;
④Afx WinMain执行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,结束程序;
出自“MFC 生命周期”
MFC的生命周期对应的Windows程序的生命周期
Windows程序的初始化是调用CreateWindow,并初始化操作。这对应到MFC的生命周期中的程序的诞生:①——⑧,这是MFC的窗口的初始化并初始化数据,并且在Afx WinMain执行的InitInstance的虚拟函数中初始化用户数据;
Windows程序中的以GetMessage从消息队列中抓取消息,在MFC生命周期中,程序回到了AfxWinMain,在消息循环中,通过2-程序开始运作中的①-⑤;
MFC的生命周期中的关闭很容易跟Windows程序中CLOSE上相互对应起来,这里就不多说了。
MFC的生命周期和Windows的生命周期大致上就是这样的,其实还有很多东西都没有说清楚,最好就是看一下《深入浅出MFC》,在这本书的第二章和第三章有详细的讲解。