zoukankan      html  css  js  c++  java
  • 《VC++深入详解》学习笔记 第三章 MFC框架程序剖析

    (周顾徘徊无觅处,今日方知我是我)

    工程的开始

    以Test工程进行测试

    1、CTestApp的全局变量定义(全局变量在程序开始前预编译?

    2、CTestApp构造函数

    3、WinMain函数(特殊封装的函数见下文)

    4、MFC框架的窗口类的的设计已经预制完成,根据需求选择,通过AfxEndDeferRegisterClass完成设计,AfxEndDeferRegisterClass的调用通过CMainFrame调用PreCreatWindow调用CFarmeWnd中的PreCreateWindow调用其中的AfxDeferRegisterClass(该函数是AfxEndDeferRegisterClass宏定义)从而开始注册

    5、制作完成的框架设计通过AfxEndDeferRegisterClass中调用的AfxRegisterClass进行注册

    6、CMainFrame继承CFrameWnd继承CWnd,调用CWndCreateEx创建窗口

    7、CTestApp中的m_pMainWndCwnd类型)指向应用程序窗口框架,在InitInstance中通过其实现框架窗口的显示和刷新

    8、位于CWinThread定义的Run函数实现消息循环,当接收到WM_QUIT消息是退出,其中的PumpMessage为消息处理代码

    以上一个Test工程的基本流程,另外补充一些功能函数


    WinMain的特殊封装

    微软将MFC底层框架进行封装,工程开始时所经过的步骤如下

    1)MFC中将 wWinMain 宏定义为 _tWinMain (Unicode编码格式中为wWinMain,而ANSI编码格式中为常见的WinMain;前者支持中文)

    2)工程和WinMain建立联系方式是通过 this 指针。

    3)在执行WinMain之前,通过全局变量形式执行了CTestApp的构造函数。而CTestApp的父类CWinApp会先一步被构造,在其构造过程中将this对象指向CTestApp即我们工程对象

    4)上述步骤是在WinMain执行之前发生,所以在执行WinMain后此时的this已经指向工程对象

    5)WinMain通过AfxWinMain来实现其功能

    6)AfxWinMain函数内容大致分为两块:指针的定向以及工程构建

    7)指针定向:声明CWinThreadCWinApp的类型指针分别指向AfxGetThreadAfxGetApp,通过AfxGetThred返回值为AfxGetApp的结果,从而使两者指针一致

    8)工程构建:CWinApp的类型指针调用InitApplication完成MFC内部管理工作

            CWinThread的类型指针调用InitInstance函数, CWinThread中的InitInstance函数是虚函数被CWinApp所重写,从而继续框架搭建工作。

            CWinThread的类型指针调用Run函数,进入消息循环

    窗口过程函数

    通过AfxEndDeferRegisterClass中的DefWindowProc进行设置(默认设计,MFC采用消息映射机制处理消息

    消息映射机制

    所谓消息映射机制的根本在与消息映射表,消息映射表就是在接收和处理消息的类中定义一个消息和消息函数静态对照表(消息函数处理指针)

    当出现新消息,搜寻该表就能处理该消息,具体步骤如下:

    DefWindowProc函数调用OnwndMsg函数,而OnwndMsg函数首先搜寻子类头文件中的定义,其次子类源文件中的消息映射宏,最后触发响应函数

    当在子类搜索不到时就进入基类寻找

    一些其他类说明

      视图类:CTestView (视类窗口是框架窗口的一个子类,其中留白部分)

      文档类:CTestDoc

      ;文档/视结构进行处理数据和显示

      帮助类:CAboutDlg

    窗口类、窗口类对象、窗口

    窗口类实例化:窗口类对象

    窗口类对象创建窗口,得到该窗口的句柄,从而操控?窗口

    窗口关闭时,对象中句柄清空

    对象销毁时,其析构函数关闭窗口


  • 相关阅读:
    Can't connect to X11 window server using 的问题,求解
    自动化运维,让你远离背锅侠
    python netmiko实现cisco网络设备配置备份
    如何备份思科、锐捷、Juniper的配置文件
    网络配置备份。
    使用SecureCRT脚本备份网络设备配置的一点感悟
    網管利器!開源管理系統-LibreNMS
    邮件协议与port
    视频播放技术汇总(列表播放,小窗播放,跨界面播放,播放中网络切换提示)
    android插件式开发资料整理
  • 原文地址:https://www.cnblogs.com/sepmaple/p/9335320.html
Copyright © 2011-2022 走看看