03界面编程1-菜单
第3章界面编程1-菜单
Windows应用程序开发的基础是GUI的设计与编程,GUI包括Windows API提供的窗口、菜单、对话框和控件等基本界面元素,以及MFC提供的工具栏和状态栏等组合控件,还有键盘和鼠标等消息响应与事件驱动。这些内容将在本书的第3~7章中逐个加以讨论,本章介绍菜单的设计与编程。
3.1 菜单
菜单(menu)是传统GUI程序的主要命令接口,可用键盘和鼠标来访问。虽然菜单是基于文字串的,但是相对于(可视方便的)工具条和(直接快速的)快捷键,菜单所提供的程序功能更为完整和全面。
默认的传统MFC应用程序,会在主框架窗口中自动生成一个菜单条(menu bar)。菜单条也叫顶层菜单(top-level menu),一般包含文件、编辑、查看、窗口、帮助等若干下拉式弹出菜单。
3.1.1 菜单与菜单项
菜单可分为包含若干菜单项的弹出菜单和发送命令消息的菜单项两大类,可以用键盘和鼠标这两种输入设备来访问菜单和菜单项(以下简记为“菜单[项]”)。
1.菜单
弹出菜单(pop-up menu,简称为菜单)包含若干菜单项,一般处于(诸菜单项都不可见的)关闭状态。只有在用户(通过菜单名或按鼠标键)激活菜单时,才由操作系统弹出来显示。并在用户通过选中菜单里的某个菜单项而发送对应的命令消息之后,又被操作系统自动关闭。
(弹出)菜单又可以进一步分成(菜单条中的)下拉菜单(drop-down menu)和(按鼠标右键后在光标处弹出的)快捷菜单(shortcut menu),参见图3-1 a)。弹出菜单中还可以包含若干(多级)子菜单,由其对应的(右端带的)菜单项激活,参见图3-1 b)。
a) 弹出菜单的种类b) 多级子菜单
图3-1 菜单与菜单项
2.菜单项
菜单项(menu item)用于发送程序的命令消息,一般由位于左端的图标或(表示选中的)勾符、简述命令功能的标题(caption)串、唯一标识资源的ID、详细说明命令功能的提示串、对应的加速键资源和事件处理函数等多个部分组成。
其中的标题字符串又可包括:菜单名串、访问键、加速键指示串、(表示会弹出一个对话框)省略号“...”和(由系统在弹出菜单时自动生成的,表示对应于子菜单的右向黑三角)等内容,例如“打开(O)…Ctrl+O”、“工具栏(T)”、“类型(T) ”等,参见图3-1。
3.ID
菜单项和其他所有的Windows资源一样,都有ID(IDentifier,标识符)。ID是一个(在全程序中具有唯一性的)非负整数,用于识别资源,供程序代码使用。在Windows编程中,为了便于人类阅读,ID通常是用(以下划线分隔的大写字母单词串组成的)符号常量来表示,如ID_FILE_OPEN。不过,在MFC编程中,一般不需要程序员手工编写符号常量ID 的#define宏定义,而是在程序员设置资源的ID属性时,由资源编辑器自动生成。MFC应用程序中的所有ID定义,都位于项目目录下的资源头文件resource.h内。
4.菜单类与对象
在MFC类库中,菜单条和菜单都由CMenu类表示,它是对Windows菜单对象HMENU 的类封装。CMenu类是直接从CObject的类派生的:
CObject→CMenu
但是在MFC编程中一般不需要直接使用该类,除非你需要动态添加或修改菜单[项]。
菜单对象属于主框架窗口,可先用从基类CWnd继承来的GetMenu函数
CMenu* GetMenu( ) const;
获得菜单条对象的指针(只是临时的,不能保存供以后使用),再用菜单类的成员函数GetSubMenu
CMenu* GetSubMenu( int nPos ) const;
来获取指定的下拉式弹出菜单,其中nPos为菜单(从0开始计数的)位置序号。
若想在视图类中获得程序的菜单对象,则必须先得到主框架窗口的指针,这可以使用从基类CWnd继承来的GetTopLevelFrame成员函数:
CFrameWnd* GetTopLevelFrame( ) const;
例如:
CFrameWnd *pFrmWnd = GetTopLevelFrame(); // 获取主框架窗口
CMenu *pMenu = pFrmWnd->GetMenu(); // 获取菜单条
CMenu *pSubMenu = pMenu->GetSubMenu(3); // 获取第4个菜单
3.1.2 访问键和快捷键
访问键和快捷键都可用于菜单的快速键盘访问。
1.访问键
访问键(mnemonic key,助记键)也叫热键(hot key)是菜单[项]标题字符串中出现的(可用对应的键盘按键快速访问的)带下划线的字符(一般为大写英文字母),例如菜单条上“文件(F)”菜单中的字母“F”和文件菜单中的“另存为(A)”菜单项的字母“A”。
访问键的使用方法有如下两种:
●按“Alt+访问键”,可“选中”当前窗口菜单条上访问键所对应的菜单[项],例如按
“Alt+F”会打开“文件(F)”菜单。
●按“访问键”本身,可“选中”当前已展开菜单中其所对应的菜单项,例如在已经
打开的文件菜单中,按“A”会选中“另存为(A)...”菜单项,从而打开对应的“另存
为”对话框。
2.快捷键
快捷键(shortcut key)又叫加速键(accelerator key),是由菜单项标题串右端指明的功能键组合,一般为Ctrl/Alt/Shift+大写英文字母或功能键Fn。用快捷键可以直接访问当前窗口的任意菜单项(不论其所在的[子孙]菜单是否被展开),例如按“Ctrl+O”可以直接选中(尚未打开的)文件菜单中的“打开(O)... Ctrl+O”菜单项以打开对应的“打开”对话框。
需要注意的是,在MFC编程中,菜单项的快捷键并不是由其标题中的指示串决定的,而是由项目的加速键资源决定的。因此,在设置完菜单项的各种属性之后,程序员还必须使用IDE的快捷键编辑器来将二者关联在一起。
3.1.3 默认菜单
用MFC应用程序向导建立应用程序时,若选择的是单文档或多文档类型,而不是基于对话框类型,则会自动建立预定义的菜单条。
1.单文档程序
传统的单文档界面MFC应用程序只有一个菜单条,默认时含“文件”、“编辑”、“查看”、“帮助”4个下拉菜单(参见图3-1 a)),菜单条的ID为IDR_MAINFRAME(主框架的资源ID)。
2.多文档程序
传统的多文档界面MFC应用程序有两个菜单条:
●主框架菜单条:在程序刚启动或没有任何文档子窗口时显示,默认时含“文件”、
“查看”、“帮助”3个下拉菜单,菜单条的ID也为IDR_MAINFRAME。
●文档菜单条:在程序有文档子窗口时显示,默认时含“文件”、“编辑”、“查看”、
“窗口”、“帮助”5个下拉菜单(增加了一个“窗口”下拉菜单),ID为IDR_*TYPE,其中*表示应用程序的项目名,例如IDR_TestTYPE。
3.1.4 菜单资源
在MFC应用程序项目中,菜单资源和其他资源一样,都是以文本方式存在于资源脚本
文件中,而对应的资源ID则被定义在资源头文件中。
在默认情况下,VC以可视的“资源编辑器”方式来打开资源文件,让程序员进行可视的交互式菜单设计。用资源编辑器编辑菜单等资源的结果,都会被自动保存在这两个资源文件之中。
1.查看资源文本
资源文件指位于MFC应用程序项目目录中的资源脚本文件“项目名.rc”(如Student.rc)和资源头文件Resource.h。
似C++头文件和代码文件,也可以用任何文本编辑器(如Windows自带的记事本和写字板),来查看和编辑资源头文件和资源脚本文件。也可以用VC来查看和编辑资源文件中的源代码文本。
在VC中,以文本方式来打开资源文件的做法有三种(都需先关闭资源编辑器):
●方法1:
?在项目区中选中“解决方案资源管理器”页,选中应用程序的“资源文件\*.rc”。
?按鼠标右键,在弹出的快捷菜单中,选“查看代码”菜单项,或按“Ctrl+Alt+O”
组合键,参见图3-2 a)。
●方法2:
?在项目区中选中“解决方案资源管理器”页,选中应用程序的“资源文件\*.rc”。
?按鼠标右键,在弹出的快捷菜单中,选“打开方式”菜单项,也参见图3-2 a)。
?在弹出的“打开方式”对话框中,选中“源代码(文本)编辑器”项,按“确定”
关闭对话框,参见图3-2 b)。
a) 文件快捷菜单b) 打开方式对话框
图3-2 以文本方式打开资源文件
●方法3:
?选“文件\打开\文件”菜单项,或按工具条上的打开文件按钮,或按“Ctrl+O”
组合键,弹出“打开文件”对话框。
?在“打开文件”对话框中,先选中*.rc文件,再选“打开”按钮右端的钮打
开下拉式列表,选中其中的“打开方式(W)...”项。
?在弹出的“打开方式”对话框中,选中“源代码(文本)编辑器”项,按“确定”
关闭对话框,参见图3-2 b)。
作为参考,下面给出由MFC应用程序向导自动生成的Student程序的默认资源头文件(Resource.h)和菜单资源文本的内容(位于资源脚本文件Student.rc中)。
2.资源头文件
VC在资源头文件Resource.h中定义各种ID符号常量,这些定义由MFC应用程序向导或资源编辑器自动生成,一般不需要自己手工修改。
下面是Student程序的初始资源头文件的内容:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Student.rc
//
#define IDD_ABOUTBOX 100
#define IDP_OLE_INIT_FAILED 100
#define IDR_MAINFRAME 128
#define IDR_StudentTYPE 130
// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 310
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 310
#define _APS_NEXT_COMMAND_VALUE 32771
#endif
#endif
2.资源脚本文件
在MFC项目中,用资源脚本文件“项目名.rc”(后缀rc = r esour c e,资源)来描述程序的各种资源,包括:文本、图标、位图、工具栏、菜单、快捷键、对话框、版本、设计信息、字符串表等资源。
下面是Student程序的资源脚本文件Student.rc中的开始和默认菜单资源部分:
//Microsoft Visual C++ 生成的资源脚本。
//
#include "resource.h"
……
///////////////////////////////////////////////////////////////// //
// 菜单
//
IDR_MAINFRAME MENU
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N)\tCtrl+N", ID_FILE_NEW
MENUITEM "打开(&O)...\tCtrl+O", ID_FILE_OPEN
MENUITEM "保存(&S)\tCtrl+S", ID_FILE_SAVE
MENUITEM "另存为(&A)...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "打印(&P)...\tCtrl+P", ID_FILE_PRINT
MENUITEM "打印预览(&V)", ID_FILE_PRINT_PREVIEW
MENUITEM "打印设置(&R)...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "最近的文件", ID_FILE_MRU_FILE1,GRAYED
MENUITEM SEPARATOR
MENUITEM "退出(&X)", ID_APP_EXIT
END
POPUP "编辑(&E)"
BEGIN
MENUITEM "撤消(&U)\tCtrl+Z", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "剪切(&T)\tCtrl+X", ID_EDIT_CUT
MENUITEM "复制(&C)\tCtrl+C", ID_EDIT_COPY
MENUITEM "粘贴(&P)\tCtrl+V", ID_EDIT_PASTE END
POPUP "视图(&V)"
BEGIN
MENUITEM "工具栏(&T)", ID_VIEW_TOOLBAR
MENUITEM "状态栏(&S)", ID_VIEW_STATUS_BAR END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于 Student(&A)...", ID_APP_ABOUT END
END
3.2 设计菜单
在应用程序设计中,一般需要对自动产生的默认菜单进行编辑(修改/添加/删除)。在
菜单编辑器中,可以添加(下拉式弹出)菜单,在菜单中添加菜单项,为菜单项设置ID、标题串、访问键、快捷键、提示文本串和其他属性。
注意:在编程过程中,对VC的任何操作,都可以取消和恢复:
●按Ctrl+Z或选“编辑\撤销”菜单项或单击工具条中的钮,可取消前一次的操作;
●按Ctrl+Y或选“编辑\重做”菜单项或单击工具条中的钮,可恢复前一次的操作。
3.2.1 菜单设计的步骤与实例
本小节先给出菜单设计的一般步骤与过程,然后创建一个名为Student的传统单文档界面MFC应用程序实例。在本章的后续内容中,将结合该例讲解使用IDE进行MFC菜单设计的具体方法和详细步骤。
1.菜单设计的步骤
普通菜单设计的主要步骤有:插入菜单、添加菜单项、键入包含访问键(和加速键指示串)的标题串、修改菜单项的ID、设置提示串、(联接加速键、添加图标资源和代码、)添加菜单项响应、编写菜单事件处理的代码,参见图3-3(其中粗体部分为重点步骤)。
图3-3 菜单设计的主要步骤
2.菜单设计的实例
为了演示菜单的设计与编辑过程,我们用MFC应用程序向导创建一个(类似于2.4.2
中第3部分的Test程序的)具有传统界面的单文档MFC应用程序Student,其运行结果如图3-4所示。
a) 初始时b) 完成菜单设计后
图3-4 Student程序的运行结果
3.2.2 菜单编辑器和属性窗口
下面介绍在设计菜单中要用到的菜单编辑器、属性窗口和若干常用菜单属性,参见图3-5。
图3-5 菜单编辑窗口
1.打开菜单编辑器
●在VC左中部的项目工作区中选“资源视图”页(如果没有,可以选“视图\其他窗
口\资源视图”菜单项或按“Ctrl+Shift+E”组合键),参见图3-5的左部。
●单击“Student”项左边的+号框,展开各个资源文件的列表(此时只有一个文件
Student.rc);单击其中“Student.rc”项左边的+号框,展开各类资源的树形列表;单击其中“Menu”项左边的+号框,展开所有的菜单资源的ID列表。
说明:如果资源头文件或资源脚本文件已经被打开,则在展开“Student.rc”项左边
的+号框时,会报错“在另一个编辑器中打开”,参见图3-6。这是VC为了维护资
源的一致性而采取的一种措施,目的是避免同时以文本和可视方式打开和编辑资源
文件,可能会产生的二者内容不一致的冲突。解决办法是,先关闭资源头文件和资
源脚本文件,接着单击“Student.rc”项左边的-号框折叠,然后再单击“Student.rc”
项左边的+号框展开即可。
图3-6 展开资源文件时报错
●双击要编辑的菜单资源的ID(此时只有一个IDR_MAINFRAME),则VC会在中
部的编辑区打开菜单编辑器及对应的菜单资源供你编辑,参见图3-5的中部。
在编辑菜单和菜单项时,还需要使用属性窗口。
2.属性窗口
●打开:按工具条右边的属性窗口钮、选“视图\属性窗口”菜单项或按“Alt+Enter”
组合键,都可打开属性窗口。它通常位于VS窗口的右部,其默认页一般为按分类
顺序排列的属性页,参见图3-5。
●钉住:为了避免属性窗口自动隐藏,可单击其右上角的钉子形标识,将其“钉在”
屏幕上(此时钉子形标识变成了)。
●编辑:在属性窗口中单击对应属性项的右栏,选择其下拉式列表中的项,或键入/
修改其中的文本串。
3.常用菜单属性
下面(按属性窗口中的分类)列出若干常用的菜单[项]属性,其中用粗体字表示的是属性的默认值和几个最重要的属性。
●外观:
?Caption(标题):空/文本串,为菜单[项]的描述串,含必须的菜单名与访问键、
及可选的省略号与快捷键指示串。菜单[项]标题的完整格式为:
菜单[项]名称(&访问键字符)...\t快捷键指示串
例如:“文件(&F)”、“新建(&N)\tCtrl+N”、“打开(&O)...\tCtrl+O”、“&File”。
其中:
◆菜单[项]名称可用中文词组或英文单词,应该尽量简洁。
◆编辑时访问键一般由and符(即C/C++语言中的取地址符/引用符/与符)
“&”和一个英文字母组成(如&F),运行时则显示为带下划线的字母(如
F)。
●若使用的是中文菜单名,则访问键一般位于菜单名串后的(ASCII
码)圆括号内,而且访问键字符一般为对应英文菜单名单词的大写首
字母,如:文件(&F)。
●若使用的是英文菜单名,则将访问键的&符直接放在快捷键字母(一
般为单词的首字母)的前面即可,如:&File。
◆由3个句点字符组成的省略号“...”提示用户,选中该菜单项会弹出对话
框。该部分虽不是必须的,但却是编程惯例,应该尽量遵循。
◆如果菜单项有快捷键,则应该给出其对应组合键的指示串,并在前面添加
水平跳格(Tab,制表符)的转义字符“\t”,系统会在该指示串前留出空
白,并且在弹出菜单中右对齐。注意,在MFC中,标题串中的快捷键指
示串,只能对用户起提示作用,并不能真正设置快捷键。设置快捷键的具
体方法,参见后面的3.4节。
?Checked(选中):True/False(真/假),表示该菜单项是否被用户选中,用于
布尔型菜单项。若为True,则会在菜单项的左边出现钩形的选中图符。在编辑菜单项时,可以通过单击选中菜单项的左端矩形框,来切换其取值为True 或False。
?Enabled(启用/激活):True/False,设置该菜单[项]的功能是否可用。当取值
为True/Flase时,菜单[项]启用(激活)/ 禁用(灰化),且其标题文本在编辑和运行时都显示为黑色/灰色的。注意,在MFC中,没有添加事件处理程序(消息响应函数)的菜单项自动为不可用的,而添加了事件处理程序的菜单项自动为可用。即该属性的设置,对MFC是无效的。在MFC中,必须通过响应菜单项的用户界面更新命令消息UPDATE_COMMAND_UI,来实现启用和禁用菜单项的功能,参见后面的3.3.5小节。注意:禁用与启用状态,对直接位于菜单条中的菜单项是无效的,但对于位于下拉式或浮动式弹出菜单中菜单项则
是有效的。
?Pupup(弹出):(对顶层菜单为)True/(对菜单项为)False,属性值为真和
假分别对应于(下拉式)弹出菜单和菜单项。弹出菜单必须选True,而菜单
项则必须选False。对取值为False的菜单项,可以设置ID并添加事件处理程
序,但是对取值为True的弹出菜单则不能。注意,在菜单条中也可以放置菜
单项,即顶层菜单项,但需要将菜单的Pupup属性值修改为False。
●杂项
?Help(帮助):True/False,对顶层菜单,若Help属性值为True,则指定该菜
单及其右边的菜单都在菜单条上右对齐(参见图3-7)。这是老式的Windows
程序风格,现在一般不再使用。注意,本属性对菜单项无效。
图3-7 Help属性为True的“帮助”菜单
?ID(标识符):ID_nnnnn /(由大写英文字母和下划线组成的)符号常量文本
串(对应于一个整数常量,定义在resource.h头文件中),标识该菜单项资源,
用于消息处理和对象指定。菜单项的标识符一般形为:ID_菜单的英文名_菜
单项的英文名,例如“文件\打开”菜单项的标识符为ID_FILE_OPEN。还可
以单击该属性项右栏,会出现的下拉式列表框,再单击其右端的钮,然后
在列表中选择想要的(已有)ID。本属性对(Popup属性都为True的)弹出
菜单是不可用的,因为其事件响应(显示弹出菜单)不由用户程序处理,而是
由操作系统负责。
?Prompt(提示):空/(以\n分隔的)文本串,为菜单项的详细说明,例如“打
开现有文档\n打开”。当用户选择该菜单[项]时,“\n”前的内容会显示在程序
窗口的状态条中;当鼠标停留在该菜单项所对应的工具条按钮上时,提示串中
“\n”前的内容也会显示在状态条中,而“\n”后的内容会显示在(在按钮附
近弹出的)一个小浮动框中。该属性对弹出菜单无效。
?Separator(分隔条):True/False,为True时菜单项变成分隔条,用于在菜单项
列表中分隔菜单项组。例如,默认的文件菜单中,菜单项被三个分隔条分成了
四个组(参见图3-5中部)。该属性对弹出菜单也不可用。
3.2.3 编辑菜单
下面介绍使用菜单编辑器和属性窗口进行菜单和菜单项编辑的具体方法。
1.添加菜单
在MFC应用程序中,一般需要在已有菜单条中添加自己的(下拉式顶层)弹出菜单。例如在本例Student中,要在已有的“帮助”菜单前,插入3个新菜单:“姓名(&N)”、“成绩(&S)”和“测试(&T)”。
●加入新(弹出)菜单
?添加新菜单——如果要在菜单条中所有已有(下拉式顶层)菜单的右边添加新
的(弹出)菜单,可以直接选中菜单条最右端的“请再此处键入”虚框。
?插入新菜单——为了在菜单条中(已有的)某个菜单的左边插入新菜单,可先
选中该菜单,然后
◆按Insert键。
◆或按鼠标右键,在弹出的快捷菜单中选“新插入”菜单项。
◆或选“编辑\菜单\新插入”菜单项。
则都会在所需位置出现空白菜单(矩形虚框),其下面还带有添加菜单项的“请
在此处键入”虚框,参见图3-8。
图3-8 添加新菜单
●键入菜单名和访问键:在空白菜单的矩形虚框中直接键入菜单名和访问键(以后还
可在属性窗口中的Caption栏中对其进行修改)。
?中文:菜单名(&访问键字母),如“文件(&F)”,显示为“文件(F)”。
?英文:[菜单名左部]&访问键字母[菜单名右部],如“&File”,显示为“File”。
在键入或修改菜单名和访问键后必须按回车键,才能完成了菜单的添加,然后才可
以开始设置菜单属性和添加新菜单项。
●设置菜单属性:除了键入的菜单名和访问键外,弹出菜单的其他菜单属性选项一般
使用默认值,如Enabled和Popup为True、Break为None、其余选项为False或空。
2.添加菜单项
●选中菜单:首先需要选中需要添加菜单项的(顶层或子弹出)菜单。
●加入菜单项:
?添加新菜单项:如果要在菜单中所有已有菜单项的下面添加新菜单项,可以直
接选中菜单最下面的“请在此处键入”虚框,参见图3-9。
图3-9 添加新菜单项
?插入新菜单项:为了在菜单中(已有的)某个菜单项的上面插入新菜单项,可
先选中该菜单项,然后(似上面的“插入新菜单”)
◆按Insert键。
◆或按鼠标右键,在弹出的快捷菜单中选“新插入”菜单项。
◆或选“编辑\菜单\新插入”菜单项。
则会在所需位置出现空白菜单项(矩形虚框),其右边还带有添加子菜单项的
“请再此处键入”虚框。
●键入标题串:在空白菜单项的矩形虚框中键入菜单项名、访问键、(对话框)省略
点和快捷键提示串,后两项是可选的。一般形为“菜单名(&字母)...\t切换键+字母”,例如“李四(&L)...\tShift+L”,参见图3-10。按回车键完成菜单项的添加。
图3-10 键入菜单项的标题串
●设置ID:在属性窗口中的ID栏中选择(已有的)、修改(默认的)或键入(新的)
形如“ID_菜单名_菜单项名”的(用下划线分隔的大写字母串)符号常量。例如ID_FILE_OPEN、ID_NAME_ZS。注意:
?中文菜单项ID的默认值一般形为ID_nnnnn(如ID_32771),不应该直接使用
该值,因为它既不利于自动生成有意义的事件处理程序的名称,又不利于程序
的阅读和维护。
?在键入ID值后必须按回车键,才能完成ID值的修改,不然键入的ID值会被
自动丢失。
?对Popup属性为True的(下拉式和快捷式)弹出菜单不能设置ID。
●键入提示串:在属性窗口的Prompt(提示)栏中键入与菜单项有关的信息,形为
“状态条中显示的长文本串\n工具条按钮旁浮动显示的短文本串”,中间的“\n”
为换行(New line)转移字符。如“学生张三的信息\n张三”。
例如,Student程序在“姓名”菜单中添加了“张三”、“李四”和“王五”3个菜单项,参见表3-1。在“成绩”菜单中添加了“数学”、“英语”和“计算机”3个菜单项,参见表3-2。
表3-1 姓名菜单项的属性值
表3-2 成绩菜单项的属性值
●在菜单条中增加菜单项:可在菜单条中添加顶层菜单项,方法与在菜单条中添加顶
层菜单类似,只是必须将其Popup属性值修改为“False”。而且还需要像添加普通
菜单项那样,设置ID、提示串和快捷键等。但是不能在顶层菜单项的标题属性中
加入快捷键显示串,因为在运行时,它会挤占菜单项名的位置。例如,Student例
中的“测试”就是菜单条中的顶层菜单项,其标题串为“测试(&T) ”(没有快捷
键指示串)、ID值为“ID_TEST”、提示串为“测试顶层菜单项\n测试”、快捷键为
“Ctrl+T”。
3.菜单资源文本
Student例所对应的菜单资源文本为(位于资源脚本文件Student.rc中的IDR_MAINFRAME菜单资源内的“视图”和“帮助”弹出菜单之间):
POPUP "姓名(&N)"
BEGIN
MENUITEM "张三(&Z)...\tShift+Z", ID_NAME_ZS
MENUITEM "李四(&L)...\tShift+L", ID_NAME_LS
MENUITEM "王五(&W)...\tShift+W", ID_NAME_WW
END
POPUP "成绩(&S)"
BEGIN
MENUITEM "数学(&M)...", ID_SCORE_MATH
MENUITEM "英语(&E)", ID_SCORE_ENG
MENUITEM "计算机(&C)", ID_SCORE_COMP
END
MENUITEM "测试(&T)", ID_TEST
对应的ID符号常量似(位于资源头文件Resource.h中):
#define ID_NAME_ZS 32771
#define ID_NAME_LS 32772
#define ID_NAME_WW 32773
#define ID_SCORE_MATH 32774
#define ID_SCORE_ENG 32775
#define ID_SCORE_COMP 32776
#define ID_TEST 32777
对应的提示串资源为(位于文件Student.rc中串表部分):
STRINGTABLE
BEGIN
ID_NAME_ZS "学生张三的信息\n张三"
ID_NAME_LS "学生李四的信息\n李四"
ID_NAME_WW "学生王五的信息\n王五"
ID_SCORE_MATH "数学成绩\n数学"
ID_SCORE_ENG "英语成绩\n英语"
ID_SCORE_COMP "计算机成绩\n计算机"
ID_TEST "测试顶层菜单项\n测试"
END
4.添加分隔条
分隔条(separator)用于分隔菜单中的菜单项组,添加分隔条的方法有两种:
●可在菜单中需要的位置添加或插入空白菜单项,在属性窗口的Separator项中设置
属性值为True(默认为False)。
●或在后一菜单项上按鼠标右键,在弹出的快捷菜单中选择“插入分隔符”菜单项。
5.添加子菜单
选中相应菜单项,就可用其右边的“请再此处键入”虚框,来加入子菜单的新菜单项。添加了子菜单项后,会在该菜单项右边自动出现(代表该菜单项有子菜单的)三角形标识。其他操作与在菜单中添加菜单项的相同。
6.修改菜单属性
可在属性窗口中,通过修改各种设置与选项来修改菜单[项]的属性。
7.删除菜单
选中菜单[项],按Delete/Del键就可以删除它。也可以在某个菜单项上按鼠标右键,在弹出的快捷菜单中选择“删除”菜单项。
3.2.4 联接快捷键
在菜单项标题中键入的快捷键指示串,只是用于显示给用户观看,并没有真正设置快捷键。为了使快捷键起作用,还必须打开快捷键编辑器窗口和对应的属性窗口来添加和修改快捷键设置,具体方法在下面介绍。
1.快捷键编辑器
展开VC项目工作区“资源视图”页中的资源列表中的“Accelerator”(加速键/快捷键)
项,双击里面的“ID_MAINFRAME”项(在Student例中对应的是“Student\Student.rc\ Accelerator\ID_MAINFRAME”项),则会打开快捷键编辑器窗口(位于VS窗口的中部)和对应的属性窗口(位于VS窗口的右部),参见图3-11。
图3-11 快捷键编辑器窗口和对应的属性窗口
2.设置快捷键的步骤
修改或添加快捷键的具体步骤:
1.选中快捷键编辑器窗口中的某一已有条目或最下面的空条目(空白矩形框)。
2.设置ID
●单击快捷键编辑器窗口中该条目左端的“ID”栏。
●或选中快捷键属性窗口最底端的“ID”属性项的右栏。
则会出现带下拉列表的文本输入组合框,在其中键入或选择某一已有菜单项的ID,参见图3-12。
图3-12 选择快捷键ID
3.设置修饰符:修饰符可以为空,也可以是Alt、Ctrl和Shift等键的任意组合,默认
为“无”。
●单击快捷键编辑器窗口中该条目的“修饰符”栏,可在出现的下拉列表中选择
所需要的修饰符的组合,参见图3-13 a)。
●或修改快捷键属性窗口中“行为”栏的Alt、Ctrl和Shift属性项的取值为True
或False,参见图3-13 b)。
a) b)
图3-13 设置快捷键的修饰符
4.设置键值
●单击快捷键编辑器窗口中该条目的“键”栏。
●或选中快捷键属性窗口中行为栏的“Key”属性项的右栏。
可在其中直接键入可打印字符(如大小写英文字母和数字等),也可以从下拉列表中选
择所需要的虚拟键,默认为回车键“VK_RETURN”。常用的虚拟键见表3-3。