📄 06.2 菜单命令的路由.txt
字号:
6.2 菜单命令的路由
6.2.1 程序类对菜单命令的晌应顺序
是不是菜单项命令只能由 CMainFrame这个类来捕获呢?可以打开 ClassWizard对话框,在该对话框的对象 ID (Object IDs)列表中选择 IDM TEST,在 Class name下拉列表框中选择除 CMainFrame之外的其他类,例如 CMenuApp,单击【 Add Function..】按钮,发现同样可以为这个类添加菜单命令响应函数。接着在 Class name下拉列表框中选择 CMenuDoc,为这个类添加【 Test】菜单项响应函数。这时,系统会弹出一个对话框,询问是否保存刚才的操作,单击【是】按钮确定即可。然后,按照同样的方法,为 CMenuView类添加【 Test】菜单命令响应函数。这时,【 Test】这个菜单项就有了四个命令响应函数,那么在程序运行时,当单击这个【 Test】菜单项后,应该由哪个函数来响应呢?还是这四个函数都会响应?我们可以在这四个函数内部都加上一条 MessageBox函数调用,让这四个函数显示不同的提示信息。这样,在程序运行时,就可以根据弹出的消息框中显示的提示信息得知当前对【 Test】菜单命令作出响应的函数。
因为 CMenuApp类和 CMenuDoc类都不是从 CWnd类派生的,所以,它们都没有 MessageBox成员函数。我们可以使用全局的 MessageBox函数,或者使用应用程序框架的函数: AfxMessageBox,这里,我们使用后者。 AfxMessageBox函数的原型声明如下:
int AfX蜘~.ag.~Qxil回归咽 lp24旺tL O'INT nT.}穷豆豆旦EJOL uzm n I1旦旦旦ι且 ) I
可以看到, AfxMessageBox函数的后两个参数有默认值,因此只需要给第一个参数赋值就可以了。为 CMenuApp类的 OnTest函数添加下面这行代码:
AfxMessageBox("App Clicked!");
接着给 CMenuDoc类的 OnTest函数添加下面这行代码=
AfxMessageBox("Doc Clicked! ‘) ;
因为 CMenuView类是直接从 CWnd类派生的,所以可以直接使用 MessageBox函数,' 给视类的 OnTest函数添加下面这行代码:
MessageBox("View Clicked");
Build并运行 Menu程序,当我们单击程序的【 Test】菜单项时,将会看到弹出的对话框上提示信息: "View Clicked!",这就是说,视类最先响应这个菜单命令。在我们关闭这个提
示信息对话框后,发现没有其他信息显示,说明其他几个菜单命令响应函数没有起作用。
下面,我们将视类的 OnTest响应函数删除,再次运行程序,读者可以认为现在会是哪个类响应【 Test】这个菜单命令呢?这时,我们会发现是文档类做出了响应。接着,再把文档类的 OnTest函数删除,再次运行程序,并单击【Test】菜单项,这时,我们发现是框架类对此菜单项做出了响应。然后,也将框架类的 OnTes t响应函数删除,再次运行程序,单击【 Tes t】菜单项,发现最后一个对此菜单项做出响应的是应用程序类 : CMenuApp。最后,将这个类的 OnTes t函数也删除。
根据上述试验,可以得知,响应【 Test】菜单项命令的顺序依次是:视类、文档类、框架类,最后才是应用程序类。
国际:删除菜单命令响应函数的方法同第四章中介绍的删除消息响应函数
的方法相同,即用鼠标右键羊击 ClassView选项卡上需要删除的函数,然后从
弹出的快捷菜单上选择 [Delete 1命令即可。这样就会把程序中与该菜单命令
响应函数有关的信息全部删除。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -