MFC基本框架结构
本文將剖析基于MFC的框架程序,探討MFC框架程序的內(nèi)部組織結(jié)構(gòu),MFC是微軟為了簡(jiǎn)化程序員的開(kāi)發(fā)工作而設(shè)計(jì)的一套c++類集合,利用這些類有
效地幫助程序員完成windows應(yīng)用程序開(kāi)發(fā)。
?
代碼結(jié)構(gòu)
?
我們利用VS2008 IDE創(chuàng)建一個(gè)名為T(mén)est的工程,程序類型選擇為單文檔,其他默認(rèn)不變,最終會(huì)生成一套代碼,這套代碼可以直接運(yùn)行。在生成的單
文檔應(yīng)用程序中,都有五個(gè)類,部分類名和工程名相關(guān)聯(lián)。圖1展示了IDE向?qū)傻拇a結(jié)構(gòu)示意圖以及對(duì)應(yīng)的類功能。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1 代碼結(jié)構(gòu)
?
?
在MFC程序有且僅有一個(gè)從應(yīng)用程序類(CWinApp)派生的類,而且僅有一個(gè)該派生類的實(shí)例化對(duì)象;我們發(fā)現(xiàn)該程序中確實(shí)存在一個(gè)theApp的全局變
量,該全局變量就代表了這個(gè)應(yīng)用程序本身;win32和MFC應(yīng)用程序?qū)嵗硎緟^(qū)別如下:
知識(shí)點(diǎn):
? ? ? ? 1.Afx前綴的函數(shù)代表應(yīng)用程序框架(Application Framework)函數(shù),屬于全局函數(shù),它們可以在程序的任何地方被調(diào)用。
? ? ? ? 2.以域作用符“::”開(kāi)始的表示的函數(shù),表明該函數(shù)是一個(gè)全局函數(shù)。
? ? ? ? ?
MFC運(yùn)行流程
?
現(xiàn)在直接給出MFC程序執(zhí)行順序,但著重分析其運(yùn)行機(jī)制和功能分析,其流程是“theApp全局對(duì)象定義->TestApp構(gòu)造函數(shù)->WinMain函數(shù)”。在執(zhí)行
theApp對(duì)象的構(gòu)造函數(shù)之前先執(zhí)行CWinApp基類的構(gòu)造函數(shù),從而把我們自己創(chuàng)建的類和MFC類相關(guān)聯(lián)起來(lái)了。
?
流程詳解:
?
1.全局變量定義;程序入口函數(shù)WinMain加載時(shí),系統(tǒng)先為全局對(duì)象分配內(nèi)存空間,從而利用theApp完成應(yīng)用程序的啟動(dòng)。
2.創(chuàng)建對(duì)象時(shí)會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù);theApp是子類CTestApp是實(shí)例對(duì)象,子類繼承于CWinApp,因此會(huì)先調(diào)用基類的構(gòu)造函數(shù),再調(diào)用子類的構(gòu)造
函數(shù),從而完成應(yīng)用程序的初始化工作,例如基類中保存theApp的this指針。
3.進(jìn)入WinMain函數(shù);在AfxWinMain函數(shù)中可以獲取子類的this指針,利用此指針調(diào)用InitApplication、InitInstance、Run等函數(shù),從而完成窗口類的注
冊(cè),創(chuàng)建,消息循環(huán)、顯示,更新。
4.進(jìn)入消息循環(huán),響應(yīng)各種消息,直到退出;MFC程序?qū)嶋H上是采用消息映射機(jī)制,來(lái)完成各種消息的處理,收到WM_QUIT消息時(shí),退出消息循環(huán)。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2 MFC 運(yùn)行流程示意圖
代碼跟蹤
?
下面將給出MFC運(yùn)行過(guò)程的代碼跟蹤,主要列出MFC框架涉及到的主要函數(shù)以及所在的文件名,具體的代碼流程可以自行debug跟蹤,并利用調(diào)用棧
完成函數(shù)跟蹤。細(xì)致函數(shù)跟蹤和分析,這不詳細(xì)給出,代碼跟蹤,如圖3所示。
相關(guān)的源碼文件位置是:...\VC\atlmfc\src\mfc; ? ? ? ? ? ? ? ? ? ? ? ??
?
?
?
? ? ? ? ? 圖3 代碼跟蹤
?
?
文檔/視類結(jié)構(gòu)
?
我們創(chuàng)建的MFC程序除了主框架窗口外,還有一個(gè)窗口就是視類窗口,對(duì)應(yīng)的是CView類。框架窗口是視類窗口的一個(gè)父窗口,它們的關(guān)系如圖4.紅色包圍的是主框架窗口,藍(lán)色包圍的是視窗口。
?
? ? ? 圖4 主框架和視窗口的關(guān)系
?
微軟在設(shè)計(jì)基礎(chǔ)類庫(kù)時(shí),采用數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)顯示分離的模式,數(shù)據(jù)存儲(chǔ)由CDocument類完成,數(shù)據(jù)顯示和修改由CView類完成。在CTestApp的
Initstance方法中定義一個(gè)單文檔模板對(duì)象指針,該對(duì)象就把文檔類對(duì)象、框架類對(duì)象、視窗類對(duì)象有機(jī)地組織在一起,接著利用AddDocTemplate函數(shù)
把這個(gè)單文檔模板添加到文檔模板中,從而把這個(gè)三個(gè)類組織成為一個(gè)整體,源碼如下:
?
[cpp]?view plain?copy
LoadStdProfileSettings(4); // 加載標(biāo)準(zhǔn) INI 文件選項(xiàng)(包括 MRU)
// 注冊(cè)應(yīng)用程序的文檔模板。文檔模板
// 將用作文檔、框架窗口和視圖之間的連接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CTestView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
?
?
窗口類、窗口類對(duì)象和窗口
?
C++窗口類對(duì)象和窗口并不是一回事,它們之間唯一的關(guān)系式C++窗口類對(duì)象內(nèi)部定義了一個(gè)窗口句柄變量,保存了與這個(gè)c++窗口
類對(duì)象相關(guān)的那個(gè)窗口句柄。窗口銷毀時(shí),與之對(duì)應(yīng)的c++窗口類對(duì)象銷毀與否,要看其生命周期是否結(jié)束。但是c++窗口類對(duì)象銷
毀時(shí),與之關(guān)聯(lián)的窗口也將銷毀。
總結(jié)
- 上一篇: 加薪——爱你在心口难开
- 下一篇: mfc编程消息机制中消息汇总