5.2.2 映射菜单命令到成员函数
Windows提供了一套很复杂的消息传递机制,但这在MFC应用程序中实现起来是非常简单的。所有的消息都通过消息响应表映射到响应函数。程序员要做的不过是在响应表中加入消息映射项,然后提供一个消息响应函数。简单地说,在MFC中实现菜单命令的响应只需要做3件事,从代码上来看,这对应着3个部分的代码:
(1)在需要响应这个菜单命令的类的声明中添加一个响应函数的声明。
(2)在该类的实现文件中,为这个类的消息映射表添加这个菜单的映射宏。
(3)在该类的实现中,为响应函数添加实际的响应代码。
下面在5.2.1节中的MenuTest程序基础上为新建的菜单“子菜单”在视图类CMenuTestView中添加命令响应函数。
在IDE主菜单项中依次选择“View”→“ClassWizard”,打开“MFC ClassWizard”对话框,选择“Member Maps”选项卡,在“Project”下拉列表框中选择“MenuTest”,在“Class name”下拉列表框中选择“CMenuTestView”。
在“Object IDs”下拉列表框中选择要添加响应控件的ID,这里选择“ID_VIEW_SUB”。
在“Message”项中出现了两种类型的消息COMMAND(用于菜单命令)和UPDATE_COMMAND (用于更新菜单状态),这里我们选择的是COMMAND消息。
单击“Add Function…”按钮,再单击“OK”按钮就可以创建一个消息的处理函数On ViewSub(),创建好的“MFC ClassWizard”对话框如图5-5所示。
图5-5 “MFC ClassWizard”对话框
单击“Edit Code”按钮退出“ClassWizard”对话框,并自动定位在添加的函数上。
下面要做的是为这个菜单命令响应函数添加实际的响应代码。
void CMenuTestView::OnViewSub() { // TODO: 在此添加命令处理程序代码 MessageBox(_T("菜单测试!")); // 弹出消息说明命令的执行 } |
编译并运行这个程序,单击“视图”选中“子菜单”菜单项,如图5-6和图5-7所示。

下面看看上面说的3部分代码。看得出来,菜单命令的响应与鼠标、键盘消息的响应在结构上是一致的。找到头文件MenuTestView.h,其代码如下:
class CMenuTestView : public CView { ... public: afx_msg void OnViewSub(); // 第1部分,响应函数的声明 }; |
找到MenuTestView.cpp : CMenuTestView 类,其代码如下:
... // 消息事件响应映射 BEGIN_MESSAGE_MAP(CMenuTestView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_COMMAND(ID_VIEW_SUB, OnViewSub) // 第2部分,命令映射宏 END_MESSAGE_MAP() ... // CMenuTestView 消息处理程序 // 第3部分,响应函数的实现 void CMenuTestView::OnViewSub() { // TODO: 在此添加命令处理程序代码 MessageBox(_T("菜单测试!")); // 弹出消息说明命令的执行 } |
【责任编辑:
杨硕 TEL:(010)68476636-8001】