(周顾徘徊无觅处,今日方知我是我)
工程的开始
以Test工程进行测试
1、CTestApp的全局变量定义(全局变量在程序开始前预编译?)
2、CTestApp构造函数
3、WinMain函数(特殊封装的函数见下文)
4、MFC框架的窗口类的的设计已经预制完成,根据需求选择,通过AfxEndDeferRegisterClass完成设计,AfxEndDeferRegisterClass的调用通过CMainFrame调用PreCreatWindow调用CFarmeWnd中的PreCreateWindow调用其中的AfxDeferRegisterClass(该函数是AfxEndDeferRegisterClass宏定义)从而开始注册
5、制作完成的框架设计通过AfxEndDeferRegisterClass中调用的AfxRegisterClass进行注册
6、CMainFrame继承CFrameWnd继承CWnd,调用CWnd的CreateEx创建窗口
7、CTestApp中的m_pMainWnd(Cwnd类型)指向应用程序窗口框架,在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)指针定向:声明CWinThread和CWinApp的类型指针分别指向AfxGetThread和AfxGetApp,通过AfxGetThred返回值为AfxGetApp的结果,从而使两者指针一致
8)工程构建:CWinApp的类型指针调用InitApplication完成MFC内部管理工作
CWinThread的类型指针调用InitInstance函数, CWinThread中的InitInstance函数是虚函数被CWinApp所重写,从而继续框架搭建工作。
CWinThread的类型指针调用Run函数,进入消息循环
窗口过程函数
通过AfxEndDeferRegisterClass中的DefWindowProc进行设置(默认设计,MFC采用消息映射机制处理消息
消息映射机制
所谓消息映射机制的根本在与消息映射表,消息映射表就是在接收和处理消息的类中定义一个消息和消息函数静态对照表(消息函数处理指针)
当出现新消息,搜寻该表就能处理该消息,具体步骤如下:
DefWindowProc函数调用OnwndMsg函数,而OnwndMsg函数首先搜寻子类头文件中的定义,其次子类源文件中的消息映射宏,最后触发响应函数
当在子类搜索不到时就进入基类寻找
一些其他类说明
视图类:CTestView (视类窗口是框架窗口的一个子类,其中留白部分)
文档类:CTestDoc
;文档/视结构进行处理数据和显示
帮助类:CAboutDlg
窗口类、窗口类对象、窗口
窗口类实例化:窗口类对象
窗口类对象创建窗口,得到该窗口的句柄,从而操控?窗口
窗口关闭时,对象中句柄清空
对象销毁时,其析构函数关闭窗口