MFC框架流程(vc 深入詳解第3課)

2021-04-28 15:34:40 字數 1725 閱讀 1485

通過學習vc++深入詳解,加上vs提供的call stack工具,總結出mfc框架的大致流程:

3、然後afxwinmain呼叫initinstance,它又呼叫processshellcommand函式

4、視窗類的設計與註冊了:

首先,是呼叫cmainframe建構函式,然後呼叫其成員函式"loadframe來」開始視窗建立的引導。

為了滿足sdi文件的管理,由loadframe首先呼叫:

verify(afxdeferregisterclass(afx_wndframeorview_reg));

在視窗類建立之前都需要呼叫precreatewindow函式進行類的設計與註冊。當然,也可以完全用mfc為用        戶定義的預設style;而註冊則使用afxenddefregisterwindow函式,它呼叫我們耳熟能詳的 register

window進行註冊。

5、視窗的建立:

sdi文件管理的基礎打好之後,回到loadframe,正式呼叫create(lpszclass, lpsztitle, dwdefaultstyle, rectdefault,pparentwnd, makeintresource(nidresource), 0l, pcontext))函式,然後就是createex,create進行視窗的建立。它將建立所有mfc嚮導生成的預定視窗,包括框架視窗、client——view區、工具欄等。所以用除錯可以看到多個precreate--createex迴圈。

6、視窗的顯示:

最後回到了initinstance中執行:

m_pmainwnd->showwindow(sw_show);  

m_pmainwnd->updatewindow();

在教學中,第一章和第三章中都說過showwindow後要加個update,但是並未說明為何要加這個,以下就是msdn以及《programming   windows》書中對updatewindow的解釋。

msdn:

programming   windows:

causes   the   client   area   to   be   painted.   it   accomplishes   this   by   sending   the   window        

procedure   (that   is,   the   wndproc   function   in   hellowin.c)   a   wm_paint   message.   we'll          soon   examine   how   wndproc   deals   with   this   message.  

從解釋中可以知道這個函式主要負責client的paint。它通過傳送wm_paint這個訊息實現初始化時對not empty區域的重新整理,而且僅在初始化時執行一次。

7、訊息迴圈和視窗過程

當initinstance完成了它的使命之後,便回到了afxwinmain中繼續執行pthread->run();  通過檢視run的定義,可以知道頭尾中bidle是用來進行執行緒同步的(我猜的),而pumpmessage函式封裝了translatemessage和dispatch

message而完成訊息的**。

從wndcls.lpfnwndproc = defwindowproc; 看出這裡定義的是預設的視窗過程,但實際上mfc做了乙個訊息對映。

到此為止,其mfc完成了基本框架的架設。

深入分析MFC啟動流程

預設情況下,c語言一般都有main函式,可是在mfc程式裡面我們一般會發現不了main函式,其實這個是有的。注意 預設情況下。如在嵌入式領域,無論怎麼啟動,最終都會跳到乙個迴圈程式,當出現正常退出或者異常才會退出這個迴圈,執行緒處理函式一樣,所以main還是 tmain都是我們定義的入口函式,當然o...

VC 深入詳解 學習筆記

一 1 使用定義二進位制的值來定義相關的意義 如dword w cs hredraw cs vredraw 這樣就可以通過 或 運算來組合,同時要是不需要某個屬性可以通過 取反結合 與 運算來實現dword w cs hredraw cs vredraw dword h w cs verdraw 2...

VC 深入詳解筆記 引用

int a 5 int b a 用 表示申明乙個引用。引用必須在申明時進行初始化考慮下面 int a 5 int b a int c 3 b c 此處並不是將b變成c的引用,而是給b賦值,此時b和a的值都變成了3 引用只是乙個別名,是乙個變數或物件的替換名稱。引用的位址沒有任何意義,是所引用的變數或...