01 MFC的初始化
阿新 • • 發佈:2019-01-01
在上一篇簡單的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執行得到如圖所示的結果,這樣我們就能大體掌握其簡化版的程式執行流程了,後續寫程式碼該寫到哪,怎麼寫就有思路了,同時對後續跟原始碼也有基礎了;