2.MFC简单的层次结构分析

当我们在创建一个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;



        我们这里把主函数写在了 CWinApp 的 实现文件中, 实际上并非如此, MFC 又专门的 入口函数 文件,我们这里只是为了模仿 所以写在 CWinApp的实现文件中,你也可以写在其他文件中,只要包含 "my.h"
我们运行程序

发现成功 构造了 CMyWinApp 对象 。

所以可以猜想 在我们生成的MFC项目中, theApp 对象生成 之后 主函数调用了其 InitInstance() 函数。

声明:上部分代码来自<<深入浅出MFC>>第二版


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值