mfc程式的執行過程:
(4)進入訊息迴圈。雖然也設定了預設的視窗過程函式,但是mfc應用程式實際上是採用訊息對映機制來處理各種訊息的。當收到wm_quit訊息時,退出訊息迴圈,程式結束。
面已經知道,在乙個windows程式中,winmain函式作為程式的入口函式,乙個程式的是:設計視窗(給視窗設定相應的屬性)-->註冊視窗-->建立視窗-->顯示並且更新視窗-->訊息迴圈;
但是當建立乙個mfc程式時候,並沒有看到winmain函式之類的東西,並且之前的程式框架與mfc也大有不同。現在,先來看看mfc中的程式框架以及程式執行機制吧。
由於mfc是對其sdk的封裝,所以程式執行邏輯方式應該是一樣的。
在mfc程式中,同樣還是有winmain函式參與,但是這個winmain函式是在程式編譯連線時,由鏈結器將該函式鏈結到程式的。知道winmain的存在後,那麼winmain又是怎麼跟其他類組織在一起的呢?
設計和註冊視窗:mfc已經為我們預定義了一些預設的標準視窗類,而註冊視窗類是由afxenddeferregisterclass函式完成。(afxenddeferregisterclass函式首先獲得視窗類的資訊,如果該視窗類已經註冊,直接返回乙個真值,否則,呼叫registerclass函式註冊該視窗類。其與win32sdk中所使用的函式是一樣的啊!)
建立視窗:視窗的建立是由cwnd類中的createex函式實現的,在mfc中,cframewnd類的create函式內部呼叫了上述的createex函式,而前者又是由cramewnd中的loadframe函式呼叫!!!在createex函式的實現過程中,呼叫了precreatewindow,而後者是乙個虛函式,故此呼叫是呼叫子類的precreatewindow函式,之所以這樣是在視窗產生之前讓程式設計師能夠有機會修改視窗的外觀。引數型別是乙個createstruct結構體。
訊息迴圈:前面已經提到過pthread->run();這個函式就是實現了訊息迴圈。在這個函式中的for迴圈中,執行了我們認識的translatemessage與dispatchmessage兩個函式;
視窗過程:在afxenddeferregisterclass函式的源程式中,其中有一行言謝眼熟的**:wndcls.lpfnwndproc=defwindowproc;當然mfc程式並不是把所有的訊息都交給defwindowproc視窗過程來處理。mfc中使用的是訊息對映機制!
標頭檔案中在兩個afx_msg 注釋巨集之間是訊息響應函式的原型的宣告。原始檔中有兩處:
(1)afx_msg_map注釋巨集之間的訊息對映巨集,通過這個巨集把訊息與訊息響應函式關聯起來;
(2)原始檔中訊息響應函式的實現**。
mfc中的訊息對映機制的實現方法:在每個能接收和處理訊息的類中,定義乙個訊息和訊息的處理函式靜態對照表,即訊息對映表。在訊息對映表中,訊息與對應的訊息處理函式指標成對出現。某個類能處理的所有的訊息及其對應的訊息處理函式的位址都列在這個類所對應的靜態表中。當有訊息需要處理時,程式只要搜尋該訊息靜態表,檢視表中是否函式該訊息,就可以知道該內能夠處理此訊息。如果能,則依照靜態表找到對應的訊息處理函式。否則,將訊息傳給其父類。;}
④ nreturncode = pthread->run();
initfailure:
#ifdef _debug
// check for missing afxlocktempmap calls
if (afxgetmodulethreadstate()->m_ntempmaplock != 0)
afxlocktempmaps();
afxunlocktempmaps(-1);
#endif
afxwinterm();
return nreturncode;}
上面**中,pthread
和呼叫了三個函式。
首先呼叫
函式,該函式完成mfc內部管理方面的工作。接著,呼叫pthread的initinstance函式。最後pthread呼叫run()。
run()如果返回特定值,則程式結束,也就是winmain結束。
第三步
MFC框架程式剖析
1 mfc microsoftfoundation class,微軟基礎類庫 是微軟為了簡化程式設計師的開發工作所開發的一套c 類的集合,是一套物件導向的函式庫,以類的方式提供給使用者使用 二 基於mfc的程式框架剖析 1 mfc程式的classview標籤頁 圖 2 繼承關係 1 cmainfra...
三 MFC框架程式剖析
1.cwnd 類 cwnd 類是mfc中乙個重要的類,它封裝了與視窗有關的操作。2.mfc 中的winmain mfc全域性物件 5.afxwinmain 函式 winmain 6.設計和註冊視窗 mfc已經為我們預定義了一些預設的標準視窗類,只需要選擇所需的視窗類,然後註冊就可以了。視窗類的註冊是...
MFC框架程式剖析 3
我們來看下我們建立的視窗 視視窗對應的是ctestview類,而主框架視窗對應的就是cmainframe類,而cmainframe和ctestview都有共同乙個基類cwnd,它封裝了與視窗相關的操作。此外,還有個ctestdoc類,不過它並不是乙個視窗類,而是乙個文件類。最後,caboutdlg類...