extern "c" int winapi
_twinmain(hinstance hinstance, hinstance hprevinstance,
lptstr lpcmdline, int ncmdshow)
int afxapi afxwinmain(hinstance hinstance, hinstance hprevinstance,
lptstr lpcmdline, int ncmdshow)
nreturncode = pthread->exitinstance();
goto initfailure;
} nreturncode = pthread->run();
initfailure:
afxwinterm();
return nreturncode;
}
視窗的建立會有乙個問題,我們希望整個訊息通過我們的訊息執行環境處理環境。然而,因為我們的訊息處理是乙個類成員函式,並且訊息還沒有迴圈還沒有完整的建立起來。整個frame和view的訊息迴圈還沒有加到整個訊息迴圈當中去。所以在建立的時候需要hook一下,讓wndclass的訊息處理函式指標指向我們的全域性訊息處理函式。然後在訊息處理函式當中呼叫我們的類成員函式進行實際的訊息處理。
mfc 視窗訊息流程:
mfc把
windows
的視窗控制代碼
hwnd
封裝成乙個
cwnd
類,每個
mfc視窗類
(對話方塊除外)的
create
最終都是會呼叫基類的
cwnd::createex
過程。在
cwnd::createex
過程中:
1) 呼叫
precreatewindow
虛函式允許使用者在視窗建立之前修改視窗的相關屬性。
2) 呼叫
afxhookwindowcreate
安裝視窗建立鉤子
wh_cbt
: _afxcbtfilterhook (
目的在於將視窗過程替換成
afxwndproc)
。3) 呼叫
::afxctxcreatewindowex
系統建立建立視窗。視窗建立過程中的訊息被轉移
_afxcbtfilterhook
過程。4) 視窗建立完畢後。呼叫
afxunhookwindowcreate
將視窗建立鉤子
wh_cbt
從鉤子鏈中移除。之後的視窗訊息就會被分派到
mfc的視窗過程函式
afxwndproc
中。_afxcbtfilterhook過程:
1) 將建立的
c++類物件與視窗控制代碼關聯。
2) 調到虛函式
presubclasswindow
允許使用者在視窗關聯後做一些額外的事情。例如:修改樣式
modifystyle
。 這是視窗建立後修改資料的最佳之處。無論是
create,
還是通過對話方塊
dodataexchange
關聯的視窗類。都會呼叫到這個函式。
建立方式
precreatewindow
presubclasswindow
oncreate
create 是
是 是subclasswindow 否
是 否對話方塊模板建立的控制項跟隨對話方塊一起建立。這期間並沒有關聯c++
物件。控制項控制代碼與
c++物件的關聯是在
dodataexchange
中完成的。而此時視窗已經建立完成。固然子類化不可能再收到
wm_create
這種建立訊息。
mysql解析流程 mysql執行流程解析
mysql 可以分為 server 層和儲存引擎層兩部分 server 層包括聯結器 查詢快取 分析器 優化器 執行器等,涵蓋 mysql 的大多數核 心服務功能,以及所有的內建函式,所有跨儲存引 擎的功能都在這一層實現,比如儲存過程 觸發器 檢視等 而儲存引擎層負責資料的儲存和提取。其架構模式是外...
MFC建立視窗流程
乙個mfc程式框架 2 框架類 cframewnd 流程 2 在程式入口函式實現 initinstance 1 給框架類物件動態分配空間 自動呼叫它的建構函式 框架類myframe物件建構函式裡建立視窗create 2 框架類物件顯示視窗showwindow 3 框架類物件更新視窗updatewin...
MFC框架程式解析
mfc的 程式框架 mfc訊息對映機制的具體實現方法 在每個能接收和處理訊息的類中,定義乙個訊息和訊息函式靜態對照表,在訊息對映表中,訊息與對應的訊息處理函式指標式成對出現的。某個類能處理的所有訊息及其對應的訊息處理函式的位址都列在這個類所對應的靜態表中。當有訊息需要處理時,程式只要搜尋該訊息靜態表...