MFC執行過程詳解

2021-09-06 07:05:21 字數 2970 閱讀 2257

1.cobject類為mfc總類,該類下面有乙個重要的類ccmdtarget。而ccmdtarget類下面又有四個重要的繼承類,分別為:cwinthread、cdocument、cdoctemplate、

cwnd

類。所以,可以得出乙個大概繼承圖,如圖所示:

其中cwnd類下屬又有幾個重要的繼承類,分別為cframewnd、cdialog、cview、controls、

cwnd---->cframewnd

---->cdialog

---->cview

---->controls

視窗類是一切windows可見視窗,(包括主視窗,子框視窗,對話方塊,控制項,view視窗)的父類。凡是能可見的,基本上是繼承於cwnd,而抽象於其中的(即不可見的)則不繼承於它。

2.mfc標頭檔案:

■stdafx.h:該檔案用來作為precompiled header file,其內只是載入其它的mfc標頭檔案。

■afxwin.h:每個mfc程式都必須載入它,因為它以及它所載入的檔案宣告了所有的mfc類。此檔案內包含afx.h,後者又包含afxver_.h,後者又包含afxv_w32.h,後者又包含windows.h

■afxext.h:凡使用工具欄、狀態列的程式必須載入此檔案。

■afxdlgs.h:凡使用通用型對話方塊(common dialog)的mfc程式要載入此檔案。

■afxcmn.h:凡使用windows9x新增的通用型控制項(common control)之mfc程式需載入此檔案。

■afxcoll.h:凡使用collections class(處理資料結構如資料,鍊錶類等)之程式需載入此檔案。

■afxdllx.h:凡mfc extension dlls需載入此檔案。 ■

afxres.h:mfc程式的rc檔案必須載入此檔案。mfc對於標準windows資源(如file,edit等)的id均有預設定義,這此定義在該標頭檔案內。

3.什麼是precompiled header:

乙個應用程式在發展過程中需不斷的編譯,而windows程式載入的.h標頭檔案非常巨大且內容不變,編譯器如果不precompiled的話,每次需要編譯的時間非常多,所以precompiled header就是將.h檔案一次編譯後的結果儲存起來,第二次編譯時就可以直接從磁碟中讀取。

4.關於應用程式的進入點winmain和視窗過程wndproc:

mfc

6.cframewnd類取代了sdk中的wndproc地位

眾所周知,wndproc是用來處理視窗(包括初始化,處理訊息,顯示等)的函式,那麼cframewnd也是,首先在標頭檔案中,我們要繼承乙個cframewnd的類,並在此定義要處理的訊息(declare_message_map),然後,在原始檔中,定義該類的訊息實現(begin_message_map,end_message_map)

7.mfc中陰晦的winmain:

它是第一步操作登場,注意,我們沒有撰寫winmain的**,winmain是mfc早已準備好並由鏈結器直接加到應用程式**中的。_twinmain是為了支援unicode而準備的乙個巨集,實質還是winmain。好,_twinmain函式做了什麼工作呢?它只是在裡面呼叫afxwinmain函式。如下:returnafxwinmain(hinstance, hprevinstance, lpcmdline, ncmdshow);afxwinmain是乙個全域性的函式,並不屬於任乙個類。

下面讓我們來看一看afxwinmain函式做了些什麼工作?

第一、它會獲得

第二、呼叫afxwininit(...)函式,用作mfc gui程式初始化的一部分,這個函式詳見後解...

第六、最後調有

afxwinterm函式,結束該應用程式。

所以,主要的afxwinmain做的工作就應該如下**所示:

int afxapiafxwinmain(hinstance hinstance, hinstance hprevinstance, lptstr lpcmdline, int ncmdshow)

是乙個全域性函式,定義於afxwin1.inl中,如下:

而在類的建構函式中,有一段**是這樣定義的:

afx_module_state* pmodulestate =afxgetmodulestate();

9.afxwininit ----afx內部的初始化操作:②

afxwininit

,以下是它的操作摘要:

bool afxapiafxwininit(hinstance hinstance, hinstance hprevinstance,lptstr lpcmdline, int ncmdshow)

if (!afxcontextisdll)

afxinitthread();

return true; }

()函式:

afxwininit

函式對內部初始化之後,進入第三步操作

if (m_pdocmanager != null)

m_pdocmanager->adddoctemplate(null);

else

cdocmanager::bstaticinit = false;

return true; }

這些操作都是mfc為內部管理而做的。只要記住一點,我們的派生類無需改寫它,它是關於cdocmanager的類,關於該類詳見後解

...

MFC執行過程詳解

原文 1.cobject類為mfc總類,該類下面有乙個重要的類ccmdtarget。而ccmdtarget類下面又有四個重要的繼承類,分別為 cwinthread cdocument cdoctemplate cwnd 類。所以,可以得出乙個大概繼承圖,如圖所示 cdoctemplate cdocu...

MFC 執行過程

pthread initinstance 呼叫子類中的initinstance processshellcommand cmdinfo 對命令列進行解釋 ctestdoc ctestdoc 構造文件類物件 cmainframe cmainframe 構造框架視窗物件 cframewnd loadfr...

MFC程式執行過程

一 mfc程式執行過程剖析 相信大家有點暈點了吧,實際程式設計中沒有必要深刻理解這麼多,這些大都是由mfc內部自動幫我們完成的。實際mfc程式設計過程中,其實懂得mfc程式中各個函式的執行流程即可。有時候過於追究mfc細節會白白浪費我們的精力,應該將主要精力放在使用mfc解決實際問題上。二 vc6中...