深入浅出MFC第2版(PDF格式)-第32部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0008 void main()
#0009 {
#0010
#0011 CWinApp* pApp = AfxGetApp();
#0012
#0013 }
Frame1 的命令列编译联结动作是(环境变量必须先设定好,请参考第4章的「安装与设
定」一节):
cl my。cpp mfc。cpp
Frame1 的执行结果是:
CObject Constructor
CCmdTarget Constructor
CWinThread Constructor
CWinApp Constructor
CMyWinApp Constructor
CMyWinApp Destructor
CWinApp Destructor
CWinThread Destructor
CCmdTarget Destructor
CObject Destructor
好,你看到了,Frame1 并没有new 任何对象,反倒是有一个全域对象theApp 存在。
C++ 规定,全域对象的构造将比程序进入点(在DOS 环境为main ,在Windows 环境为
WinMain)更早。所以theApp 的构造式将更早于main 。换句话说你所看到的执行结果
中的那些构造式输出动作全都是在main 函数之前完成的。
114
…………………………………………………………Page 177……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
main 函数调用全域函数AfxGetApp 以取得theApp 的对象指针。这完全是仿真MFC 程序
的手法。
MFC 程序的初始化过程
MFC 程序也是个Windows 程序,它的内部一定也像第1章所述一样,有窗口注册动
作,有窗口产生动作,有消息循环动作,也有窗口函数。此刻我并不打算做出Windows 程
序,只是想交待给你一个程序流程,这个流程正是任何MFC 程序的初始化过程的简化。
以下是Frame2 范例程序的类别阶层及其成员。对于那些「除了构造式与析构式之外没
有其它成员」的类别,我就不在图中展开他们了:
(本图从Visual C++ 的「Class View 窗口」中获得)
就如我曾在第1章解释过的,InitApplication 和InitInstance 现在成了MFC 的CWinApp
的两个虚拟函数。前者负责「每一个程序只做一次」的动作,后者负责「每一个执行个
115
…………………………………………………………Page 178……………………………………………………………
第篇 勿在浮砂築高台
体都得做一次」的动作。通常,系统会(并且有能力)为你注册一些标准的窗口类别(当
然也就准备好了一些标准的窗口函数),你(应用程序设计者)应该在你的CMyWinApp
中改写InitInstance ,并在其中把窗口产生出来…这样你才有机会在标准的窗口类别中
指定自己的窗口标题和菜单。下面就是我们新的main 函数:
// MY。CPP
CMyWinApp theApp;
void main()
{
CWinApp* pApp = AfxGetApp();
pApp…》InitApplication();
pApp…》InitInstance ();
pApp…》Run();
}
其中pApp 指向theApp 全域对象。在这里我们开始看到了虚拟函数的妙用(还不熟练者
请快复习第2章):
pApp…》InitApplication() 调用的是CWinApp::InitApplication ,
pApp…》InitInstance() 调用的是CMyWinApp::InitInstance (因为CMyWinApp 改
写它了),
pApp…》Run() 调用的是CWinApp::Run ,
好,请注意以下CMyWinApp::InitInstance 的动作,以及它所引发的行为:
BOOL CMyWinApp::InitInstance()
{
cout