03界面编程1菜单.docx
- 文档编号:26749139
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:51
- 大小:1,020.06KB
03界面编程1菜单.docx
《03界面编程1菜单.docx》由会员分享,可在线阅读,更多相关《03界面编程1菜单.docx(51页珍藏版)》请在冰豆网上搜索。
03界面编程1菜单
第3章界面编程1-菜单
Windows应用程序开发的基础是GUI的设计与编程,GUI包括WindowsAPI提供的窗口、菜单、对话框和控件等基本界面元素,以及MFC提供的工具栏和状态栏等组合控件,还有键盘和鼠标等消息响应与事件驱动。
这些内容将在本书的第3~7章中逐个加以讨论,本章介绍菜单的设计与编程。
3.1菜单
菜单(menu)是传统GUI程序的主要命令接口,可用键盘和鼠标来访问。
虽然菜单是基于文字串的,但是相对于(可视方便的)工具条和(直接快速的)快捷键,菜单所提供的程序功能更为完整和全面。
默认的传统MFC应用程序,会在主框架窗口中自动生成一个菜单条(menubar)。
菜单条也叫顶层菜单(top-levelmenu),一般包含文件、编辑、查看、窗口、帮助等若干下拉式弹出菜单。
3.1.1菜单与菜单项
菜单可分为包含若干菜单项的弹出菜单和发送命令消息的菜单项两大类,可以用键盘和鼠标这两种输入设备来访问菜单和菜单项(以下简记为“菜单[项]”)。
1.菜单
弹出菜单(pop-upmenu,简称为菜单)包含若干菜单项,一般处于(诸菜单项都不可见的)关闭状态。
只有在用户(通过菜单名或按鼠标键)激活菜单时,才由操作系统弹出来显示。
并在用户通过选中菜单里的某个菜单项而发送对应的命令消息之后,又被操作系统自动关闭。
(弹出)菜单又可以进一步分成(菜单条中的)下拉菜单(drop-downmenu)和(按鼠标右键后在光标处弹出的)快捷菜单(shortcutmenu),参见图3-1a)。
弹出菜单中还可以包含若干(多级)子菜单,由其对应的(右端带
的)菜单项激活,参见图3-1b)。
a)弹出菜单的种类b)多级子菜单
图3-1菜单与菜单项
2.菜单项
菜单项(menuitem)用于发送程序的命令消息,一般由位于左端的图标或(表示选中的)勾符
、简述命令功能的标题(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(intnPos)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.访问键
访问键(mnemonickey,助记键)也叫热键(hotkey)是菜单[项]标题字符串中出现的(可用对应的键盘按键快速访问的)带下划线的字符(一般为大写英文字母),例如菜单条上“文件(F)”菜单中的字母“F”和文件菜单中的“另存为(A)”菜单项的字母“A”。
访问键的使用方法有如下两种:
●按“Alt+访问键”,可“选中”当前窗口菜单条上访问键所对应的菜单[项],例如按“Alt+F”会打开“文件(F)”菜单。
●按“访问键”本身,可“选中”当前已展开菜单中其所对应的菜单项,例如在已经打开的文件菜单中,按“A”会选中“另存为(A)...”菜单项,从而打开对应的“另存为”对话框。
2.快捷键
快捷键(shortcutkey)又叫加速键(acceleratorkey),是由菜单项标题串右端指明的功能键组合,一般为Ctrl/Alt/Shift+大写英文字母或功能键Fn。
用快捷键可以直接访问当前窗口的任意菜单项(不论其所在的[子孙]菜单是否被展开),例如按“Ctrl+O”可以直接选中(尚未打开的)文件菜单中的“打开(O)...Ctrl+O”菜单项以打开对应的“打开”对话框。
需要注意的是,在MFC编程中,菜单项的快捷键并不是由其标题中的指示串决定的,而是由项目的加速键资源决定的。
因此,在设置完菜单项的各种属性之后,程序员还必须使用IDE的快捷键编辑器来将二者关联在一起。
3.1.3默认菜单
用MFC应用程序向导建立应用程序时,若选择的是单文档或多文档类型,而不是基于对话框类型,则会自动建立预定义的菜单条。
1.单文档程序
传统的单文档界面MFC应用程序只有一个菜单条,默认时含“文件”、“编辑”、“查看”、“帮助”4个下拉菜单(参见图3-1a)),菜单条的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-2a)。
●方法2:
⏹在项目区中选中“解决方案资源管理器”页,选中应用程序的“资源文件\*.rc”。
⏹按鼠标右键,在弹出的快捷菜单中,选“打开方式”菜单项,也参见图3-2a)。
⏹在弹出的“打开方式”对话框中,选中“源代码(文本)编辑器”项,按“确定”关闭对话框,参见图3-2b)。
a)文件快捷菜单b)打开方式对话框
图3-2以文本方式打开资源文件
●方法3:
⏹选“文件\打开\文件”菜单项,或按工具条上的打开文件按钮
,或按“Ctrl+O”组合键,弹出“打开文件”对话框。
⏹在“打开文件”对话框中,先选中*.rc文件,再选“打开”按钮右端的
钮打开下拉式列表,选中其中的“打开方式(W)...”项。
⏹在弹出的“打开方式”对话框中,选中“源代码(文本)编辑器”项,按“确定”关闭对话框,参见图3-2b)。
作为参考,下面给出由MFC应用程序向导自动生成的Student程序的默认资源头文件(Resource.h)和菜单资源文本的内容(位于资源脚本文件Student.rc中)。
2.资源头文件
VC在资源头文件Resource.h中定义各种ID符号常量,这些定义由MFC应用程序向导或资源编辑器自动生成,一般不需要自己手工修改。
下面是Student程序的初始资源头文件的内容:
//{{NO_DEPENDENCIES}}
//MicrosoftVisualC++generatedincludefile.
//UsedbyStudent.rc
//
#defineIDD_ABOUTBOX100
#defineIDP_OLE_INIT_FAILED100
#defineIDR_MAINFRAME128
#defineIDR_StudentTYPE130
//新对象的下一组默认值
//
#ifdefAPSTUDIO_INVOKED
#ifndefAPSTUDIO_READONLY_SYMBOLS
#define_APS_NEXT_RESOURCE_VALUE310
#define_APS_NEXT_CONTROL_VALUE1000
#define_APS_NEXT_SYMED_VALUE310
#define_APS_NEXT_COMMAND_VALUE32771
#endif
#endif
2.资源脚本文件
在MFC项目中,用资源脚本文件“项目名.rc”(后缀rc=resource,资源)来描述程序的各种资源,包括:
文本、图标、位图、工具栏、菜单、快捷键、对话框、版本、设计信息、字符串表等资源。
下面是Student程序的资源脚本文件Student.rc中的开始和默认菜单资源部分:
//MicrosoftVisualC++生成的资源脚本。
//
#include"resource.h"
……
/////////////////////////////////////////////////////////////////
//
//菜单
//
IDR_MAINFRAMEMENU
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
MENUITEMSEPARATOR
MENUITEM"打印(&P)...\tCtrl+P",ID_FILE_PRINT
MENUITEM"打印预览(&V)",ID_FILE_PRINT_PREVIEW
MENUITEM"打印设置(&R)...",ID_FILE_PRINT_SETUP
MENUITEMSEPARATOR
MENUITEM"最近的文件",ID_FILE_MRU_FILE1,GRAYED
MENUITEMSEPARATOR
MENUITEM"退出(&X)",ID_APP_EXIT
END
POPUP"编辑(&E)"
BEGIN
MENUITEM"撤消(&U)\tCtrl+Z",ID_EDIT_UNDO
MENUITEMSEPARATOR
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-4Student程序的运行结果
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-7Help属性为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、其余选项为Fal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 03 界面 编程 菜单