通過學習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 引用只是乙個別名,是乙個變數或物件的替換名稱。引用的位址沒有任何意義,是所引用的變數或...