📄 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 + -