基于MFC的框架程序剖析
(一)MFC 程序中的WinMain函数
1.先来个定义,MFC:一套面向对象的函数库,一套C++类的集合,搞Windows应用程序的开发。
2.MFC将大部分的Windows API封装到C++中,以类成员函数的形式提供给程序员调用。
3.MFC中类的命名都以字母"C"开头,就像Delphi中类名以T开头,Oracle的类名以O开头一样,但并非必需。
4.MFC程序中找不到WinMain函数,因为MS在MFC的底层框架类中封装了这些每一个窗口应用程序都需要的步骤,目的主要是为了简化程序员的工作。
5.MFC的WinMain函数是在编译链接时,由链接器将该函数链接到程序中的。
6.MS在提供了部分MFC的源代码,就在安装目录下../VC98/MFC/SRC。
7.WinMain函数在APPMOCUL.CPP,F9设置断点,调试即可知道程序是否会进入这个WinMain.
8.无论是全局变量,还是全局对象,程序在运行时,在加载main函数之前,就已经为全局变量或全局对象分配了内存空间。
9.对Win32SDK应用程序来说,应用程序的实例是由实例句柄(WinMain函数的参数hInstance)来标识,而对MFC来说,通过一个应用程序类的对象来唯一标识应用程序的实例。每一个MFC程序实例有且仅有 一个实例化对象。
10.CWinApp类定义在APPCORE.CPP当中。
11.以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。AfxWinMain函数在WINMAIN.CPP中。AfxGetThread函数位于THRDCORE.CPP中。AfxGetApp是一个全局函数,定义于AFXWINI.INL中。
12.pApp->InitApplication()完成MFC内部管理方面的工作。pThread->InitInstance()调用CWinApp子类的InitInstance函数。pThread->run()完成消息循环。
(二)MFC框架窗口
1.MFC已经为我们预定义了一些默认的标准窗口类,只需要选择所需的类,然后注册就可以了。窗口类的注册是由AfxEndDeferRegisterClass函数完成的,位于WINCORE.CPP中。
2.窗口的创建功能是由CWnd类的CreateEx函数实现的,该函数的声明位于AFXWin.h文件中,实现位于WINCORE.CPP当中。
3.m_pMainWnd->ShowWindow(SW_SHOW)显示窗口,m_pMainWnd->UpdateWindow()更新窗口.
(三)消息环
1.CWinThread类的Run函数完成这一任务,在AfxWinMain函数中被调用,调用形式:pThread->Run()。
(四)窗口过程的函数
1.采用了一种称之为消息映射的机制来处理各种消息
(五)文档/视类结构
1.数据本身与它的显示分享开。数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成。
(六)帮助对话框类
1.CAboutDlg类(其基类是CDialog类)
窗口类、窗口类对象与窗口
(一)三者的关系
1.MFC中使用的大部分函数名与相应的SDK函数名相同。
2.如果在定义自己的成员函数时,当前定义的成员函数与内部调用的API函数名相同,那么后者前面必须加“::”符号,否则程序在编译或运行时会报错。
3.C++窗口类对象的生命周期不是一致的。当一个窗口销毁时,与C++窗口类对象没有关系,它们之间的纽带仅仅在于这个C++窗口类内部的成员变量:m_hWnd,该变量保存了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束。但C++窗口类对象销毁时,与之相关的窗口也将销毁。
小结
MFC的框架内部也有与Win32SDK程序相应的操作,包括设计窗口类,注册窗口类,显示和更新窗口,消息 环,以及窗口处理过程。
MFC最終的消息处理是利用消息映射来完成的。
很多窗口类的函数调用都不再需要传递窗口句柄了,因为它们都在内部维护了一个窗口句柄成员变量。
附:(MFC类继承表)