• 深入浅出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. 通用对话框:

     

  • 相关阅读:
    计算机科学中最重要的32个算法
    主流无线传输技术GPRS与CDMA之对比
    GPRS、GSM、WAP、CDMA 、EDGE和3G区别
    TCP与UDP的区别
    web自动化测试(java)---测试过程中遇到的错误合集
    web自动化测试(java)---环境搭建
    Java之基础学习(数据类型、运算符、分支语句和循环语句)
    OSI七层模型和tcp/ip四层模型对比
    测试工具之Match Tracer(正则表达式匹配工具)
    测试工具之RobotFramework关键字和快捷键
  • 原文地址:https://www.cnblogs.com/yyxt/p/4852011.html
Copyright © 2020-2023  润新知