📄 06.4.4 动态添加的菜单项的命令晌应.txt
字号:
6.4.4 动态添加的菜单项的命令响应
上面我们对菜单项进行的命令响应,都是针对静态创建的菜单项,即在程序的菜单资源中己经存在的菜单项标识,利用 ClassWizard为某个类添加该菜单项的响应函数。但对于动态添加的菜单项,在程序运行之前,它们的标识是不知道的,在 ClassWizard找不到它们的ID.那么如何为它们添加命令响应函数呢?
下面以刚才为Menu2程序添加的Test子菜单下的Hello菜单项为例,来看看如何为动态添加的菜单项添加命令消息响应函数。
首先,应该为这个菜单项创建一个菜单资源D。在Menu2工程的FileView选项卡上,打开HeaderFiles目录,将看到其中有一个Resource.h文件,这个文件中定义了程序当前使用的一些资源的田,我们可以手工在其中为Hello菜单项添加一个新ID,例如:
#define IDM_HELLO 111
这样, Menu2程序就有了一个名为IDMHELLO的囚,在程序中可以为【Hel10】菜单项使用这个ID了,即把上述例 6-27所示代码中添加Hello菜单项的那条AppendMenu语句(食符号所在那行代码)修改为下面这行语句:
menu.AppendMenu(MF_STRING,IDM_HELLO, "Hello" ) ;
接着,就可以为这个菜单项添加命令消息响应函数了。这种情况下的命令响应一样要遵循 MFC的消息映射机制,即需要添加三处代码来实现命令消息的响应。因此,可以按照以下三步来完成Hello菜单命令消息的响应。
①在响应这个菜单项命令的程序类(本例中是CMainFrame类〉的头文件中添加响应函数原型,添加的位置应该是在声明消息映射宏 (DECLARE_MESSAGE_MAP)之上,两个AFX_MSG注释宏的后面,也就是说,结果应该如例 6刽所示代码中加灰显示的代码。
例6-28
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // NOTE -the ClassWizard will add and remove member functions here . // DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG afx_msg
void OnHello();
DECLARE_MESSAGE_MAP()
我们可以遵循MFC命名习惯,在菜单项名称的前面加上On来命名该菜单命令响应函数。因此,这里Hello菜单项的响应函数名称可以命名为OnHello。当然这只是一种习惯,并不是规定函数名一定要这样来命名。
再在响应这个菜单项命令的程序类的源文件中的消息映射表中添加消息映射。添加位置应该是在BEGIN_MESSAGE_MAP和 END_MESSAGE_MAP宏之间,在两个AFX MSG_MAP注释宏之后,井且菜单命令消息的映射宏是ON_COMMAND宏,因此,添加
之后的代码如例6-29所示。
例 6-29
BEGIN_MESSAGE_MAP(CMa工nFrame, CFrameWnd)
// {{AFX_MSG_MAP(CMa工nFrame) // NOTE -the C1assWizard w工11 add and remove mapping macros here. // DO NOT EDIT what you see in these b10cks of generated code !
ON_WM_CREATE ()
// }}AFX_MSG_MAP
ON_COMMAND(IDM_HELLO,OnHello)
END_MESSAGE_MAP()
目' 提示:手工在消息映射表中添加消息映射时,一定要记住:机制不要
加分号。(!]实现菜单命令消息响应函数的定义体。可以在 CMainFrame类的源文件中添加如例6-30所示的代码。例6-30
void CMainFrame: : OnHello()
MessageBox("Hello") ;
Build井运行Menu2程序,打开【Test】子菜单,将会发现【Hello】菜单项现在可以使用了。单击该菜单项,即可弹出一个消息提示对话框,显示文字: Hello。
这样,就完成了为动态添加的菜单项添加命令响应函数的功能。刚开始,读者可能会觉得做这项工作有些困难,这里,笔者为读者提供一个小技巧,可以先利用 C1assWizard对程序中某个己有的静态菜单项添加命令消息响应,然后模仿 C1assWizard在程序中为其添加的内容来完成为动态菜单添加命令响应函数这一任务。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -