更新时间:2024-09-23 09:27
菜单栏实际是一种树型结构,为软件的大多数功能提供功能入口。点击以后,即可显示出菜单项。
菜单,将系统可以执行的命令以阶层的方式显示出来的一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。重要程度一般是从左到右,越往右重要度越低。命定的层次根据应用程序的不同而不同,一般重视文件的操作、编辑功能,因此放在最左边,然后往右有各种设置等操作,最右边往往设有帮助。一般使用鼠标的第一按钮进行操作。
即时菜单(又称功能表、上下文菜单(Context Menu)),与应用程序准备好的层次菜单不同,在菜单栏以外的地方,通过鼠标的第二按钮调出的菜单称为“即时菜单”。根据调出位置的不同,菜单内容即时变化,列出所指示的对象可以进行的操作。
单击菜单栏中的菜单命令将会出现一个下拉菜单。Word2003的菜单有自动记录功能,也就是说Word 2003记录了用户的常用操作习惯,只在菜单中显示最接近上次常用的命令,这为用户选择常用命令提供了很大的方便。如果某些命令在一段时间内没有被使用,就会自动隐藏。在菜单的底部都有一个箭头按钮,单击该按钮即可显示全部的菜单命令。
在菜单栏中,某些命令后边有个箭头符号,这表示该命令项后还有下一级子菜单。将鼠标停留一下,就会自动弹出子菜单。
如果在菜单命令的前面有一个对号,表明该菜单命令被激活。取消该命令前面的对号,则表明该命令没有被激活。如果用户看到某些命令的颜色变为浅灰色,表示该菜单命令暂时不能使用。如果菜单命令前面有图标,表明可以将这些命令添加到工具栏中。如果我们还会看见菜单命令的后面有组合按键,如Ctrl+O,这实际上的该命令的快捷键,熟记这些快捷键有助于我们快速操作。
菜单控件显示应用程序的自定义菜单。命令、子菜单或者分隔条都可包括在菜单之中。每一个创建的菜单至多有四级子菜单。菜单控件是一组通常在功能上相关的命令或控件的容器。提供特殊的布局行为,并支持用户启动的工具栏大小调整和排列。像winform/wpf ToolBar控件或专业控件ComponentOne的MenusandToolbars,可创建停靠/浮动的工具栏,多级菜单,全局的快捷键、可折叠/可展开的页面,MDI 应用程序使用的窗口列表等。
菜单在界面设计中是经常使用的一种元素,包括Windows系统中的窗口、智能终端设备的应用界面等都会经常见到菜单的身影。我们在对可视化窗口操作时,菜单确实提供了很大方便。
菜单可以分为下拉式菜单和弹出式菜单。
下拉式菜单一般在窗口标题栏下面显示。下拉式菜单通常是由主菜单栏、子菜单及子菜单中的菜单项和分隔条所组成的。
弹出式菜单一般可以通过单击鼠标右键等操作显示。它的主菜单不可见,只显示子菜单。
菜单也可以在VC的资源视图中直接创建编辑。我们先创建一个新的MFC单文档工程Example34,具体看看菜单的组成结构及各种标记的意义。
打开Resource View资源视图,展开Example34->Example34.rc->Menu,我们可以看到有一个ID为IDR_MAINFRAME菜单资源,双击打开。
包含“File”的一栏是主菜单栏,点击“File”弹出子菜单,可以看到子菜单中有多个菜单项和分隔条。菜单项中含有“...”则表示点击后会弹出对话框。
除了这些,我们还注意到,很多菜单项的标题文本中都有一个字母带下划线,带下划线的字母为热键,例如,主菜单栏上的“File”中字母“F”带下划线,F就是热键,程序运行并显示窗口时,在键盘上点击Alt+F就等同于直接点菜单项File,弹出File下的子菜单后,点击“Open”的热键O就可以实现与直接点菜单项Open相同的功能。
那么热键是如何定义的呢?我们可以看下“File”菜单项的属性,Caption为“&File”,很明显,只要在要定义为热键的字母前加&就可以了。
有些菜单项的右侧还显示了一些字符串,例如,“New”的右侧显示有“Ctrl+N”,这些代表的是快捷键,也就是“New”菜单项的快捷键是Ctrl+N,“Open”菜单项的快捷键是Ctrl+O,用这些组合键就能实现与相应菜单项一样的功能。
快捷键如何定义?我们再来看看“Open”菜单项的Caption属性,为“&Open... Ctrl+O”,这里的 表示在显示前面的文本后跳格再显示快捷键Ctrl+O,但这样设置其Caption属性只是能显示出快捷键,要实现快捷键的功能还需要在Accelerator资源中设定。资源视图中展开Example34.rc->Accelerator,双击打开下面的IDR_MAINFRAME,可以看到Accelerator中有四列,分别为:ID、Modifier、Key和Type。ID就是菜单项的ID,Modifer和Key就代表了组合键。例如,Open菜单项的ID为ID_FILE_OPEN,Modifer为“Ctrl”,Key为“O”。
MFC为菜单的操作提供了CMenu类,下面就常用的几个成员函数进行简单的介绍。
BOOL LoadMenu(UINT nIDResource);
加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,否则返回FALSE。
BOOL DeleteMenu(UINT nPosition,UINT nFlags);
在菜单中删除一个菜单项。参数nPosition指定要删除的菜单项。参数nFlags就用来解释nPosition的意义,为MF_BYCOMMAND时说明nPosition表示菜单项的ID,为MF_BYPOSITION时说明nPosition表示菜单项的位置,第一个菜单项的位置为0。如果删除菜单项成功则返回TRUE,否则返回FALSE。
BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = 0);
用来在指定位置显示一个浮动的弹出式菜单。参数nFlags指定屏幕坐标和鼠标位置的标志,可以是以下取值:
TPM_CENTERALIGN:菜单在水平方向上相对于参数x指定的坐标值居中显示
TPM_LEFTALIGN:菜单的左侧与参数x指定的坐标值对齐
TPM_RIGHTALIGN:菜单的右侧与参数x指定的坐标值对齐
TPM_BOTTOMALIGN:菜单的底部与参数y指定的坐标值对齐
TPM_TOPALIGN:菜单项的顶部与参数y指定的坐标值对齐
TPM_VCENTERALIGN:菜单在垂直方向上相对于参数y指定的坐标值居中显示
这里先介绍这几个比较常用的,其他可参见MSDN。参数x指定弹出式菜单的水平方向的屏幕坐标,参数y指定菜单顶部垂直方向上的屏幕坐标,参数pWnd指明哪个窗口拥有此弹出式菜单,不能为NULL,参数lpRect忽略。
UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);
在弹出菜单中为菜单项增加选中标记或移除选中标记。参数nIDCheckItem指定要选中或取消选中的菜单项。参数nCheck指定菜单项的选中状态和如何根据nIDCheckItem确定菜单项的位置,可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOMMAND的组合,这几个标志的含义如下:
MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID
MF_BYPOSITION:说明参数nIDCheckItem表示菜单项的位置,第一个菜单项的位置是0
MF_CHECKED:为菜单项添加选中标记
MF_UNCHECKED:为菜单项移除选中标记
该函数返回菜单项之前的状态:MF_CHECKED或MF_UNCHECKED, 如果菜单项不存在则返回0xFFFFFFFF。
UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
激活、禁用菜单项或使其变灰。参数nIDEnableItem指定要激活、禁用或变灰的菜单项。参数nEnable指定操作的类型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED与MF_BYCOMMAND或MF_BYPOSITION的组合,这些值的含义如下:
MF_BYCOMMAND:同CheckMenuItem
MF_BYPOSITION:同CheckMenuItem
MF_DISABLED:禁用菜单项,使其不能被选择但不变灰
MF_ENABLED:激活菜单项,使其能够被选择并由变灰状态恢复
MF_GRAYED:禁用菜单项,使其不能被选择并变灰
该函数返回菜单项之前的状态:MF_DISABLED、MF_ENABLED或MF_GRAYED
CMenu* GetSubMenu(int nPos) const;
获取弹出菜单的CMenu对象。参数nPos指定弹出菜单在菜单中的位置,不能使用ID。返回值是CMenu对象的指针,该CMenu对象的m_hMenu成员为由nPos指定的弹出菜单的句柄,如果不存在这样的CMenu对象则返回NULL,然后创建一个临时弹出菜单。
利用 ASP.NETMenu控件,可以开发 ASP.NET 网页的静态和动态显示菜单。您可以在Menu控件中直接配置其内容,也可通过将该控件绑定到数据源的方式来指定其内容。
无需编写任何代码,便可控制 ASP.NETMenu控件的外观、方向和内容。除该控件公开的可视属性外,该控件还支持 ASP.NET 控件外观和主题。有关外观和主题的更多信息,请参见ASP.NET 主题和外观概述。
静态显示和动态显示
Menu控件具有两种显示模式:静态模式和动态模式。静态显示意味着Menu控件始终是完全展开的。整个结构都是可视的,用户可以单击任何部位。在动态显示的菜单中,只有指定的部分是静态的,而只有用户将鼠标指针放置在父节点上时才会显示其子菜单项。
使用Menu控件的StaticDisplayLevels属性可控制静态显示行为。StaticDisplayLevels属性指示从根菜单算起,静态显示的菜单的层数。例如,如果将StaticDisplayLevels设置为 3,菜单将以静态显示的方式展开其前三层。静态显示的最小层数为 1,如果将该值设置为 0 或负数,该控件将会引发异常。
MaximumDynamicDisplayLevels属性指定在静态显示层后应显示的动态显示菜单节点层数。例如,如果菜单有 3 个静态层和 2 个动态层,则菜单的前三层静态显示,后两层动态显示。
如果将MaximumDynamicDisplayLevels设置为 0,则不会动态显示任何菜单节点。如果将MaximumDynamicDisplayLevels设置为负数,则会引发异常。