MFC的訊息過程

2021-05-26 21:42:49 字數 2318 閱讀 9175

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這種建立訊息。

afxwndproc過程:

所有的mfc視窗訊息都會被分派到這個函式。

1.首先是通過視窗控制代碼在視窗雜湊表afxmaphwnd中找到關聯的c++類。

2.若查詢不是,則呼叫::defwindowproc直接讓系統預設處理此訊息。

3.若查詢成功,則呼叫afxcallwndproc的呼叫過程。

1)設定一些執行緒資料。

2)呼叫虛函式windowproc進入到具體的視窗類視窗過程。內部呼叫onwndmsg處理windows的訊息。若訊息在onwndmsg中得不到處理。則defwindowproc交給系統處理。

(1)若是命令訊息wm_command呼叫虛函式oncommand 處理。

若是子控制項發過來的命令訊息。則通過reflectlastmsg先將訊息反射回子控制項。若子控制項沒有處理。再到訊息對映表中找對應的處理函式。若找到對應的函式,則執行。否則返回失敗。

(2)若是通知訊息wm_notify呼叫虛函式onnotify

處理過程跟oncommand基本上是一致的的。

(3) 其他的wm_標準訊息:則直接查詢訊息對映表。若查詢成功,則執行對映實體中指定的函式。否則返回失敗。

訊息棒:

應用程式初始化initinstance完成後,就會進入訊息迴圈run。

1)  peekmessage探測訊息佇列裡是否有訊息。若無則進入空閒處理onidle。預設處理是會向可見的框架視窗的子控制項(工具欄,狀態列)以及浮動的視窗傳送wm_idleupdatecmdui更新介面狀態。子控制項收到wm_idleupdatecmdui後,繼而會促發cn_update_command_ui的命令訊息來更新介面的check, radio, disable等狀態。

2)  若有訊息,則將訊息取出來。在訊息派發給視窗過程之前先呼叫afxpretranslatemessage讓應用程式有權先處理訊息,決定要不要將訊息派發到視窗過程。若訊息沒有被afxpretranslatemessage截斷。則對訊息進行轉化派發

::translatemessage

::dispatchmessage

派發過程中會呼叫mfc的視窗過程afxwndproc。

1)  使用者的輸入:滑鼠,鍵盤等訊息。

2)  系統核心促發的訊息。例如:wm_paint等訊息。

3)  程式postmessage傳送過來的訊息。

程式呼叫sendmessage的訊息會直接被派發到mfc視窗過程afxwndproc中,並不經過執行緒訊息佇列。

MFC的訊息反射

動態生成乙個按鈕cbutton,如何給該按鈕新增訊息處理,這就用到了訊息反射。學習mfc也一兩年了,今天發現自己只是記住方法,而不明白其中的道理。比如今天才知道,拖出乙個按鈕,利用mfc的wizard新增訊息處理函式,這個按鈕的訊息不是這個按鈕自己處理的,而是他的父窗體替他處理的,所以利用wizar...

MFC的訊息路由

windows中的訊息雖然很多,但是種類並不繁雜,大體上有3種 視窗訊息 命令訊息和控制項通知訊息。視窗訊息大概是系統中最為常見的訊息,它是指由作業系統和控制其他視窗的視窗所使用的訊息。例如createwindow destroywindow和movewindow等都會激發視窗訊息,還有我們在上面談...

MFC的訊息機制

今天重新整理mfc的訊息機制,最終的結果應該是利用win32程式模擬乙個mfc的訊息鏈。1.標準訊息 除wm command之外,所有以wm 開頭的訊息。從cwnd派生的類,都可以接收到這類訊息。2.命令訊息 來自選單 加速鍵或工具欄按鈕的訊息。這類訊息都以wm command呈現。在mfc中,通過...