《MFC程序开发参考大全》学习笔记_3
1.MFC的诞生
开发人员发现撰写Windows应用程序是重复、厌烦的过程,而且效率极低。因为每一个窗口都需要在窗口函数中处理大量的消息,导致出现大量的重复代码。
随着C++语言的盛行,开发人员发现利用C++语言的特性来封装Windows API和Windows应用程序的开发可以明显地提高程序的开发效率。于是,MFC就诞生了。
2.MFC简单介绍
MFC的英文全称是Microsoft Fundation Class Library,即微软基础类库。
MFC中的类按照功能的不同,可以分为不同的层次,有关MFC中的所有类及类库层次,此处不赘述,之后有涉及的时候再学习。
MFC中的数据类型与Windows SDK开发包中的数据类型多数是一致的,但也有一些数据类型是MFC独有的。如:POSITION(用于标记集合中一个元素的位置),LPCRECT(指向一个RECT结构体常量的32位指针)。
MFC类库中除了提供实现各种功能的类以外,还提供了许多全局函数,有:MFC诊断函数、异常抛出函数、字符串格式和消息框函数、应用程序信息和管理函数、集合类帮助函数、记录字段交换函数、OLE相关函数、Internet URL解析全局函数。
3.MFC应用程序
使用VS2010创建一个基于对话框的MFC应用程序,编译运行后,会直接有一个对话框。它是如何出现的呢?
在编译应用程序的时候,首先会构造工程中的全局对象,即先创建全局对象。我们可以在自己创建的工程中找到MFC应用程序向导创建的全局对象theApp。调试代码,按F11逐语句调试,同时注意查看“调用堆栈”窗口,最终会进入_tWinMain()函数,_tWinMain()函数中,调用AfxWinMain()函数,AfxWinMain()函数里边,会通过AfxGetApp()来获取我们创建的theApp的对象指针,然后调用InitApplication(),AfxGetThread()函数获得当前线程指针,然后调用InitInstance()函数。InitInstance()是CWinApp定义的一个虚函数,调用子类的实现,则回到应用程序中的InitInstance()初始化函数。
CtestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
创建一个CXXXDlg(对话框类)对象,然后将地址赋值给m_pMainWnd,最后调用DoMadal()显示对话框。
4.关于MFC深入浅出的一些学习
CObject:class CObject is the root of all compliant objects.即,CObject是MFC一切类的根。
在3中用到的CtestDlg(CXXXDlg),是继承自CWinApp类,有必要了解MFC类库消息映射体系中应用架构部分结构图:
m_pMainWnd:是定义在CWinThread类中的CWnd类型的一个属性。
//main window (usually same AfxGetApp()->m_pMainWnd)
InitApplication(),InitInstance():都是CWinApp的虚函数。其中InitApplication负责每一个程序只做一次的动作,而InitInstance负责每一个执行个体都得做一次的动作。
DoModal():函数在显示对话框的时候,会调用AfxGetMainWnd()函数返回当前线程的主窗口,所以有m_pMainWnd = &dlg。
推荐阅读