图3-28 资源快捷菜单
图3-29 添加资源对话框
VS就会自动添加一个ID为IDR_MENU1的空菜单,并打开菜单编辑器窗口,参见图3-30中部。在选中IDR_MENU1后,还会打开“菜单节点”属性窗口,参见图3-30右部。
2.修改菜单ID
在右边的“菜单节点”属性窗口的ID栏中,对默认的ID符号常量(如IDR_MENU1)进行修改(如改为IDR_EDIT_MENU,参见图3-30),按回车键完成修改。
图3-30 修改快捷菜单ID
3.编辑菜单
在菜单编辑器窗口中,可键入顶层的快捷菜单名,然后再加入其他菜单项。例如,Student例中的菜单名为“编辑(&E)”,添加了四个菜单项(包括一个分隔条)(同默认菜单条上的“编辑”菜单,参见表3-3):
注意:其中的ID都是默认菜单中已有的,直接在ID列表中选择即可,也不用自己输入提示串(选中ID后,会自动出现提示串),而且也不用设置快捷键(已被默认菜单设置)。
36
表3-3 编辑菜单项的属性值
菜单项 属性 撤消 分隔条 剪切 复制 粘贴 Caption ID Prompt 撤消(&U)\\tCtrl+Z ID_EDIT_UNDO 撤消上一操作\\n撤消 剪切选定内容并将其放到剪贴板上\\n剪切 复制选定内容并将其放到剪贴板上\\n复制 剪切(&T)\\tCtrl+X ID_EDIT_CUT 复制(&C)\\tCtrl+C ID_EDIT_COPY 粘贴(&P)\\tCtrl+V ID_EDIT_PASTE 插入剪贴板内容\\n粘贴 为了省事,也可以不使用资源编辑器一个一个地添加菜单项,而直接以文本方式打开资源脚本文件(需先关闭资源编辑器),在顶层菜单资源后添加如下代码(其中的编辑菜单部分可以从顶层菜单资源中复制):
IDR_EDIT_MENU MENU
BEGIN // 以下同主菜单中的“编辑”菜单
POPUP \编辑(&E)\
BEGIN
MENUITEM \撤消(&U)\\tCtrl+Z\ MENUITEM SEPARATOR
MENUITEM \剪切(&T)\\tCtrl+X\ MENUITEM \复制(&C)\\tCtrl+C\ MENUITEM \粘贴(&P)\\tCtrl+V\ END END
关闭资源文件后,再打开资源编辑器,可以看到添加的“编辑”(快捷)菜单的结果,如图3-31 a)所示。
a) 资源 b) 运行 图3-31 “编辑”快捷菜单
37
3.4.2 使用快捷菜单
1.具体步骤
下面是添加弹出快捷菜单响应的具体步骤:
? 在项目工作区类视图页中选中应用程序的视图类(如Student例为CStudentView)。 ? 在属性窗口中按其工具条上的消息按钮
,切换到消息页。
? 滚动属性窗口中的消息内容,找到WM_CONTEXTMENU消息项;单击其右边的
空白栏,出现下拉式列表框;单击其右端的OnContextMenu”选项。
? 选中该选项,系统会自动创建视图类的上下文菜单消息响应函数OnContextMenu,
并自动打开代码文件,定位到该函数。
? 去掉此函数两个输入参数中的注释符号“/*”和“*/”。
? 在“// TODO: 在此处添加消息处理程序代码”后,添加响应代码(包括创建菜单
对象、装入菜单资源、显示弹出菜单等)。
钮,出现唯一的“
2.弹出代码
例如,Student例中弹出菜单的响应函数为(粗体为新加的代码部分):
void CStudentView::OnContextMenu(CWnd* pWnd, CPoint point) {
// TODO: 在此处添加消息处理程序代码 CMenu menu;
menu.LoadMenu(IDR_EDIT_MENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |
TPM_RIGHTBUTTON, point.x, point.y, this);
}
则编译运行后,用户在应用程序的客户区中按鼠标右键,就会在光标处弹出编辑快捷菜单,参见图3-31 b)。
38
3.跟踪弹出菜单函数
在上面的代码中,使用了CMenu类的成员函数TrackPopupMenu(跟踪弹出菜单),其原型为:
BOOL TrackPopupMenu( // 成功时返回TRUE
UINT nFlags, // 对齐方式参数
int x, // 菜单位置的x坐标,依赖于对齐方式 int y, // 菜单顶的y坐标 CWnd* pWnd, // 父窗口 LPCRECT lpRect = 0 // 被忽略 );
其中,参数nFlags取值(对齐方式):
? TPM_CENTERALIGN(菜单与x水平中对齐) ? TPM_LEFTALIGN(菜单的左边框与x对齐) ? TPM_RIGHTALIGN(菜单的右边框与x对齐) ? TPM_LEFTBUTTON(只能使用左鼠标键选择菜单项) ? TPM_RIGHTBUTTON(可使用左右鼠标键选择菜单项)
3.4.3 默认快捷菜单
如果是在VC10中创建默认的MFC程序(不是传统的单文档MFC程序),则生成的是(类似于Visual Studio 2008 IDE的)具有多个窗格的选项卡式多文档界面的应用程序,参见图3-32,其各功能区本身就支持多种弹出式快捷菜单。
图3-32 具有多个窗格的选项卡式多文档界面的MFC应用程序
39
例如在其左窗格的“文档视图”页和“类视图”页中的快捷菜单(ID值为IDR_POPUP_EXPLORER和IDR_POPUP_SORT)如图3-33 a)和b)所示,在其右窗格的“属性”页中或各窗格的标题条上的快捷菜单如图3-33 c)所示,而在其下窗格的“输出”窗口中的快捷菜单(ID值为IDR_OUTPUT_POPUP)则如图3-33 d)所示,在主窗口的菜单条和工具条及窗格中的工具条上的快捷菜单如图3-33 e)所示,在选项卡子窗口中的编辑快捷菜单(ID值为IDR_POPUP_EDIT)如图3-33 f)所示。
a)
b)
c)
d)
e)
f)
图3-33 默认快捷菜单
复习思考题
1. 与工具条和快捷键相比,菜单有什么优缺点? 2. 菜单可以怎样分类?
3. 菜单项由那些部分构成?省略号和三角形各表示什么? 4. 给出访问键和快捷键的英文和别称。
5. 如何启用访问键和快捷键?如何设置访问键和快捷键? 6. 菜单项ID是什么?有什么用处?定义在哪里? 7. 菜单条属于什么窗口?如何获取该窗口的对象? 8. 菜单条和(弹出)菜单对于什么MFC类?
40