3.1MFCAppWizard
建立一个MFC AppWizard程序:
选择工程MFC AppWizard(exe),然后选择Single document。其他的选择默认选项,最后结束,运行。
3.2基于MFC的程序框架剖析
工作区窗格中ClassView中显示了5个类:
CAboutDlg CMainFram CTestDoc CTestApp CTestView
关于对话框类 主框架类 工程文本类 工程应用程序类 工程视图类
MFC中类名以字母C开头,然后加上工程名,再加上后缀。
它们CAboutDlg,CMainFram,CTestView分别派生于:CDialog,CFrameWnd,CView,而这三个派生于CWnd类
3.2.1MFC程序中的WinMain函数
WinMain函数所在路径:
D:\Microsoft Visual Studio\VC98\MFC\SRC的APPMODUL.CPP文件中。
MFC程序中的类如何与WinMain函数关联一起呢?
双击CTestApp中的构造函数InitInstance(),跳到该类的源文件Test.cpp。CTestApp theApp;其中定义了一个变量,下一个断点。
程序执行的顺序:theApp全局对象定义处->TestApp构造函数->WinMain函数
为什么要定义一个theApp全局对象,让他在CwinApp的构造函数之前执行呢?
theApp构造函数调用之前会调用父类CwinApp的构造函数,从而把自己创造的类与Microsoft提供的基类关联起来,CwinApp的构造函数完成程序运行时的一些初始化工作。
AfxWinMain函数:CwinApp的函数实际上是通过调用AfxWinMain函数来完成它的功能的。D:\Microsoft Visual Studio\VC98\MFC\SRC的WINMAIN.CPP中。AfxWinMain函数首先调用AfxGetThread获得一个CWinThread类型的指针,接着调用AfxGetApp函数获得一个CWinApp类型的指针。这两个指针pThread和pApp都是指向theApp全局对象
pThread和pApp调用三个函数,完成了设计、注册、创建、显示、更新窗口,消息循环以及窗口过程函数。
3.2.2MFC框架窗口
设计和注册窗口类:
窗口类的注册:是由AfxEndDeferRegisterClass函数完成的,该函数的定义位于WINCORE.CPP中。
MFC程序执行的脉络也是在WinMain函数之后,窗口产生之前注册窗口类的。
创建窗口:是由CWnd类的CreatEx函数来实现的,该函数声明位于AFXWin.h文件中。
显示窗口和更新窗口:在CTestApp类InitInstance函数内部实现的。
3.2.3消息循环
CWinThread类的RUN函数完成消息循环的,该函数在AfxWinMain函数中调用的。CWinThread类的RUN函数的定义位于THRDCORE.CPP中。
.2.4窗口过程函数
在AfxEndDeferRegisterClass函数中,将默认的窗口过程:DefWindowProc,设置为窗口过程函数。
3.2.5文档/视类结构
CTestDoc是一个文档类,CView是一个视图类。数据的存储和加载由文档类来完成,数据的显示和修改由视类来完成。在CTestApp类InitInstance函数内部把框架类、视图类和文档类有机结合起来。
3.2.6帮助对话框类
CAboutDlg类,是一个对话框类,派生于窗口类。