当我们在创建一个MFC项目的时候,总会又一个 xxApplication 类.
// 唯一的一个 CMFCApplication5App 对象
CMFCApplication5App theApp;
// CMFCApplication5App 初始化
BOOL CMFCApplication5App::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
CMFCApplication5Dlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
虽然都知道程序运行的话会 构造一个
CMFCAppcication5App theApp 对象
之后在执行 对象的 InitInstance 函数, 但是我们却没有看到 入口函数 ,反而InitInstance更像一个入口函数,这是如何做到的呢?我们可以模仿一个简单的MFC启动程序。
先看一下MFC类图中的结构
我们可以看到 App 类的继承关系, 而CMyWinApp 是我们需要自己定义的类(类似CMFApplicationApp5):
让CMyWinApp 继承自 CWinApp
my.h
#include<iostream>
#include"MFC.h"
class CMyWinAPP:public CWinApp
{
public:
CMyWinAPP::CMyWinAPP(){ cout << "CMyWinAPP Construction \n"; }
CMyWinAPP::~CMyWinAPP(){ cout << "CMyWinAPP Destruction \n"; }
};
安装层次结构声明基类
MFC.h
#pragma once
#include<iostream>
using namespace std;
class CObject
{
public:
CObject::CObject(){ cout << "COject Construction \n"; }
CObject::~CObject(){ cout << "COject Destruction \n"; }
};
class CCmdTarget: public CObject
{
public:
CCmdTarget::CCmdTarget(){ cout << "CCmdTarget Construction \n"; }
CCmdTarget::~CCmdTarget(){ cout << "CCmdTarget Destruction \n"; }
};
class CWinThread : public CCmdTarget
{
public:
CWinThread::CWinThread(){ cout << "CWinThread Construction \n"; }
CWinThread::~CWinThread(){ cout << "CWinThread Destruction \n"; }
};
class CWinApp : public CWinThread
{
public:
CWinApp* m_pCurrentWinApp;
public:
CWinApp::CWinApp()
{
m_pCurrentWinApp = this;
cout << "CWinApp Construction \n";
}
CWinApp::~CWinApp(){ cout << "CWinApp Destruction \n"; }
};
CWinApp* AfxGetApp();
</pre><p></p><p></p><span style="white-space:pre"></span>注意这里有一个全局函数 AfxGetApp()<p><span style="white-space:pre"></span>接着我们看一下实现文件</p><p></p><p></p><pre name="code" class="cpp">MFC.cpp
#include "my.h"
extern CMyWinAPP theApp;
CWinApp* AfxGetApp()
{
return theApp.m_pCurrentWinApp;
}
<pre name="code" class="cpp">void main()
{
CWinApp *pApp = AfxGetApp();
}
my.cpp
#include"my.h"
CMyWinAPP theApp;
我们运行程序
发现成功 构造了 CMyWinApp 对象 。
所以可以猜想 在我们生成的MFC项目中, theApp 对象生成 之后 主函数调用了其 InitInstance() 函数。
声明:上部分代码来自<<深入浅出MFC>>第二版