MFC程序的初始化

本文详细介绍了MFC中初始化过程的实现方式,包括InitApplication和InitInstance的作用与调用顺序,以及窗口创建的过程。通过一个具体的控制台应用程序示例,展示了MFC初始化的具体步骤。

    在MFC中,InitApplication负责程序的初始化,InitInstance负责实例的初始化,它们两个都是CWinApp类的虚函数。下面是一个控制台应用程序Frame2,具体代码如下。

//mfc.h

#define BOOL int
#define TRUE 1
#define FALSE 0

#include <iostream.h>

class CObject
{
public:
	CObject::CObject(){}
	CObject::~CObject(){}
};

class CCmdTarget:public CObject
{
public:
	CCmdTarget::CCmdTarget(){}
	CCmdTarget::~CCmdTarget(){}
};

class CWinThread:public CCmdTarget
{
public:
	CWinThread::CWinThread(){}
	CWinThread::~CWinThread(){}

	virtual BOOL InitInstance(){
		cout<<"CWinThread::InitInstance \n";
		return TRUE;
	}
	virtual int Run(){
		cout<<"CWinThread:: Run \n";
		return 1;
	}
};

class CWnd;

class CWinApp:public CWinThread
{
public:
	CWinApp* m_pCurrentWinApp;
	CWnd* m_pMainWnd;

public:
	CWinApp::CWinApp(){ m_pCurrentWinApp=this; }
	CWinApp::~CWinApp(){}

	virtual BOOL InitApplication(){
		cout<<"CWinApp::InitApplication \n";
		return TRUE;
	}
	virtual BOOL InitInstance(){
		cout<<"CWinApp::InitInstance \n";
		return TRUE;
	}
	virtual int Run()
	{
		cout<<"CWinApp::Run \n";
		return CWinThread::Run();
	}

};

class CDocument:public CCmdTarget
{
public:
	CDocument::CDocument(){}
	CDocument::~CDocument(){}
};

class CWnd:public CCmdTarget
{
public:
	CWnd::CWnd(){}
	CWnd::~CWnd(){}

	virtual BOOL Create();
	BOOL CreateEx();
	virtual BOOL PreCreateWindow();
};

class CFrameWnd:public CWnd{
public:
	CFrameWnd::CFrameWnd(){}
	CFrameWnd::~CFrameWnd(){}
	BOOL Create();
	virtual BOOL PreCreateWindow();
};

class CView:public CWnd
{
public:
	CView::CView(){}
	CView::~CView(){}
};

//global function
CWinApp* AfxGetApp();

//mfc.cpp

#include "my.h"

extern CMyWinApp theApp; //external global object

BOOL CWnd::Create()
{
	cout<<"CWnd::Create \n";
	return TRUE;
}

BOOL CWnd::CreateEx()
{
	cout<<"CWnd::CreaeteEX \n";
	PreCreateWindow();
	return TRUE;
}

BOOL CWnd::PreCreateWindow()
{
	cout<<"CWnd::PreCreateWindow \n";
	return TRUE;
}

BOOL CFrameWnd::Create()
{
	cout<<"CFrameWnd::Create \n";
	CreateEx();
	return TRUE;
}

BOOL CFrameWnd::PreCreateWindow()
{
	cout<<"CFrameWnd::PreCreateWindow \n";
	return TRUE;
}

CWinApp* AfxGetApp()
{
	return theApp.m_pCurrentWinApp;
}

//my.h

#include <iostream.h>
#include "mfc.h"

class CMyWinApp:public CWinApp
{
public:
	CMyWinApp::CMyWinApp(){}
	CMyWinApp::~CMyWinApp(){}
	virtual BOOL InitInstance();
};

class CMyFrameWnd:public CFrameWnd
{
public:
	CMyFrameWnd();
	~CMyFrameWnd(){}
};

//my.cpp

#include "my.h"

CMyWinApp theApp; //global object

BOOL CMyWinApp::InitInstance()
{
	cout<<"CMyWinApp::InitInstance \n";
	m_pMainWnd=new CMyFrameWnd;
	return TRUE;
}

CMyFrameWnd::CMyFrameWnd()
{
	cout<<"CMyFrameWnd::CMyFrameWnd \n";
	Create();
}

void main()
{
	CWinApp* pApp = AfxGetApp();

	pApp->InitApplication(); //初始化程序
	pApp->InitInstance(); //初始化实例
	pApp->Run();
}

效果如下:


图(1)MFC的初始化顺序

  解析:

    MFC的初始化顺序为:InitApplication()  ---》InitInstance()---》Create() ----》 CreateEx () ---》PreCreateWindow () ----》CWinApp::Run() ----》CWinThread::Run()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值