02界面编程1菜单.docx
- 文档编号:25394162
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:42
- 大小:401.35KB
02界面编程1菜单.docx
《02界面编程1菜单.docx》由会员分享,可在线阅读,更多相关《02界面编程1菜单.docx(42页珍藏版)》请在冰豆网上搜索。
02界面编程1菜单
第2章界面编程
Windows是一种具有GUI的操作系统,GUI包括:
窗口、菜单、对话框和控件等基本界面元素,及MFC提供的工具栏和状态栏等组合控件,还有键盘、鼠标等消息响应与事件驱动。
2.1菜单设计
1.菜单
菜单(menu)是GUI程序的主要命令接口。
菜单可分为包含若干菜单项的弹出(Popup)式菜单和发送命令消息的菜单项(menuitem)两大类。
而其中的弹出式菜单(以下简称为菜单),又可以分成菜单条中的顶层菜单和按鼠标右键后弹出的浮动菜单。
可以用键盘(快捷)和鼠标(直观)这两种输入设备来访问菜单和菜单项(以后简记为“菜单[项]”)。
在用键盘访问时,还可使用助记键和快捷键:
●访问键(memonickey助记键/hotkey热键):
菜单[项]中出现的带下划线的字符(一般为大写英文字母),例如菜单条上“文件(F)”菜单的字母“F”和文件菜单中的“另存为(A)”菜单项的字母“A”。
使用方法:
⏹按“Alt+访问键”,可“选中”当前窗口菜单条上访问键所对应的菜单[项],例如按“Alt+F”会打开“文件(F)”菜单
⏹按“访问键”本身,可“选中”当前已展开菜单中其所对应的的菜单项,例如在已经打开的文件菜单中,按“A”会选中“另存为(A)...”菜单项,从而打开对应的“另存为”对话框
●快捷键(shortcutkey/acceleratorkey加速键):
出现在菜单项右端的功能键组合,一般为[Ctrl/Alt/Shift+]大写英文字母或功能键Fn。
用快捷键可以直接访问当前窗口的任意菜单项(不论其所在的菜单是否被展开),例如按“Ctrl+O”可以直接选中(尚未打开的)文件菜单中的“打开(O)...Ctrl+O”菜单项,从而打开对应的“打开”对话框
若按某菜单项会弹出一个对话框,则一般应在该菜单项名后加上(由3个句点字符组成的)省略号“...”。
在应用程序中一般还可以按鼠标右键弹出一个带编辑和属性等功能的浮动式菜单。
菜单项和其他所有资源一样,都有一个ID(IDentifier标识符),通常是以下划线分割的大写字母组成的符号常量。
在VC中,一般不需要直接编写符号常量的宏定义,而是由资源编辑器代劳。
2.缺省菜单
用MFC应用程序向导建立应用程序时,若选择的是单文档或多文档类型,而不是基于对话框类型,则会自动建立预定义的菜单条。
●单文档应用程序只有一种菜单条,缺省时含“文件”、“编辑”、“查看”、“帮助”4个下拉式菜单,ID为IDR_MAINFRAME
●对多文档应用程序有两种菜单条:
⏹主框架菜单:
在程序刚启动或没有任何文档子窗口时显示,缺省时含“文件”、“查看”、“帮助”3个下拉式菜单,ID也为IDR_MAINFRAME
⏹文档菜单:
在有文档子窗口时显示,缺省时含“文件”、“编辑”、“查看”、“窗口”、“帮助”5个下拉式菜单(增加了一个“窗口”下拉菜单),ID为IDR_AppNameTYPE,例如IDR_TestTYPE
在MFC类库中,由CMenu类支持菜单,该类是直接从CObject的类派生的:
CObject→CMenu
但是在MFC编程中一般不直接使用该类。
为了演示编辑过程,用MFC应用程序向导创建一个名为Student的单文档应用程序(其余选项全用缺省的,这只需在对话框的“应用程序类型”页中选择“单文档”后按“完成”钮即可)。
编译连接运行后的结果如下图所示:
3.菜单编辑
在应用程序设计中,一般需要对自动产生的缺省菜单进行编辑(修改/添加/删除)。
在菜单编辑器中,可以添加(下拉式)菜单,在菜单中添加菜单项,为菜单项设置ID、名称文本串、访问键、快捷键、提示文本串和其他属性。
注意:
在编程过程中,对VC的任何操作,都可以取消和恢复:
●按Ctrl+Z或选“编辑\撤销”菜单项或单击工具条中的
钮,可取消前一次的操作;
●按Ctrl+Y或选“编辑\重复”菜单项或单击工具条中的
钮,可重复前一次的操作。
1)菜单编辑器
●打开菜单编辑器:
⏹在VC左中部的项目工作区中选“资源视图”页(如果没有,可以选“视图\资源视图”菜单项或按“Ctrl+Shift+E”组合键)
⏹单击“Student”项左边的+号框,展开各个资源文件的列表(此时只有一个文件Student.rc);单击其中“Student.rc”项左边的+号框,展开各类资源的树形列表;单击其中“Menu”项左边的+号框,展开所有的菜单资源的ID列表
⏹双击要编辑的菜单资源的ID(此时只有一个IDR_MAINFRAME),则VC会在中部的编辑区打开菜单编辑器及对应的菜单资源供你编辑(参见下图)
菜单编辑窗口
编辑菜单和菜单项时,需要使用属性窗口
●属性窗口:
⏹打开:
选“视图\其它窗口\属性窗口”菜单项或按“Alt+Enter”组合键,打开属性窗口,它通常位于VS窗口的左边,其缺省页一般为按分类顺序排列的属性页
⏹钉住:
为了避免属性窗口自动隐藏,可单击其右上角的钉子形图标
,将其“钉在”屏幕上(此时钉子形图标改成了
)
⏹编辑:
在属性窗口中单击对应属性项的右栏,选择其下拉式列表中的项,或输入/修改其中的文本串
●菜单[项]属性:
(缺省值用绿色表示)
⏹外观:
◆Caption(标题):
空/文本串,为菜单[项]的名称、访问键和快捷键。
格式为:
菜单[项]名称(&访问键字符)...\t快捷键组合
例如“文件(&F)”、“新建(&N)\tCtrl+N”、“打开(&O)...\tCtrl+O”
◆Checked(选中):
True/False,表示该菜单项是否被用户选中。
若为True,则会在菜单项的左边出现钩形的选中图符√。
可以在菜单项的左端单击,来切换其取值True/False
◆Enabled(可用):
True/False,表示该菜单[项]的功能是否可用。
若有/无对应的消息处理函数,则缺省取值为True/False。
当取值为Flase时,菜单[项]不可用,且其标题文本是灰色的。
(菜单项在有/没有联接消息处理函数时,会自动可用/不可用)
◆Grayed(灰化):
True/False,若为True,则菜单项为灰色,被禁止使用。
(菜单项在没有联接消息处理函数时,会自动灰化)
◆Pupup(弹出):
True/False,分别对应于弹出式和下拉式菜单/菜单项。
顶层菜单必须选True(缺省值),而菜单项则必须选False(缺省值)。
(注意,在菜单条中也可以放置菜单项)
⏹行为:
◆Break(断开):
None/Column/Bar,若不为None,则将菜单条[项列表]断开,该菜单[项]从新的行[列]开始。
对菜单项,若属性值为Bar,还在两列之间加上一个分隔条。
参见下图
NoneColumn/Bar
菜单条中“视图”菜单的Break属性
NoneColumnBar
“视图”菜单中“状态栏”菜单项的Break属性
◆RightJustify(右调整/两端对齐):
True/False,对菜单条上的某个菜单设置该属性为True后,会将该菜单及其后面的诸菜单向右对齐。
该属性对菜单列表中的菜单项无效。
参见下图
False:
True:
菜单条中“视图”菜单的RightJustify属性
◆RightOrder(右序):
True/False,若设置菜单条上任一个菜单的该属性值为True,则菜单条中的菜单右对齐,且按从右到左的顺序排列;,若设置菜单列表中某菜单项的该属性值为True,则该菜单项及其下面的菜单项都右对齐,而且选中图符也位于右边。
参见下图
菜单条上某个菜单的RightOrder属性值为True
全为False“打印预览”的为True“状态栏”的为True
菜单项的RightOrder属性
⏹杂项:
◆(Name)(名称):
菜单编辑器,为当前开发环境的属性名称,在“菜单编辑器”下不能设置和修改
◆Help(帮助):
True/False,对顶层菜单,若为True,则指定该菜单及其右边的菜单都右对齐(参见下图)。
这是老式的Windows程序风格,现在一般不再使用。
(本属性对菜单项无效)
“帮助”菜单的Help属性为True
◆ID(标识符):
ID_nnnnn/(由大写英文字母和下划线组成的)符号常量文本串(对应于一个整数常量,定义在resource.h头文件中),标识该菜单项,用于消息处理和对象指定。
菜单项的标识符一般形为:
ID_菜单的英文名_菜单项的英文名,例如“文件\打开”菜单项的标识符为ID_FILE_OPEN。
还可以单击该属性项右栏,会出现的下拉式列表框,再单击其右端的
钮,然后在列表中选择想要的(已有)ID。
(本属性对下拉式顶层菜单和浮动式弹出菜单[它们的Popup属性都为True]不可用,因为对它们的响应不由用户程序处理,而由系统负责[显示弹出菜单])
◆Prompt(提示):
空/(以\n分隔的)文本串,为菜单项的说明文本。
当用户选择该菜单[项]时,“\n”前的内容会显示在程序窗口的状态条中;当鼠标停留在该菜单项所对应的工具条中的按钮上时,“\n”后的内容会显示在一个小浮动框中。
例如“打开现有文档\n打开”。
(该属性对顶层菜单无效)
◆Seperator(分隔条):
True/False,为True时菜单项变成分隔条,用于在菜单项列表中分隔菜单项组。
例如,缺省的文件菜单中,菜单项被三个分隔条分成了四个组(参见前面的有关RightOrder属性的图示)。
(该属性对顶层菜单不可用)
2)编辑菜单
●添加菜单
⏹加入新菜单:
◆添加新菜单——如果要在菜单条中所有已有菜单的右边添加新菜单,可以直接选中菜单条最右端的“请再此处键入”虚框
◆插入新菜单——为了在菜单条中(已有的)某个菜单的左边插入新菜单,可先选中该菜单,然后
●按Insert键
●或按鼠标右键,在弹出的浮动菜单中选“新插入”菜单项
●或选“编辑\菜单\新插入”菜单项
则会在所需位置出现空白菜单(矩形虚框),其下面还带有添加菜单项的“请在此处键入”虚框
⏹键入菜单名和访问键:
在空白菜单的矩形虚框中直接键入菜单名和访问键(以后可在属性窗口中的Caption栏中对其进行修改)
◆中文:
菜单名(&访问键字母),如“文件(&F)”,显示为“文件(F)”
◆英文:
[菜单名左部]&访问键字母[菜单名右部],如“&File”,显示为“File”
⏹选项:
其他的菜单属性选项一般使用缺省的,如设置Enabled和Popup为True、Break为None、其余选项为False或空
⏹添加菜单项:
键入或修改菜单名和访问键后按回车,可以开始在新菜单中添加新菜单项
例如本例中,要在“帮助”菜单前,添加4个新菜单:
“姓名(&N)”、“成绩(&S)”、“添加(&A)”和“删除(&D)”
●添加菜单项
⏹选中菜单:
首先需要选中需要添加菜单项的顶层菜单
⏹加入菜单项:
◆添加新菜单项:
如果要在菜单中所有已有菜单项的下面添加新菜单项,可以直接选中菜单最下面的“请在此处键入”虚框
◆插入新菜单项:
为了在菜单中(已有的)某个菜单项的上面插入新菜单项,可先选中该菜单项,然后
●按Insert键
●或按鼠标右键,在弹出的浮动菜单中选“新插入”菜单项
●或选“编辑\菜单\新插入”菜单项
则会在所需位置出现空白菜单项(矩形虚框),其右边还带有添加子菜单项的“请再此处键入”虚框
⏹键入菜单项名、访问键和快捷键:
在空白菜单项的矩形虚框中键入菜单项名、访问键、(对话框)省略点和快捷键串,后两项是可选的。
一般形为:
“菜单名(&字母)...\tCtrl+字母”
例如
“打开(&O)...\tCtrl+O”
⏹设置ID:
在属性窗口中的ID栏中选择(已有的)、修改(缺省的)或键入(新的)形如ID_MenuName_MenuItemName的(用下划线分隔的大写字母串)符号常量。
例如ID_FILE_OPEN、ID_NAME_ZS。
(注意:
对下拉式和浮动式弹出菜单[Popup属性为True]不能设置ID)
⏹键入提示:
在属性窗口的Prompt(提示)栏中键入与菜单项有关的信息,形为“状态条显示的长文本串\n浮动显示的短文本串”。
当用户用鼠标或键盘加亮该菜单项时,在状态条中显示该信息中“\n”前的文本串。
如“文件”菜单中的“打开”菜单项的提示信息缺省为:
“打开现有文档\n打开”。
其中“\n”后的内容,会在鼠标停留在其ID所对应的工具条按钮上时,浮动显示
例如,本例在“姓名”菜单中添加如下3个菜单项:
●张三(&Z)\tShift+ZID_NAME_ZS学生张三的信息\n张三
●李四(&L)\tShift+LID_NAME_LS学生李四的信息\n李四
●王五(&W)\tShift+WID_NAME_WW学生王五的信息\n王五
在“成绩”菜单中添加如下3个菜单项:
●数学(&M)ID_SCORE_MATH数学成绩\n数学
●英语(&E)ID_SCORE_ENG英语成绩\n英语
●计算机(&C)ID_SCORE_COMP计算机成绩\n计算机
⏹在菜单条中增加菜单项:
似在菜单条中添加顶层菜单,只是应该在属性窗口中,将其Popup属性值修改为“False”。
但是还需要像其他菜单项那样,设置ID、并可设置快捷键和提示串。
(但是不能在菜单项标题属性中加入快捷键显示串,因为在运行时,它会挤占菜单项名的位置)
例如,本例中的“添加”和“删除”就是菜单条中的两个菜单项:
●添加(&A)[快捷键为Insert]ID_ADD添加学生信息\n添加
●删除(&D)[快捷键为Delete]ID_DEL删除学生信息\n删除
●添加分隔条:
在需要的位置添加或插入空白菜单项,在属性窗口的Seperator项中设置属性值为True(缺省为False)。
分隔条可以分隔菜单中的菜单项组,也可以分隔菜单条上的菜单组(使用菜单条上的空白菜单项)。
(但是在运行时,菜单条上的分隔条都不见了)
●添加子菜单:
选中相应菜单项,就可用其右边的“请再此处键入”虚框,来加入子菜单的新菜单项。
添加了子菜单项后,会在该菜单项右边自动出现(代表该菜单项有子菜单的)三角形图标。
其他操作与在菜单中添加菜单项的相同
●修改菜单[项]的属性:
可在属性窗口中,通过修改各种设置与选项来修改菜单项的属性
●删除菜单[项]:
选中菜单[项],按Delete键就可以删除它
4.联接菜单快捷键
在菜单项后的快捷键字符串,只是供显示用的。
为了使快捷键起作用,必须打开快捷键编辑器窗口和对应的属性窗口来添加和修改快捷键设置。
展开VC项目工作区“资源视图”页中的资源列表中的Accelerator(快捷键)项,双击里面的ID_MAINFRAME项(在本例中对应的是“Student\Student.rc\Accelerator\ID_MAINFRAME”项),则会打开快捷键编辑器窗口(位于VS窗口的中部)和对应的属性窗口(位于VS窗口的右部):
快捷键编辑器窗口和对应的属性窗口
修改或添加快捷键的具体步骤:
●选中快捷键编辑器窗口中的某一已有条目或最下面的空条目(空白矩形框)
●设置ID:
⏹单击快捷键编辑器窗口中该条目的ID栏
⏹或选中快捷键属性窗口最底端的ID属性项的右栏
会出现带下拉列表的文本输入组合框,在其中键入或选择某一已有菜单项的ID
●设置修饰符:
修饰符可以为空,也可以是Alt、Ctrl和Shift键的任意组合,缺省为单个Ctrl键
⏹单击快捷键编辑器窗口中该条目的修饰符栏,可在下拉列表中选择所需要的修饰符的组合(参见下图左)
⏹或修改快捷键属性窗口中行为栏的Alt、Ctrl和Shift属性项的取值(参见上图右)
●设置键值:
⏹单击快捷键编辑器窗口中该条目的健栏
⏹或选中快捷键属性窗口中行为栏的Key属性项的右栏
可在其中直接键入可打印字符(如大小写英文字母和数字等),也可以从下拉列表中选择所需要的虚拟键
常用的虚拟键有:
功能键VK_F1~VK_F12、方向键VK_UP/VK_DOWN/VK_LEFT/VK_RIGHT、翻页键VK_PRIOR/VK_NEXT、运算符键VK_ADD/VK_SUBTRACT/VK_MULTIPLY/VK_DIVIDE、插删键VK_INSERT/VK_DELETE、始末键VK_HOME/VK_END、逃逸键VK_ESCAPE、空格键VK_SPACE、跳格键VK_TAB、退格键VK_BACK、回车键VK_RETURN等
●设置键的类型:
⏹单击快捷键编辑器窗口中该条目的类型栏
⏹或选中快捷键属性窗口中行为栏的Type属性项的右栏
可以从下拉列表中选择VIRTKEY/ASCII,指定键值的类型是虚拟键还是ASCII字符,一般采用缺省的虚拟键类型
注意:
●不能使用单个的Alt键作为快捷键,因为它是Windows系统保留的专用快捷键,用于在应用程序中选择和打开顶层菜单
●应避免在同一应用程序中有多个ID使用同一快捷键。
例如,本例的快捷键在资源文件Student.rc中的对应文本段为:
(按ID的字母顺序排列)
/////////////////////////////////////////////////////////////////////////////
//
//Accelerator
//
IDR_MAINFRAMEACCELERATORS
BEGIN
VK_INSERT,ID_ADD,VIRTKEY,NOINVERT
VK_DELETE,ID_DEL,VIRTKEY,NOINVERT
"C",ID_EDIT_COPY,VIRTKEY,CONTROL,NOINVERT
VK_INSERT,ID_EDIT_COPY,VIRTKEY,CONTROL,NOINVERT
VK_DELETE,ID_EDIT_CUT,VIRTKEY,SHIFT,NOINVERT
"X",ID_EDIT_CUT,VIRTKEY,CONTROL,NOINVERT
"V",ID_EDIT_PASTE,VIRTKEY,CONTROL,NOINVERT
VK_INSERT,ID_EDIT_PASTE,VIRTKEY,SHIFT,NOINVERT
VK_BACK,ID_EDIT_UNDO,VIRTKEY,ALT,NOINVERT
"Z",ID_EDIT_UNDO,VIRTKEY,CONTROL,NOINVERT
"N",ID_FILE_NEW,VIRTKEY,CONTROL,NOINVERT
"O",ID_FILE_OPEN,VIRTKEY,CONTROL,NOINVERT
"P",ID_FILE_PRINT,VIRTKEY,CONTROL,NOINVERT
"S",ID_FILE_SAVE,VIRTKEY,CONTROL,NOINVERT
"L",ID_NAME_LS,VIRTKEY,SHIFT,NOINVERT
"W",ID_NAME_WW,VIRTKEY,SHIFT,NOINVERT
"Z",ID_NAME_ZS,VIRTKEY,SHIFT,NOINVERT
VK_F6,ID_NEXT_PANE,VIRTKEY,NOINVERT
VK_F6,ID_PREV_PANE,VIRTKEY,SHIFT,NOINVERT
END
5.响应菜单项
1)添加响应函数
用户选中菜单项时,Windows会发送一个消息给对应的处理函数。
为菜单项添加响应函数的方法为:
●打开菜单编辑器窗口[或快捷键编辑器窗口],选中对应的菜单项[条目]
●按鼠标右键,在弹出的浮动菜单中,选“添加事件处理程序”菜单项;或选“编辑\菜单\添加事件处理程序”菜单项;会弹出“事件处理程序向导”对话框(参见下图)
●设置对话框的栏目与选项:
⏹“命令名”栏的值为菜单项的ID,不能修改
⏹“消息类型”栏中有两个选项
◆COMMAND(命令)——对应于用户选中菜单项的命令事件/消息,是通常的(缺省)选项
◆UPDATE_COMMAND_UI(更新命令用户接口)——在系统重新绘制菜单前产生的事件所发出的信息,可用于菜单项的“不可用”和“灰化”设置
⏹“类列表”栏中罗列了本程序中可以响应该菜单项事件的所有类。
一般是在视图类中来处理鼠标和菜单事件/响应鼠标和菜单消息
⏹“函数处理程序名称”栏中初始为缺省的处理函数名,它是可以被修改的(一般不改)
命令消息的处理函数的缺省名称是通过改写菜单项的标识符而得到的,具体做法是:
ID改为On,去掉下划线,将下划线后的首字母大写,其余字母小写。
例如“分数\数学”菜单项的标识符为ID_SCORE_MATH,则对应的缺省处理函数名就是OnScoreMath。
对于更新消息的响应函数,还在命令消息处理函数名的基础上,在On后添加了“Update”,例如OnUpdateScoreMath。
又如,“姓名\李四”菜单项(ID_NAME_LS)的命令/更新消息响应函数名为:
OnNameLs/OnUpdateNameLs
●按对话框底部的“添加编辑”钮,VS系统就会自动添加对应的消息处理程序,并打开对应的CPP代码文件,定位于该函数的头部,使你可以开始编辑该函数
以后可以通过选中项目工作区的类视图页的“项目名\视图类名”,然后在下部的成员函数列表中再双击该菜单项事件处理函数,就可以查看、编辑和修改它
还可以用如下方法来为菜单项添加响应函数:
●在项目工作区类视图页中选中应用程序的视图类(如本例为CStudentView)
●在属性窗口中按其工具条上的闪电形事件按钮
,切换到事件页
●滚动ID列表寻找到指定菜单项所对应的ID,单击该ID左端的+号框,展开的选项列表中,有命令“COMMAND”和更新命令用户界面“UPDATE_COMMAND_UI”选项
●单击其中想要的一个选项的右栏,在出现的下拉式列表,选其中唯一的选项,即可添加对应的消息响应函数。
例如,选本例中的“分数\英语”菜单项所对应的ID(ID_SCORE_ENG),则出现的选项为“<添加>OnScoreEng”或“<添加>OnUpdateScoreEng”(参见下图)
2)自动生成工作
VS系统自动生成事件处理程序或消息响应函数框架时,做了如下工作:
●在类的头文件中添加函数原型:
afx_msgvoidOnScoreMath();
●在类的代码文件中添加
⏹消息映射宏:
ON_COMMAND(ID_SCORE_MATH,&CStudentView:
:
OnScoreMath)
⏹空函数体:
voidCStudentView:
:
OnScoreMath()
{
//TODO:
在此添加命令处理程序代码
}
你也可以不借助于自动生成,而是自己用手工来创建消息响应函数,这时需要自己来做上面的这三项工作。
3)添加响应代码(显示消息框)
作为示例,我们在各个新生成的空消息响应函数中,添加一点简单的响应代码。
例如加入如下的显示消息框的语句:
MessageBox(L"数学:
80分",L"成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 界面 编程 菜单