您的位置:首页 > 其它

深入浅出MFC:MFC的程序的初始化过程

2016-09-27 23:34 344 查看
对于一个标准的MFC的程序,弃去细枝末节,其主要的初始化流程主要如下:

首先是基本类的内容的声明与实现:

这些通常由VS内部自动生成,包含了一些MFC类的基本结构:

//MFC.h
#pragma once
//最基础的基本类型的定义

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

#include<iostream>
using namespace std;

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::Instance"<<endl;
return TRUE;
}

virtual int Run() {
cout << "CWinThread::Run" << endl;
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"<<endl;
return TRUE;
}

virtual BOOL InitInstance() {
cout << "CWinApp::InitInstance" << endl;
return TRUE;
}

virtual int Run() {
cout << "CWinApp::Run" << endl;
return CWinThread::Run();
}
};

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

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

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

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

//global function
CWinApp* AfxGeApp();

//MFC.cpp
//该文件编译的时候则依赖MY.h
//2个实现文件所依赖的声明项是相同的

#include "MY.h"

extern CMyWinApp theApp;

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

BOOL CWnd::CreateEX()
{
cout << "CWnd::CreateEX" << endl;
PreCreateWindow();
return TRUE;
}

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

BOOL CFrameWnd::Create()
{
cout << "CFrameWnd::Create" << endl;
CreateEX();
return 0;
}

BOOL CFrameWnd::PreCreateWindow()
{
cout << "CFrameWnd::PreCreateWindow" << endl;
return 0;
}

CWinApp * AfxGeApp()
{
return theApp.m_pCurrentWinApp;
}
接下来的内容往往由编码者自己编写:

其中包含了主要的MFC程序的运转流程,代码如下:

#pragma once
//在这里在MFC.h的基础上多添加了2个类的定义
#include<iostream>
#include"MFC.h"
using namespace std;
class CMyWinApp : public CWinApp
{
public:
CMyWinApp::CMyWinApp(){}
CMyWinApp::~CMyWinApp(){}

virtual BOOL InitInstance();
};

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

#include"MY.h"
CMyWinApp theApp;  //全局对象

//最后代码之间的链接由链接器自动完成~~~,不过可以链接的前提是头文件中有对应实现的声明

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

CMyFrameWnd::CMyFrameWnd()
{
cout << "CMyFrameWnd::CMyFrameWnd" << endl;
Create();
}

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

pApp->InitApplication();
pApp->InitInstance();
pApp->Run();
system("pause");
}


其中主函数main中的内容也一般被自动封装好了,当然这是后话。

运行的消息图是:



接下来基本口述一下这个过程吧,每个MFC程序都会有一个全局的WinApp对象theApp,该App对象实际建立的是我们自己的对象CMyWinApp , 不过由于是全局对象,所以这几个对象被创建的过程都没有被输出,这一个对象被创建后才会有后面的进入主逻辑main,着这个主逻辑中首先是InitApplication方法,之后就是该App对象的InitInstance方法(实例化),创建了一个对象CMyFrameWnd , 该CMyFrameWnd执行其子类CFrameWnd 的Create方法,在该CFrameWnd方法中又调用到了它的子类的CreateEX方法,至此应用程序的加载工作完成,最后则是程序的运行,其中包含了线程的调度,简而言之整个程序就是通过全局对象theApp来展开的,有theApp来负责所有的初始化工作并展开整个程序,这个全局对象是整个MFC程序运转的核心
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息