MFC Windows程序的生命周期和MFC的生命周期

学习任何一门程序语言,最基础的,你就应该知道这个程序的生命周期。

Windows程序的生命周期

生命周期的描述

  1. 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,作为程序的屏幕舞台,CreateWindow产生窗口之后会送出WM_CREATE直接给窗口函数,后者于是可以在此时做些初始化操作(例如配置内存、打开文件、读初始数据……)。
  2. 在程序活着的过程中,不断以GetMessage从消息队列中抓取消息,如果这个消息是WH_QUIT,GetMessage会传回0而结束while循环,进而结束整个程序。
  3. DispatchMessage通过Windows USER模块的协助与监督,把消息分派至窗口函数。消息将在该处被判别并处理。
  4. 程序不断进行2.和3.的操作。
  5. 当使用者按下系统菜单中的Close命令项时,系统送出WM_CLOSE。通常程序的窗口函数不拦截此消息,于是DefWindowProc处理它。
  6. DefWindowProc收到WM_CLOSE后,调用DestroyWindow把窗口清除,DestroyWindow本身又会送出WM_DESTROY。
  7. 程序对WM_DESTROY的标准反应是调用PostQuitMessage。
  8. PostQuitMessage没什么其他操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束消息循环。

出自《深入浅出MFC 第2版》

MFC的生命周期

MFC虽然是构建的Windows程序,但是又有一些不同,又进行一层封装,我现在先copy一下别人的讲解,再慢慢来理一下MFC的生命周期对应的分别是Windows生命周期中谁。

简述MFC的生命周期

  1. 程序的诞生:
    ①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,进入消息循环;
  2. 程序开始运作:
    ①程序获得WM_PAINT消息(藉由CWinApp::Run中的::GetMessage循环);
    ②WM_PAINT经由::DispatchMessage送到窗口函数CWnd::DefWindowProc中;
    ③CWnd::DefWindowProc将消息绕行过消息映射表格(Message Map);
    ④绕行过程中发现有吻合项目,于是调用项目中对应的函数,此函数是应用程序利用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏设立起来的;
    ⑤标准消息的处理例程亦有标准命名,例如WM_PAINT必然由OnPaint处理;
  3. 以下是程序的死亡:
    ①使用者选按【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》,在这本书的第二章和第三章有详细的讲解。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值