菜單命令的路由

一、windows消息分類

 

標準消息:除了WM_COMMAND之外,所以以WM_開頭的消息都是標準消息。從CWnd派生的類都可以接收到這類消息

命令消息:來自菜單或者工具欄按鈕的消息。這類消息都是以WM_COMMAND形式呈現。在MFC中,通過菜單項的標識(ID)來區

分不同的命令消息;在SDK中,通過消息的wParam參數識別。從CCmdTarget派生的類,都可以接收到這類消息;

通告消息:由控件產生的消息,例如按鈕的單擊、列表框的選擇都會產生這類消息,目的是爲了向其父窗口(通常是對話框)通知事件的發

生。這類消息也是以WM_COMMAND形式呈現的。從CCmdTarget派生的類都能響應這類消息。


從MSDN提供的MFC層次結構圖中可以發現,CWnd類實際上派生於CCmdTarget類,即CMnd是子類,CCmdTarget是父類。父類能接受命令消息和通告消息。CWnd類除了能接受命令消息外還能接受標準消息。

二、各種消息路由的差別

 仔細對比在OnWndMsg這一步驟之前,都和標準消息的映射是一樣的。只是命令消息適用的ON_COMMAND宏。

詳細的,首先由AfxWndProc函數接收操作系統發出的消息,由這個消息對所有的消息進行處理;然後函數AfxWndProc調用函數

AfxCallWndProc進行消息處理,這裏一個進步是把對句柄的操作轉換成對CWnd對象的操作;函數又AfxCallWndProc調用CWnd類的方法

WindowProc進行消息處理;WindowProc調用OnWndMsg進行正式的消息處理,即把消息派送到相關的方法中去處理。這個函數會對到來的

消息進行一個類型判斷,如果是標準消息,就利用MFC消息映射機制來查找時哪個類響應了當前這個小心,並調用相應的消息映射函數,完

成對消息的處理;如果是命令消息,它就會交由OnCommand這個函數來處理,在這個函數中完成這個消息的路由;如果是通告消息,它將

交由OnNotify這個函數來處理,該函數完成通告消息的路由。二者最後都會調用OnCmdMsg函數。


三、菜單消息命令路由

具體過程:當點擊某個菜單項時,最先接收到這個菜單命令消息的是框架類。框架類將把接收到的這個消息交給它的子窗口,即視類,由視類首先進行處理。視類根據命令消息映射機制查找自身是否對此消息進行了響應,如果響應了,就調用響應響應函數對這個消息進行處理,消息路由過程結束。如果視類沒有對此命令響應,就交由文檔類,文檔類同樣查找自己是否對此消息進行了響應,如果響應了,就調用響應響應函數對這個消息進行處理,消息路由過程結束。如果文檔類沒有做出響應,再把這個命令消息交還給視類,後者又把該消息交還給框架類。框架類再查找.....如果框架類也沒有響應,則交給應用程序類,由後者進行處理。


可知,父類先接受消息,子類先處理響應。


發佈了11 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章