Sollyu

  • 捐赠
  • 关于
  1. 首页
  2. 原创文章
  3. 正文

C++学习笔记三

2014年5月27日 4451点热度 0人点赞 0条评论

说明

MFC AppWizard(Microsoft Foundation Class,微软基础类库)

MFC中的类都以“C”开头。

包含:一个CMainFrame类,一个C+工程名+App为名字的类;一个C+工程名+Doc为名字的类;一个C+工程名+View为名字的类。

MFC类组织结构图。

  • CWnd类是非常重要的类,它的子类有
    • CFrameWnd
    • CView

MFC的运行机制和封装原理

WinMain函数是关键

  1. 因为全局对象theApp,先调用CWinApp类的构造函数,并执行CTestApp类的构造函数,启动应用程序;

  2. 通过AfxWinMain函数实现WinMain函数,获取子类CTestApp的指针, 调用虚函数InitInstance,完成应用程序方面的初始化工作,包括窗口类的注册、创建、窗口的显示和更新;

  3. 进入消息循环,利用消息映射机制来处理各种消息(回调函数)

寻找WinMain函数,F9设置断点

CTestApp派生自CWinApp(代表应用程序类)。

  • theApp全局对象
    每个MFC程序有且仅有一个从应用程序类派生的类,每一个MFC程序实例有且仅有一个该派生类的实例化对象,即theApp全局变量,表征了应用程序本身。
  • CWinApp类的构造函数完成一些初始化工作
    初始化的东西很多,暂时没看完全

WinMain函数是通过调用AfxWinMain函数来完成的。

Afx前缀的函数代表应用程序框架函数,有此前缀的函数都是全局函数

  • AfxWinMain函数调用AfxGetThread和AfxGetApp函数,分别获得CWinThread和CWinApp类型的指针(二者是一致的)。pThread和pApp指向CTestApp类的对象,即theApp全局对象;
  • pApp首先调用InitApplication函数,完成MFC内部管理方面的工作;pThread调用nitInstance函数(虚函数)还有一个pThread调用的run函数。

MFC框架窗口的设计步骤

  • 设计和注册窗口类。窗口类的定义是由AfxEndDeferRegisterClass函数完成的。
    AfxEndDeferRegisterClass先判断窗口类的类型,然后再赋予相应类名(都是预先定义好的),调用AfxRegisterClass注册窗口类。调用的还是RegisterClass函数,返回的是一个数值。窗口产生之前会调用的是CMainFrame类(派生自CFrameWnd,默认的两个窗口中的一个)的PreCreateWindow函数,完成的就是这个窗口类的注册。
  • 创建窗口。窗口的创建是由CWnd类的CreateEx函数实现的(Ex后缀都表示可扩展性)。
    CFrameWnd类派生于CWnd类。CWnd的 CreateEx函数不是虚函数,而 CFrameWnd也没有重写这个函数。因此 CFrameWnd类在Create函数内调用的CreateEx函数就是CWnd的CreateEx函数。CWnd的CreateEx函数中又调用了PreCreateWindow,为了在窗口之前再次修改窗口外观,它的参数是CREATESTRUCT结构,其与CreateEx函数中的CreateWindowEx函数的参数对比可知二者完全相同。
  • 显示和更新窗口。CTestApp-CWinApp-CWinThread,而m_pMainWnd的定义是在CWinThread中的。

消息循环

  • CWinThread类的Run函数就是完成消息循环的。PumpMessage内部还是GetMessage那些。

窗口过程函数

  • 通过消息映射机制来处理各种信息。
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: VC++ 笔记
最后更新:2014年5月27日

sollyu

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2021 sollyu.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

苏ICP备15007531号