1. 程式人生 > >01 MFC的初始化

01 MFC的初始化

在上一篇簡單的MFC程式中, 還有好多疑惑沒有解開,學C的人都習慣,看程式先找main,但是上篇中程式的main在哪,為啥能弄出一個視窗來還不是很清晰,就算Win32學了,也不一定能想通;這篇主要用寫小例子來從另一個角度來看MFC的初始化過程;
我們都知道,全域性變數的初始化過程在main函式執行之前;那麼我們就先來看下面這個小例子,這個小例子對理解MFC非常有幫助,一定要看懂!

/*
 *test.cpp
 */
#include <iostream>

using namespace std;

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

CWinApp::CWinApp()
{
	cout << "CWinApp constructor start!" << endl;
}

CWinApp::~CWinApp()
{
	cout << "CWinApp destructor start!" << endl;
	//此處為了看效果,實際寫程式碼時不建議這麼寫
	getchar();
}

CWinApp myApp;

int main()
{
	cout << "main start!" << endl;
	return 0;
}

執行效果如下圖:
在這裡插入圖片描述從執行結果我們可以看出,我們定義的myApp物件的建構函式先於main函式執行,有了這點C++基礎我們就知道,當我們想要在main前新增東西應該怎麼添加了;
接下來我們就找一找我們的WinMain吧,我們切回我們上一篇的程式,在如圖下斷點;
在這裡插入圖片描述
然後VS中F10逐過程跟,我們就可以成功找到我們期盼已久的, 是不是很熟悉;
在這裡插入圖片描述
但是仔細一看,不對啊,我們Win32用的是WinMain啊,這加一個Afx是什麼鬼,那我們繼續找咯;這個找的思路怎麼找呢,既然是MFC相關的,那我們在VS安裝路徑中找MFC相關資料夾咯,然後逐個資料夾搜尋文字內容找WinMain,最後鎖定檔案D:\vs2013\VC\atlmfc\src\mfc\appmodul.cpp(請根據自己的安裝路徑尋找),然後在我們的VS2013中上篇中專案開啟的情況下點選檔案–>開啟–>檔案將剛才那個檔案開啟如下圖,可以看到有一個_tWinMain呼叫 了剛才上面那個AfxWinMain,那我們在這下個斷點唄,看看是不是會跑到這;
在這裡插入圖片描述


果然程式在這停住了,但是,好像與我們的WinMain還是有點點差別;這時該怎麼辦呢,WinMain你在哪啊?
在這裡插入圖片描述
這時我們來怎麼繼續呢,想想這_tWinMain跟WinMain這麼像,會不會是個巨集呢?哇,有思路就好辦了,複製一個 _tWinMain,游標定位到中間,F12一跳,還真是個巨集
在這裡插入圖片描述
還不是,那繼續點唄,F12,這下總算找到了,真是縱裡尋她千百度,她卻在深山老林中
在這裡插入圖片描述
WinMain找完了,我們的C情節也該放一放了,還是繼續看我們的小示例如何仿照上一篇例子執行過程吧;下面我們來看一下MFC的類層次圖,來認識一些CWinApp有哪些祖宗(哈哈);
在這裡插入圖片描述
同樣我們再來看看,CFrameWnd有哪些爹啊爺爺啊啥的;
在這裡插入圖片描述

下面我們就繼續來改進我們本篇的小示例啊,為了方便演示和理解以及複製我就不分檔案寫類了,都寫一個檔案中了;

/*
 *class.h
 */
#ifndef _CLASS_H_
#define _CLASS_H_

class CWnd;

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

/*************完美分割線**************/
class CCmdTarget : public CObject{
public:
	CCmdTarget();
	~CCmdTarget();
};

/*************完美分割線**************/
class CWinThread : public CCmdTarget{
public:
	CWinThread();
	~CWinThread();
	virtual bool InitInstance() = 0;
public:
	CWnd *m_pMainWnd;
};

/*************完美分割線**************/
class CWinApp : public CWinThread{
public:
	CWinApp();
	~CWinApp();
};

/*************完美分割線**************/
class CWnd : public CCmdTarget{
public:
	CWnd();
	~CWnd();
};

/*************完美分割線**************/
class CFrameWnd : public CWnd{
public:
	CFrameWnd();
	~CFrameWnd();
};
#endif
/*
 *class.cpp
 */
#include "class.h"
#include <iostream>

using namespace std;
/*************完美分割線**************/
CObject::CObject()
{
	cout << "CObject constructor start!" << endl;
}

CObject::~CObject()
{
	cout << "CObject destructor start!" << endl;
}

/*************完美分割線**************/
CCmdTarget::CCmdTarget()
{
	cout << "CCmdTarget constructor start!" << endl;
}

CCmdTarget::~CCmdTarget()
{
	cout << "CCmdTarget destructor start!" << endl;
}

/*************完美分割線**************/
CWinThread::CWinThread()
{
	cout << "CWinThread constructor start!" << endl;
}

CWinThread::~CWinThread()
{
	cout << "CWinThread destructor start!" << endl;
}

/*************完美分割線**************/
CWinApp::CWinApp()
{
	cout << "CWinApp constructor start!" << endl;
}

CWinApp::~CWinApp()
{
	cout << "CWinApp destructor start!" << endl;
}

/*************完美分割線**************/
CWnd::CWnd()
{
	cout << "CWnd constructor start!" << endl;
}

CWnd::~CWnd()
{
	cout << "CWnd destructor start!" << endl;
}

/*************完美分割線**************/
CFrameWnd::CFrameWnd()
{
	cout << "CFrameWnd constructor start!" << endl;
}

CFrameWnd::~CFrameWnd()
{
	cout << "CFrameWnd destructor start!" << endl;
}
/*
 *HelloMFC.h
 */
#ifndef _HELLO_MFC_
#define _HELLO_MFC_
#include "class.h"

class CMyApp : public CWinApp{
public:
	CMyApp();
	~CMyApp();
	virtual bool InitInstance();
public:
	CMyApp *m_CurrentApp;
};

class CMainWindow : public CFrameWnd{
public:
	CMainWindow();
	~CMainWindow();
	void Create();
};

#endif
/*
 *HelloMFC.cpp
 */
#include "HelloMFC.h"
#include <iostream>

using namespace std;

CMyApp::CMyApp()
{
	cout << "CMyApp constructor start!" << endl;
	m_CurrentApp = this;
}

CMyApp::~CMyApp()
{
	cout << "CMyApp destructor start!" << endl;
}

bool CMyApp::InitInstance()
{
	cout << "CMyApp::InitInstance()" << endl;
	m_pMainWnd = new CMainWindow;

	return true;
}

/*************完美分割線**************/
CMainWindow::CMainWindow()
{
	cout << "CMainWindow constructor start!" << endl;
	Create();
}

CMainWindow::~CMainWindow()
{
	cout << "CMainWindow destructor start!" << endl;
}

void CMainWindow::Create()
{
	cout << "Create()" << endl;
}
/*
 *test.cpp
 */
#include <iostream>
#include "class.h"
#include "HelloMFC.h"

using namespace std;

CMyApp myApp;

CMyApp *AfxGetApp()
{
	return myApp.m_CurrentApp;
}

int main()
{
	cout << "main start!" << endl;
	CMyApp *pApp = AfxGetApp();
	pApp->InitInstance();
	return 0;
}

我們按Ctrl+F5執行得到如圖所示的結果,這樣我們就能大體掌握其簡化版的程式執行流程了,後續寫程式碼該寫到哪,怎麼寫就有思路了,同時對後續跟原始碼也有基礎了;
在這裡插入圖片描述