MFC內部結構剖析

2021-06-19 16:48:32 字數 1899 閱讀 6777

mfc內部結構剖析 //

mfc程式的執行順序依次是

程式在載入main函式之前,會先為全域性變數和全域性物件分配記憶體空間。

afxwinmain函式

:winmain函式實際上是通過呼叫afxwinmain函式來完成它的功能的。

afxwinmain呼叫afxgetthread函式獲得乙個cwintread型別的指標。

cwinthread* afxapi afxgetthread()

複製**

initinstance函式

: mfc框架視窗

1.設計和註冊視窗:

mfc已經為我們預定義了一些預設的標準視窗類,只需呀選擇所需的視窗類,然後註冊就可以了。

視窗類的註冊由afxenddeferregisterclass函式完成(afxenddeferregisterclass函式首先判斷視窗類的型別,然後賦予其相應的類名,這些類名是mfc預定義的,然後呼叫afxregisterclass函式註冊視窗類)。

afxregisterclass函式首先獲得視窗類的資訊,如果該視窗已經註冊,則直接返回乙個真值;如果尚未註冊,就呼叫registerclass函式註冊該視窗類(註冊視窗類使用的函式其實和win32 sdk程式設計中所使用的函式一致)。

我們所建立的這個mfc應用程式test,實際上有兩個視窗。

其中之一:cmainframe:: precreatewindow,這是在視窗產生之前被呼叫的。cmainframe:: precreatewindow函式又呼叫了afxdeferregisterclass,而afxdeferregisterclass實際上是乙個巨集,指向afxenddeferregisterclass(前面提到,此函式的功能就是註冊視窗類)。

2.建立視窗:

視窗的建立是由cwnd類的createex函式實現的。(宣告:afxwin.h實現:wincore.cpp)

(在mfc的底層**中cframewnd::create呼叫了上述的createex函式,而cframewnd:: loadframe又呼叫cframewnd::create函式。此過程請自行跟蹤。)

cwnd::createex呼叫cmainframe:: precreatewindow(precreatewindow是乙個虛函式,所以這裡實際上呼叫的是子類,即

cmainframe:: precreatewindow。這裡再次呼叫此函式是為了在產生視窗之前讓程式設計師有機會修改程式的外觀。例如,去掉視窗最大化按鈕等)

3.顯示和更新視窗

m_pmainwnd是乙個cwnd型別並且儲存了應用程式框架視窗物件的指標,也就是說m_pmainwnd變數是乙個指向cmainframe物件的指標。

m_pmainwnd->showwindow(sw_show);

m_pmainwnd->updatewindow();

這兩行**實現了視窗的顯示和更新。

訊息迴圈

cwinthread::run函式完成訊息迴圈。

該函式由afxwinmain::pthread函式呼叫。

形式:pthread->run();

cwinthread::run函式主要是乙個for迴圈,該迴圈在收到乙個wm_quit訊息時退出。在此迴圈中呼叫了乙個pumpmessage函式。

視窗過程函式

afxenddeferregisterclass函式源程式:wndcls.lpfnwndproc = defwindowproc

這裡指定的乙個預設視窗過程defwindowproc。但實際上mfc程式並不是把所有的訊息都交給defwindowproc這一預設視窗過程來處理。而是採用了一種「訊息對映機制」。

///梳理全過程

4.進入訊息迴圈。雖然也設定了預設的視窗過程函式,但是,mfc應用程式實際上採用訊息影射機制來處理各種訊息的。當收到wm_quit訊息時,退出訊息迴圈,程式結束。

///

MFC內部結構剖析

mfc程式的執行順序依次是 程式在載入main函式之前,會先為全域性變數和全域性物件分配記憶體空間。afxwinmain函式 winmain函式實際上是通過呼叫afxwinmain函式來完成它的功能的。afxwinmain呼叫afxgetthread函式獲得乙個cwintread型別的指標。cwin...

二,String型別內部結構剖析

原形 class string 普通建構函式 string string const char str else string的析構函式 string string void 拷貝建構函式 string string const string other 得分點 輸入引數為const型 賦值函式 s...

HBase內部結構

table表 就是有乙個或者多個列族組成,加上之前的 使用,這個表概念應該很熟了 row行 乙個行包括了多個列,這些列通過列族來分類 column family列族 列族是多個列的集合,hbase會盡量的將乙個列族的列放入同乙個伺服器內,這樣可以提高訪問效能,並且可以批量管理有關聯的一堆列,所有的資...