?? 06.2.3 菜單命令的路由.txt
字號:
6.2.3 菜單命令的路由
這里,我們再給 Menu程序中的視類添加【 Tes t】菜單項的命令響應函數。添加完成
之后,可以發現,這時在程序的三個地方添加了與菜單命令消息響應函數相關的信息。首
先,在視類的頭文件中,在兩個AFX_MSG注釋宏之間添加了命令消息響應函數原型:然
后,在視類的源文件中有兩處信息,一處是在兩個 AF又MSG_MAP注釋宏之間添加了
ON_CO宏,將菜單E號與命令響應函數關聯起來。另一處是在視類源文件中的
命令消息響應函數的實現代碼。
11 MenuUiew.h : interface of the CMenuUiew class
11
111111111111111111111111111111111111111111111111111111111111111111
….. .
class CMenuUiew : public CUiew
f
protected: 11 create from serialization only
CMenuUiew();
DECl自RE DYHCRE自TE(CMenuUiew】
….. .
11 Generated message map functions
protected:
II{{自FX_MSG(CMenuUiew) / ①
afx_msg uoid OnTest();
II}}自FX MSG
DECl自RE MESS自GE_HAP()
J
};
, 11 MenuUiew.cpp : implementation of the CMenuUiew class
11
.include "stdafx.h"
囂include "Menu.h"
曾include "MenuDoc.h"
.include "MenuUiew.h"
.include "resource.h"
、.
1111111111111111111111111111111111111111111111111λ1111111
λ1111111111
11 CMenuU主ew
11咱 PlEMEHT_DYHCREATE(CHenuUiew. CUiew)
川自EGIH旺SSAGE_MAP(CI唱enuUie帽. CUie的
。"-""-CONIEEI"EM』tE
II{{自FE-"SE-H自P(CHenuUiew) /@
OH_COMMAHD( 1DT1_TEST . OnTest>
II}}AFX MSG MAP
11 Standard printing commands
BN-EOM"自HD(ID_FILE_PRIHT. CUiew::OnFilePrint)
飛F
<
ON-E。""自HD(ID_FILE_PRIHT_DIRECT. CUiew::OnFilePrint)
。"-E。""白"BEIB-FILE-PRENT-PREUIE", cui-MZZOnF11eFr1ntpreuieM》
END-"ESSasE-"自P()
飛V
….. .
戶
/@
.uoid CHenuUiew: :OnTest()
4
11 TODO:自dd your command handler code here
、》
168 I ~........川
可以發現,菜單命令消息響應函數的映射與第四章中介紹的標準消息的映射是一樣的,只是命令消息使用的是ON_COMMAND宏。不過,命令消息和標準消息的路由過程還是有所區別的,如圖6.8所示顯示了消息的路由過程。
圖 6.8命令消息的路由
MFC在后臺把窗口過程函數替換成了MxWndProc函數(讀者可以在MFC的源代碼中查看一下這個函數),由這個函數對所有的消息進行處理。該函數內部將調用 MxCallWndProc函數。后者又將調用 WindowProc函數,這是CWnd類的一個成員函數,應用程序所有類型的消息都會進入到這個函數中。 WindowProc函數又將調用OnWndMsg函數,這個函數會對到來的消息進行一個類型判斷,如果是標準消息,就利用第四章介紹的消息映射機制來查找是哪個類響應了當前這個消息,井調用相應的消息映射函數,完成對消息的處理:如果是命令消息,它就會交由OnCommand這個函數來處理,在這個函數中將完成命令消息的路由;如果是通告消息,那么它將交由OnNotify這個函數來處理,該函數將完成通告消息的路由。二者最后都會調用OnCmdMsg函數。
飛令·細由眉 WindowProc函數是CWnd類的一個成員函數。
下面,我們以 Menu這個程序為例,來看看菜單命令消息路由的具體過程z當點擊某
荒4再回'3t'f.'I凰Il'J'lIE恒霄'巳·恒囂咒何3U"l冀吼割的這個消息交給它的子窗口,即視類,由視類首先進行處理。視類首先根據命令消息映射機制查找自身是否對此消息進行了響應,如果響應了,就調用相應響應畫數對這個消息進行處理,消息路由過程結束z如果視類沒有對此命令捎息做出響應,就交由文檔類,文檔類同樣查找自身是否對這個萊單命令進行了響應,如果響應了,就由文檔類的命令消理,路由過程結束。如果文檔類也未做出響應,就把這個命令消息交還給視糞,后者又把該消息交還給框架類。框架類查看自己是否對這個命令消息進行了響應,如果它也沒有做出響應,就把這個菜單命令消息交給應用程序類,由后者來進行處理。這就是菜單命令的路由過程。
"‘I 169
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -