1、 菜单设计菜单设计11.1对话框设计对话框设计 11.211.1 11.1 菜单设计菜单设计11.1.1 11.1.1 菜单概述菜单概述 菜单对于我们来说并不陌生,要打开文件、保存菜单对于我们来说并不陌生,要打开文件、保存文件、执行程序等都离不开菜单。一个实际应用程序文件、执行程序等都离不开菜单。一个实际应用程序的功能往往比较复杂,在设计中需要按功能划分成一的功能往往比较复杂,在设计中需要按功能划分成一系列单功能模块,分别设计界面和代码。综合地运行系列单功能模块,分别设计界面和代码。综合地运行这些模块就能实现应用程序的完整功能,但分散的操这些模块就能实现应用程序的完整功能,但分散的操作却给运行
2、添加了麻烦,菜单是解决这一问题的最有作却给运行添加了麻烦,菜单是解决这一问题的最有效的方法。如果应用程序要为用户提供一组命令,使效的方法。如果应用程序要为用户提供一组命令,使用菜单可以十分方便地给命令分组,它把功能类似的用菜单可以十分方便地给命令分组,它把功能类似的命令放在同一个子菜单中,功能相距较远的命令放在命令放在同一个子菜单中,功能相距较远的命令放在不同的子菜单中。不同的子菜单中。标准的标准的Windows应用程序都会以菜单的方式为用应用程序都会以菜单的方式为用户提供一组命令,使用户容易访问这些命令,增强界户提供一组命令,使用户容易访问这些命令,增强界面的友好特性。可以说菜单是窗口界面的
3、重要组成部面的友好特性。可以说菜单是窗口界面的重要组成部分,通常一个分,通常一个Windows应用程序的所有功能都能通过应用程序的所有功能都能通过菜单命令的调用来完成,因此,菜单成为一个菜单命令的调用来完成,因此,菜单成为一个Windows应用程序功能的总汇。应用程序功能的总汇。在实际应用中,菜单可分为两种基本类型:弹出在实际应用中,菜单可分为两种基本类型:弹出式菜单和下拉式菜单。在使用式菜单和下拉式菜单。在使用Windows和其他应用软和其他应用软件时,我们经常见到这两种菜单。例如,打开件时,我们经常见到这两种菜单。例如,打开Word后,单击后,单击“文件文件”菜单所显示的就是下拉式菜单,而
4、菜单所显示的就是下拉式菜单,而用鼠标右键单击文档编辑区时所显示的菜单就是弹出用鼠标右键单击文档编辑区时所显示的菜单就是弹出式菜单。式菜单。弹出式菜单一般是当单击鼠标右键弹出式菜单一般是当单击鼠标右键时出现的菜单,是显示在窗体上,独立时出现的菜单,是显示在窗体上,独立于菜单栏的浮动菜单。弹出式菜单上显于菜单栏的浮动菜单。弹出式菜单上显示的菜单项取决于鼠标右键按下时的鼠示的菜单项取决于鼠标右键按下时的鼠标指针所在的位置,因此,弹出式菜单标指针所在的位置,因此,弹出式菜单又称为上下文菜单,应该用弹出式菜单又称为上下文菜单,应该用弹出式菜单提供一种访问公共的上下文命令的高效提供一种访问公共的上下文命令
5、的高效方法。方法。下拉式菜单是一种典型的窗口式菜下拉式菜单是一种典型的窗口式菜单。一般通过单击菜单栏中菜单标题(单。一般通过单击菜单栏中菜单标题(如文件、编辑等)时,可以如文件、编辑等)时,可以“下拉下拉”出出下一级的菜单,这样逐级下拉,用一个下一级的菜单,这样逐级下拉,用一个个窗口的形式弹出在屏幕上,操作完毕个窗口的形式弹出在屏幕上,操作完毕即可从屏幕上消失,并恢复原来的屏幕即可从屏幕上消失,并恢复原来的屏幕状态。在状态。在Windows及各种应用软件中,及各种应用软件中,下拉式菜单得到了广泛的应用,下拉式下拉式菜单得到了广泛的应用,下拉式菜单的结构及组成元素如图菜单的结构及组成元素如图11
6、-1所示。所示。图11-1 下拉式菜单结构及组成元素1菜单栏菜单栏 菜单栏又称为主菜单,出现在窗体的标题栏的下面,可包含菜单栏又称为主菜单,出现在窗体的标题栏的下面,可包含一个或多个菜单标题。当单击一个菜单标题(如一个或多个菜单标题。当单击一个菜单标题(如“文件文件”),包),包含菜单项目的列表就被拉下来。含菜单项目的列表就被拉下来。2菜单标题菜单标题 菜单标题是菜单栏中的一个元素,包括标题名称和热键。通菜单标题是菜单栏中的一个元素,包括标题名称和热键。通过点击菜单标题或使用热键可以在菜单标题的下面出现一个下拉过点击菜单标题或使用热键可以在菜单标题的下面出现一个下拉式菜单。式菜单。3菜单菜单
7、菜单是一个由多个菜单项或分隔条组成的上下排列的列表。菜单是一个由多个菜单项或分隔条组成的上下排列的列表。由菜单标题直接拉出的菜单称为一级菜单,由一级菜单中的菜单由菜单标题直接拉出的菜单称为一级菜单,由一级菜单中的菜单项拉出的菜单称为二级菜单,依次类推。项拉出的菜单称为二级菜单,依次类推。4菜单项菜单项 菜单项是对要执行的命令的描述,可菜单项是对要执行的命令的描述,可由标识文字、热键、快捷键组成。其中,由标识文字、热键、快捷键组成。其中,热键、快捷键是菜单项的可选择项。菜单热键、快捷键是菜单项的可选择项。菜单项的执行可由程序中的运行条件限制,当项的执行可由程序中的运行条件限制,当其呈灰色显示(如
8、图其呈灰色显示(如图11-1中的菜单项中的菜单项“粘粘贴(贴(P)”)时,表示此菜单项在此时不)时,表示此菜单项在此时不能被执行。要使您的应用程序简单好用,能被执行。要使您的应用程序简单好用,应该将菜单项按其功能分组。例如,图应该将菜单项按其功能分组。例如,图11-1中与编辑有关的命令中与编辑有关的命令“剪切剪切”,“复制复制”,“粘贴粘贴”和和“删除删除”等都列入等都列入“编辑编辑”菜单。菜单。有些菜单项目直接执行动作,如有些菜单项目直接执行动作,如“文件文件”菜单中的菜单中的“退出退出”菜单项将关闭应用程序。有的菜单项会显示一菜单项将关闭应用程序。有的菜单项会显示一个对话框,要求用户提供应
9、用程序执行动作所需信息,个对话框,要求用户提供应用程序执行动作所需信息,在这些菜单项后有省略符在这些菜单项后有省略符(.)。如图。如图11-1中中“编辑编辑”菜菜单中的单中的“设置字体设置字体”菜单项。菜单项。无论你在应用程序中使用什么样的菜单和菜单项,无论你在应用程序中使用什么样的菜单和菜单项,都应该使它们保持清晰和一致。菜单和菜单项应该容易都应该使它们保持清晰和一致。菜单和菜单项应该容易使用,并且应该尽可能与其它使用,并且应该尽可能与其它Windows应用程序保持一应用程序保持一致。在创建菜单项时,请遵循下面的原则:致。在创建菜单项时,请遵循下面的原则:(1)使用由一个或(至多)两个简短单
10、词组成的意义明)使用由一个或(至多)两个简短单词组成的意义明确的标题。确的标题。(2)程序中给每个菜单项分配唯一的热键,并尽可能使)程序中给每个菜单项分配唯一的热键,并尽可能使用菜单项的第一个字母作热键。用菜单项的第一个字母作热键。5分隔条分隔条 在菜单中常出现一条条横线称为分在菜单中常出现一条条横线称为分隔条,它用来对菜单中的各菜单项进行隔条,它用来对菜单中的各菜单项进行分组,使整个菜单安排得合理有序。分组,使整个菜单安排得合理有序。6热键热键 热键是菜单项中带下划线的、由括热键是菜单项中带下划线的、由括号括起来的字符。按下热键可以执行该号括起来的字符。按下热键可以执行该菜单项。菜单项。7快
11、捷键快捷键 快捷键是指菜单项中最左边的功能键快捷键是指菜单项中最左边的功能键或组合键。在程序运行过程中,按下快捷或组合键。在程序运行过程中,按下快捷键就会执行该快捷键对应的菜单项。使用键就会执行该快捷键对应的菜单项。使用快捷键方式不需要弹出菜单。快捷键方式不需要弹出菜单。在在Visual Basic中,菜单也是一个控件中,菜单也是一个控件对象。与其他控件一样,它具有定义外观对象。与其他控件一样,它具有定义外观与行为的属性,在设计或运行时可以设置与行为的属性,在设计或运行时可以设置Caption,Enabled,Visible等属性。菜单等属性。菜单控件只包含一个事件,即控件只包含一个事件,即
12、Click 事件,当事件,当用鼠标或键盘选择该菜单控件时,将调用用鼠标或键盘选择该菜单控件时,将调用该事件。该事件。11.1.2 11.1.2 菜单编辑器菜单编辑器 以前编写菜单程序是相当麻烦的,以前编写菜单程序是相当麻烦的,需要计算屏幕的位置,还需要保存和恢需要计算屏幕的位置,还需要保存和恢复屏幕区域等。但对于可视语言(如复屏幕区域等。但对于可视语言(如Visual Basic、Visual C+等)来说,菜等)来说,菜单的设计要简单和直观得多,全部设计单的设计要简单和直观得多,全部设计都在一个窗口内完成。都在一个窗口内完成。【菜单编辑器菜单编辑器】是是Visual Basic提供的用于提供
13、的用于设计菜单的编辑器。使用设计菜单的编辑器。使用【菜单编辑器菜单编辑器】可以可以非常方便地增加新的菜单、修改和重新排列现非常方便地增加新的菜单、修改和重新排列现有菜单以及删除以前设计的菜单,还可以使用有菜单以及删除以前设计的菜单,还可以使用它给菜单增加特殊效果,比如添加热键、选中它给菜单增加特殊效果,比如添加热键、选中标识以及快捷键等。标识以及快捷键等。【菜单编辑器菜单编辑器】的主要优点是使用方便,的主要优点是使用方便,它是设计和管理菜单的一个图形化工具,可以它是设计和管理菜单的一个图形化工具,可以在只用很少编程的全交互方式中自定义菜单。在只用很少编程的全交互方式中自定义菜单。可以通过以可以
14、通过以4种方式打开种方式打开【菜单编辑器菜单编辑器】:(1)在菜单栏中单击)在菜单栏中单击“工具工具”,然后选择,然后选择“菜菜单编辑器单编辑器”。(2)在)在“工具栏工具栏”上单击上单击“菜单编辑器菜单编辑器”按钮按钮。(3)使用快捷键)使用快捷键Ctrl+E。(4)在要建立菜单的窗体上单击鼠标右键,在)在要建立菜单的窗体上单击鼠标右键,在弹出的菜单中选择弹出的菜单中选择“菜单编辑器菜单编辑器”,如图,如图11-2所示。所示。图11-2 用弹出菜单打开菜单编辑器 这里指的是活动窗体,只有当某个窗体为活动窗这里指的是活动窗体,只有当某个窗体为活动窗体时,才能用上面的方法打开菜单编辑器窗口。打开
15、体时,才能用上面的方法打开菜单编辑器窗口。打开后的后的【菜单编辑器菜单编辑器】窗口如图窗口如图11-3所示。所示。图11-3 菜单编辑器窗口1 1菜单项属性区菜单项属性区 菜单项属性区分为若干栏,下面介菜单项属性区分为若干栏,下面介绍一下各栏的作用。绍一下各栏的作用。(1)标题)标题 标题是一个文本框,用来输入所建立菜单的各个标题是一个文本框,用来输入所建立菜单的各个菜单项的名称。当在该项中输入标题后,这些菜单项菜单项的名称。当在该项中输入标题后,这些菜单项的名称将在用户建立的菜单中显示出来,它相当于菜的名称将在用户建立的菜单中显示出来,它相当于菜单对象的单对象的Caption属性。如果在命令
16、执行之前要求用户属性。如果在命令执行之前要求用户输入更多信息,则可在菜单项标题后面加上个省略号输入更多信息,则可在菜单项标题后面加上个省略号(.),例如),例如“打开打开”菜单项。菜单项。分隔线可把菜单项划分成若干个逻辑组,例如分隔线可把菜单项划分成若干个逻辑组,例如Visual Basic的的“帮助帮助”菜单,使用分隔线将其菜单项菜单,使用分隔线将其菜单项分成三组。如果想在菜单中建立分隔线,则应在标题分成三组。如果想在菜单中建立分隔线,则应在标题框中输入一个连字符(框中输入一个连字符(-)。需要注意的是如果菜单控)。需要注意的是如果菜单控件是一个菜单标题、带有子菜单项、被复选或无效、件是一个
17、菜单标题、带有子菜单项、被复选或无效、或者有一个快捷键,那么它就不能作为分隔符条。或者有一个快捷键,那么它就不能作为分隔符条。通常,为了让热衷于键盘的用户能够通过键盘快通常,为了让热衷于键盘的用户能够通过键盘快速访问菜单,可以为菜单或菜单项添加热键,热键是速访问菜单,可以为菜单或菜单项添加热键,热键是由程序员指定的,使用由程序员指定的,使用【菜单编辑器菜单编辑器】为菜单和菜单为菜单和菜单项添加热键支持是件容易的事。具体做法是在菜单名项添加热键支持是件容易的事。具体做法是在菜单名后的括号里用后的括号里用“&”符号连接一个字母。这样,在程序符号连接一个字母。这样,在程序运行时,带有下划线的该字母(
18、运行时,带有下划线的该字母(&符号是不可见的)符号是不可见的)将显示在菜单名后,按将显示在菜单名后,按Alt+“该字母该字母”就可以访问某个就可以访问某个菜单或菜单项,设计和运行时的情况如图菜单或菜单项,设计和运行时的情况如图11-4和和11-5所所示。由于示。由于“&”符号在菜单设计的中有了特殊意义,因符号在菜单设计的中有了特殊意义,因此不可以直接使用,如果要在菜单中显示此不可以直接使用,如果要在菜单中显示“&”符号,符号,则应在标题中连续输入两个则应在标题中连续输入两个“&”符号。符号。如图11-4 菜单设计界面 如图11-5 菜单运行界面 如果不指定热键,则如果不指定热键,则Visual
19、 Basic中每个顶级菜单中每个顶级菜单的第一个字母就是热键。用户看不到第一个字母有下的第一个字母就是热键。用户看不到第一个字母有下划线,但是使用划线,但是使用Alt加上第一个字母也可以打开菜单。加上第一个字母也可以打开菜单。需要注意的是,不要为不同菜单建立相同的热键,否需要注意的是,不要为不同菜单建立相同的热键,否则只有第一次建立的热键才有效。则只有第一次建立的热键才有效。其实,任何控件(菜单项也是控件),只要它有其实,任何控件(菜单项也是控件),只要它有Caption(标题)属性,就可以为其指定热键。也就是(标题)属性,就可以为其指定热键。也就是说,热键是对控件的说,热键是对控件的Capt
20、ion属性的设置。对于一般控属性的设置。对于一般控件(即非菜单项),可以在设计阶段通过属性窗口在件(即非菜单项),可以在设计阶段通过属性窗口在Caption属性中加属性中加“&”设置热键,也可以在程序代码中设置热键,也可以在程序代码中设置。但是,有些控件没有设置。但是,有些控件没有Caption属性,或者属性,或者Caption属性被设置为空白,对于这样的控件,可以通过属性被设置为空白,对于这样的控件,可以通过Tab键键依照空位顺序选取,但也可以通过热键选取。依照空位顺序选取,但也可以通过热键选取。假定有一个文本框(或图片框),框内为假定有一个文本框(或图片框),框内为空白,则可以用下面的方法
21、设置热键:空白,则可以用下面的方法设置热键:建立一个标签,在标签后面紧接着建立建立一个标签,在标签后面紧接着建立一个文本框,即让文本框紧跟在标签的后面。一个文本框,即让文本框紧跟在标签的后面。标签有标签有Caption属性,因此可以对标签设属性,因此可以对标签设置热键。当用户通过热键选取标签时,由于标置热键。当用户通过热键选取标签时,由于标签不接收输入,因而把控制转移到位于其后的签不接收输入,因而把控制转移到位于其后的文本框。文本框。(2)名称)名称 “名称名称”输入框也是一个文本框,用来输入各菜单项的控输入框也是一个文本框,用来输入各菜单项的控制名,相当于菜单对象的制名,相当于菜单对象的Na
22、me属性。它用来在编辑程序代码时属性。它用来在编辑程序代码时代表菜单项,不会在菜单中出现。菜单设置中的每一项,无论代表菜单项,不会在菜单中出现。菜单设置中的每一项,无论是菜单名还是菜单项,只要在标题框中已输入标题,就必须要是菜单名还是菜单项,只要在标题框中已输入标题,就必须要为其取一个控制名,就像命令按钮、文本框必须要设置为其取一个控制名,就像命令按钮、文本框必须要设置Name属属性一样。性一样。为了使代码更可读和更易维护,在菜单编辑器中设置为了使代码更可读和更易维护,在菜单编辑器中设置 Name 属性时遵循已确定的命名约定是一个好办法。大多数命属性时遵循已确定的命名约定是一个好办法。大多数命
23、名约定规则都建议用前缀来标识对象,其后紧跟菜单的名称(名约定规则都建议用前缀来标识对象,其后紧跟菜单的名称(如如 File)。一般在命名菜单的时候,都是由前缀)。一般在命名菜单的时候,都是由前缀mnu加上一些加上一些有意义的字符组成,例如有意义的字符组成,例如“文件文件”菜单一般就命名为菜单一般就命名为mnuFile。用三个字母的标识作为用户界面元素的名称前缀有助于在大。用三个字母的标识作为用户界面元素的名称前缀有助于在大型程序中区分事件过程,并且前缀也能够帮助你在代码窗口中型程序中区分事件过程,并且前缀也能够帮助你在代码窗口中识别界面元素。识别界面元素。(3)索引)索引 “索引索引”输入框为
24、一个文本框,用输入框为一个文本框,用来建立控件数组下标,相当于控件数组来建立控件数组下标,相当于控件数组的的Index属性。控件数组是一组享有同一属性。控件数组是一组享有同一控件名而拥有不同属性的控件,即所有控件名而拥有不同属性的控件,即所有的菜单名称都相同,只是用不同的的菜单名称都相同,只是用不同的Index属性区分。属性区分。(4)快捷键)快捷键 “快捷键快捷键”为一个列表框,用来设置菜单为一个列表框,用来设置菜单项快捷键,快捷键和热键类似,只是当用户按项快捷键,快捷键和热键类似,只是当用户按了快捷键后,它不是打开菜单,而是直接执行了快捷键后,它不是打开菜单,而是直接执行菜单项的功能。例如
25、菜单项的功能。例如Visual Basic 6.0的的“运行运行”命令,可以使用它的快捷键命令,可以使用它的快捷键F5来直接运行程来直接运行程序。序。在快捷键列表框右侧有一个下拉箭头,单在快捷键列表框右侧有一个下拉箭头,单击这个箭头会出现一个列表,列出了可供用户击这个箭头会出现一个列表,列出了可供用户选择的快捷键。快捷键将自动出现在菜单上,选择的快捷键。快捷键将自动出现在菜单上,要删除快捷键应选取列表顶部的要删除快捷键应选取列表顶部的“none”,注,注意在菜单条上的第一级菜单不能设置快捷键。意在菜单条上的第一级菜单不能设置快捷键。可以为频繁使用的菜单项指定一个快捷键,它可以为频繁使用的菜单项
26、指定一个快捷键,它提供一种键盘单步访问的方法,而不是像使用热键提供一种键盘单步访问的方法,而不是像使用热键那样,按住那样,按住ALT键,再按菜单标题访问字符,然后键,再按菜单标题访问字符,然后再按菜单项访问字符的三步方法。快捷键的赋值包再按菜单项访问字符的三步方法。快捷键的赋值包括功能键与控制键的组合,如括功能键与控制键的组合,如CTRL+F1键或键或CTRL+A键。设置过快捷键后,快捷键将自动出键。设置过快捷键后,快捷键将自动出现在菜单中相应菜单项的右边。因此,不需要在现在菜单中相应菜单项的右边。因此,不需要在【菜单编辑器菜单编辑器】的的“标题标题”框中键入框中键入 CTRL+key等。等。
27、(5)帮助上下文)帮助上下文ID “帮助上下文帮助上下文ID”是一个文本框,用是一个文本框,用户可以输入指定一个唯一的数值,这个户可以输入指定一个唯一的数值,这个数值用来选择帮助文件中特定的页数或数值用来选择帮助文件中特定的页数或与该菜单上下文相关的帮助文件。与该菜单上下文相关的帮助文件。(6)协调位置)协调位置 “协调位置协调位置”为一个列表框,单击右侧为一个列表框,单击右侧的下拉箭头会出现一个下拉列表,用户可以通的下拉箭头会出现一个下拉列表,用户可以通过这一列表框来确定菜单是否出现或怎样出现过这一列表框来确定菜单是否出现或怎样出现。该列表有。该列表有4个选项:个选项:0-None (缺省值
28、)窗体的顶层菜单项不在对象菜单栏中显示(缺省值)窗体的顶层菜单项不在对象菜单栏中显示1-Left 窗体的菜单项在对象菜单栏的左边位置显示窗体的菜单项在对象菜单栏的左边位置显示2-Middle 窗体的菜单项在对象菜单栏的中间位置显示窗体的菜单项在对象菜单栏的中间位置显示3-Right 窗体的菜单项在对象菜单栏的右边位置显示窗体的菜单项在对象菜单栏的右边位置显示(7)复选)复选 “复选复选”决定在菜单项的左边是否设置复选标记决定在菜单项的左边是否设置复选标记,所谓复选标记,就是在菜单项的前面加上,所谓复选标记,就是在菜单项的前面加上“”。在。在程序运行时,选择该项时,可以在相应的菜单项旁加程序运行
29、时,选择该项时,可以在相应的菜单项旁加上上“”,不选择该项时,则没有,不选择该项时,则没有“”,通常用它指,通常用它指出切换选项的开关状态。它不改变菜单项的作用,也出切换选项的开关状态。它不改变菜单项的作用,也不影响事件过程对任何对象的执行结果,只是设置或不影响事件过程对任何对象的执行结果,只是设置或重新设置菜单项旁的符号。重新设置菜单项旁的符号。利用这个属性,一是可以指明某个菜单项当前是利用这个属性,一是可以指明某个菜单项当前是否处于活动状态;二是可以表示当前选择的是哪个菜否处于活动状态;二是可以表示当前选择的是哪个菜单项。单项。菜单项的标记通常是动态地加上或取消的,因此应在程序代菜单项的标
30、记通常是动态地加上或取消的,因此应在程序代码中根据执行情况设置。在程序运行时要在一个菜单项上增加或码中根据执行情况设置。在程序运行时要在一个菜单项上增加或删除复选标志,需要在代码中设置它的删除复选标志,需要在代码中设置它的Checked 属性。属性。假如一个菜单项的名称是假如一个菜单项的名称是mnuB,则在某个时刻在它前面添,则在某个时刻在它前面添加标记的代码为:加标记的代码为:mnuB.Checked=True 要删除该菜单项的标记,只需要把它的要删除该菜单项的标记,只需要把它的Checked属性设置为属性设置为False,如:,如:mnuB.Checked=False 但是一般情况下,在单
31、击一个菜单项时,希望交替地增加或但是一般情况下,在单击一个菜单项时,希望交替地增加或删除复选标志,这时可以这样设置它的删除复选标志,这时可以这样设置它的Checked 属性:属性:mnuB.Checked=Not mnuB.Checked(8)有效)有效 在典型的在典型的Windows应用程序中,并非所应用程序中,并非所有的菜单项都同时可用。有的菜单项都同时可用。“有效有效”决定是否决定是否让菜单项对事件作出响应,相当于控件的让菜单项对事件作出响应,相当于控件的Enabled属性。当有效复选框被选中时(即属属性。当有效复选框被选中时(即属性值被设置为性值被设置为True),表示当前高亮度的菜)
32、,表示当前高亮度的菜单项为可以执行的;未被选中时(即属性值单项为可以执行的;未被选中时(即属性值被设置为被设置为False),相应菜单项在执行时变为),相应菜单项在执行时变为灰色,表示不能被用户操作。灰色,表示不能被用户操作。在程序运行时,菜单中的某些菜单项应能根据执行条件的不在程序运行时,菜单中的某些菜单项应能根据执行条件的不同进行动态变化,即当条件满足时可以执行,否则不能执行。这同进行动态变化,即当条件满足时可以执行,否则不能执行。这样,既可以提示用户,又可以防止出现误操作。例如,在典型的样,既可以提示用户,又可以防止出现误操作。例如,在典型的Edit(编辑)菜单中,只有当剪贴板上保存有数
33、据时(编辑)菜单中,只有当剪贴板上保存有数据时Paste(粘贴(粘贴)菜单项才有效,当剪贴板中没有内容时,)菜单项才有效,当剪贴板中没有内容时,“粘贴粘贴”命令就没有命令就没有了使用的意义,这时候可以把它变为灰色,表示不可用。了使用的意义,这时候可以把它变为灰色,表示不可用。假如一个菜单项的名称是假如一个菜单项的名称是mnuEdit,如下代码可以将使它无,如下代码可以将使它无效:效:mnuEdit.Enabled=False 如果在某个时刻想使它重新有效,只需使用如下代码:如果在某个时刻想使它重新有效,只需使用如下代码:mnuEdit.Enabled=True(9)可见)可见 “可见可见”选项
34、决定菜单项在程序运行时是否被显示选项决定菜单项在程序运行时是否被显示,相当于控件的,相当于控件的Visible属性。默认情况下,此复选框被属性。默认情况下,此复选框被选中(即属性值被设置为选中(即属性值被设置为True),表示当前菜单项在程),表示当前菜单项在程序运行时被显示出来;未被选中时(即属性值被设置为序运行时被显示出来;未被选中时(即属性值被设置为False),则该菜单项在运行时和开发环境中都不会在),则该菜单项在运行时和开发环境中都不会在窗体中显示。窗体中显示。如果一个菜单项是不可见的,则其所有子菜单也是如果一个菜单项是不可见的,则其所有子菜单也是不可见的。当一个菜单项不可见时,菜单
35、中的其余菜单不可见的。当一个菜单项不可见时,菜单中的其余菜单项会上移以填补空出的位置。如果菜单位于菜单栏上,项会上移以填补空出的位置。如果菜单位于菜单栏上,则菜单栏上其余的控件会左移以填补该位置。则菜单栏上其余的控件会左移以填补该位置。在运行时,要使一个菜单控件可见或不可在运行时,要使一个菜单控件可见或不可见,可以在代码中设置其见,可以在代码中设置其 Visible 属性。假如属性。假如一个菜单项的名称为一个菜单项的名称为mnuP,则如果在某个时,则如果在某个时刻使它不可见,可以使用如下代码:刻使它不可见,可以使用如下代码:mnuP.Visible=False 在某个时刻,又需要该菜单项显示,
36、则把在某个时刻,又需要该菜单项显示,则把它的它的Visible 属性设置为属性设置为True就可以了,如:就可以了,如:mnuP.Visible=True(10)显示窗口列表)显示窗口列表 该复选框可设置在使用多文档应用该复选框可设置在使用多文档应用程序时,是否使菜单控件中有一个包含程序时,是否使菜单控件中有一个包含打开的多文档文件子窗口的列表框,在打开的多文档文件子窗口的列表框,在后面的章节中还有介绍。后面的章节中还有介绍。2 2编辑区编辑区 编辑区共有编辑区共有7个按钮,用来对输入的个按钮,用来对输入的菜单项进行简单的编辑,下面把这几个菜单项进行简单的编辑,下面把这几个按钮的功能进行简要的
37、介绍。按钮的功能进行简要的介绍。(1)左右箭头按钮)左右箭头按钮 左右箭头按钮用于将菜单项向左或向右缩左右箭头按钮用于将菜单项向左或向右缩进四格距离,改变该菜单项在菜单列表框中的进四格距离,改变该菜单项在菜单列表框中的缩进位置,决定该菜单是菜单标题、菜单项、缩进位置,决定该菜单是菜单标题、菜单项、子菜单标题或子菜单项。子菜单标题或子菜单项。单击一次右箭头,则产生四个点,把选定单击一次右箭头,则产生四个点,把选定的菜单下移一个等级,一共可以创建的菜单下移一个等级,一共可以创建4个子菜个子菜单等级(共五个等级);单击一次左箭头,则单等级(共五个等级);单击一次左箭头,则删除四个点,把选定的菜单上移
38、一个等级。删除四个点,把选定的菜单上移一个等级。所创建的每个菜单可以包含最多五级子菜单,子所创建的每个菜单可以包含最多五级子菜单,子菜单会分支出另一个菜单以显示它自己的菜单项。需菜单会分支出另一个菜单以显示它自己的菜单项。需使用子菜单的场合有:菜单栏已满;某一特定菜使用子菜单的场合有:菜单栏已满;某一特定菜单控件很少被用到;要突出某一菜单控件与另一个单控件很少被用到;要突出某一菜单控件与另一个的关系。然而,如果菜单栏中还有空间,最好再创建的关系。然而,如果菜单栏中还有空间,最好再创建一个菜单标题而不是子菜单。这样,当菜单拉下时所一个菜单标题而不是子菜单。这样,当菜单拉下时所有控件都可见。限制使
39、用子菜单也是一种好的编程策有控件都可见。限制使用子菜单也是一种好的编程策略,它可以免去查找应用程序菜单界面的负担(大多略,它可以免去查找应用程序菜单界面的负担(大多数应用程序都只使用一级子菜单)。如果想用多于一数应用程序都只使用一级子菜单)。如果想用多于一级的子菜单,可以考虑使用对话框来替代,对话框允级的子菜单,可以考虑使用对话框来替代,对话框允许在一个地方指定好几个选择。关于使用对话框的内许在一个地方指定好几个选择。关于使用对话框的内容,请参阅本章后面的容,请参阅本章后面的“对话框对话框”内容。内容。(2)上下箭头按钮)上下箭头按钮 上下箭头按钮可将选中的菜单项向上或向下移动上下箭头按钮可将
40、选中的菜单项向上或向下移动一位,从而改变菜单中各菜单项的顺序。使用上下箭一位,从而改变菜单中各菜单项的顺序。使用上下箭头的时候,首先选中一个菜单项,使这一菜单项高亮头的时候,首先选中一个菜单项,使这一菜单项高亮度显示,当单击向上按钮时,该菜单项上移一位,与度显示,当单击向上按钮时,该菜单项上移一位,与它上面的菜单项交换位置;单击向下按钮时,该菜单它上面的菜单项交换位置;单击向下按钮时,该菜单项下移一位,与它下面的菜单项交换位置。项下移一位,与它下面的菜单项交换位置。很多时候,第一次定义菜单项时很难保证所做的很多时候,第一次定义菜单项时很难保证所做的决定周全无误,所以改变菜单项的次序是个必须掌握
41、决定周全无误,所以改变菜单项的次序是个必须掌握的重要技巧。的重要技巧。(3)“下一个下一个”按钮按钮 单击该按钮将选定光标移动到下一单击该按钮将选定光标移动到下一行,它与回车键的作用相同。设置好一行,它与回车键的作用相同。设置好一个菜单项的属性后,单击此按钮可设置个菜单项的属性后,单击此按钮可设置下一个菜单项的属性。下一个菜单项的属性。(4)“插入插入”按钮按钮 该按钮用来插入新的菜单项。当建立了多该按钮用来插入新的菜单项。当建立了多个菜单项后,如果想在某个菜单项前插入一个个菜单项后,如果想在某个菜单项前插入一个新的菜单项,可先选中该菜单项(即单击该菜新的菜单项,可先选中该菜单项(即单击该菜单
42、项,把光标移动到该菜单项上),然后单击单项,把光标移动到该菜单项上),然后单击“插入插入”按钮,选中的菜单项将下移一行,上按钮,选中的菜单项将下移一行,上面空出一行,用户可在这一行设置新的菜单项面空出一行,用户可在这一行设置新的菜单项。(5)“删除删除”按钮按钮 该按钮用于删除某个菜单项。在删除菜单该按钮用于删除某个菜单项。在删除菜单项的时候,首先选中要删除的菜单项,然后单项的时候,首先选中要删除的菜单项,然后单击击“删除删除”按钮就可以了。按钮就可以了。3 3菜单项显示区菜单项显示区 在在【菜单编辑器菜单编辑器】窗口的下部是一个空白列表窗口的下部是一个空白列表框,称为菜单项显示区,这里列出了
43、用户为某个窗框,称为菜单项显示区,这里列出了用户为某个窗体设计的所有菜单。用户设计菜单时,在体设计的所有菜单。用户设计菜单时,在【菜单编菜单编辑器辑器】窗口中编辑好的菜单会立刻在列表框中显示窗口中编辑好的菜单会立刻在列表框中显示出来,并通过内缩符号(出来,并通过内缩符号(.)表明菜单项的层次,)表明菜单项的层次,光标所在的菜单项就是光标所在的菜单项就是“当前菜单项当前菜单项”。尽管大多数菜单控件属性可用尽管大多数菜单控件属性可用【菜单编辑器菜单编辑器】设置,所有的菜单属性在设置,所有的菜单属性在“属性属性”窗口中也都是可窗口中也都是可用的。通常,在用的。通常,在【菜单编辑器菜单编辑器】中建立菜
44、单,但要中建立菜单,但要快速改变单个属性,一般使用快速改变单个属性,一般使用“属性属性”窗口。窗口。11.1.3 11.1.3 用菜单编辑器建立菜单用菜单编辑器建立菜单 建立一个菜单,首先要列出菜单的组成,然后在建立一个菜单,首先要列出菜单的组成,然后在【菜单编辑器菜单编辑器】窗口按着菜单组成进行设计。使用窗口按着菜单组成进行设计。使用【菜单编辑器菜单编辑器】在当前窗体中创建菜单界面的一般步骤在当前窗体中创建菜单界面的一般步骤如下:如下:(1)用我们上节介绍的打开)用我们上节介绍的打开【菜单编辑器菜单编辑器】的方法,打的方法,打开开【菜单编辑器菜单编辑器】。(2)【菜单编辑器菜单编辑器】启动后
45、,会出现一个空的项,在此启动后,会出现一个空的项,在此项的项的“标题标题”栏中,为第一个菜单标题键入希望在菜栏中,为第一个菜单标题键入希望在菜单栏上显示的文本。如果希望某一字符成为该菜单项单栏上显示的文本。如果希望某一字符成为该菜单项的热键,也可以在该字符前面加上一个的热键,也可以在该字符前面加上一个(&)字符。在字符。在菜单中,这一字符会自动加上一条下划线。菜单中,这一字符会自动加上一条下划线。(3)在)在“名称名称”文本框中,键入将用来在代码中引用该文本框中,键入将用来在代码中引用该菜单项的名字。菜单项的名字。(4)单击向左或向右箭头按钮,可以改变该菜单项的缩)单击向左或向右箭头按钮,可以
46、改变该菜单项的缩进级。进级。(5)如果需要的话,还可以设置控件的其他属性。这一)如果需要的话,还可以设置控件的其他属性。这一工作可以在菜单编辑器中做,也可以以后在工作可以在菜单编辑器中做,也可以以后在“属性属性”窗口中做。窗口中做。(6)单击)单击“下一个下一个”按钮就可以再建一个菜单项。按钮就可以再建一个菜单项。(7)重复第()重复第(3)到第()到第(6)步骤,可以生成其他的菜单)步骤,可以生成其他的菜单项。项。(8)检查所建立的菜单,看是否需要修改。可以)检查所建立的菜单,看是否需要修改。可以单击单击“插入插入”在现有的菜单项之间增加一个菜在现有的菜单项之间增加一个菜单项;也可以单击向上
47、与向下的箭头按钮,改单项;也可以单击向上与向下的箭头按钮,改变现有菜单项的顺序;选中某个菜单项,可以变现有菜单项的顺序;选中某个菜单项,可以单击单击“删除删除”按钮删除该菜单项,还可以改变按钮删除该菜单项,还可以改变该菜单项的其他属性。该菜单项的其他属性。(9)如果窗体所有的菜单项都已创建,并确认无)如果窗体所有的菜单项都已创建,并确认无误时,单击误时,单击“确定确定”按钮关闭按钮关闭【菜单编辑器菜单编辑器】,创建的菜单将显示在窗体上。,创建的菜单将显示在窗体上。当把菜单增加到窗体上后,就可以当把菜单增加到窗体上后,就可以编写事件过程来处理菜单命令。菜单的编写事件过程来处理菜单命令。菜单的最主
48、要事件就是最主要事件就是Click事件,对该事件编事件,对该事件编程就可以实现菜单的操作。程就可以实现菜单的操作。例例11-1(参看教材(参看教材P197)例例11-2(参看教材(参看教材P197-200)例例11-3(参看教材(参看教材P200-201)11.1.4 11.1.4 菜单项的增减菜单项的增减 我们用前面的方法建立的菜单是固定我们用前面的方法建立的菜单是固定的,菜单项不能自动增减。为了增加或减的,菜单项不能自动增减。为了增加或减少菜单项,必须打开少菜单项,必须打开【菜单编辑器菜单编辑器】,对,对原来的菜单进行增删。原来的菜单进行增删。在在Word的的“窗口窗口”菜单中,其子菜单菜
49、单中,其子菜单可以根据当前打开文件的多少而动态变化可以根据当前打开文件的多少而动态变化。每打开一个文件,在。每打开一个文件,在“窗口窗口”菜单中就菜单中就增加一个子菜单项。每关闭一个文件,增加一个子菜单项。每关闭一个文件,“窗口窗口”菜单中就减少一个子菜单项。在实菜单中就减少一个子菜单项。在实际应用中,有时候需要这种自动增减菜单际应用中,有时候需要这种自动增减菜单项的操作,这一节就介绍如何实现这种操项的操作,这一节就介绍如何实现这种操作。作。在运行时对菜单项进行增加或删除,必须使用菜单控在运行时对菜单项进行增加或删除,必须使用菜单控件数组。菜单控件数组就是在同一菜单上共享相同名称和件数组。菜单
50、控件数组就是在同一菜单上共享相同名称和事件过程的菜单项目的集合。菜单控件数组使用于:(事件过程的菜单项目的集合。菜单控件数组使用于:(1)在运行时创建一个新菜单项;(在运行时创建一个新菜单项;(2)简化代码,因为通用代)简化代码,因为通用代码块可以被所有菜单项使用。码块可以被所有菜单项使用。每个菜单控件数组元素都由唯一的索引值来标识,该每个菜单控件数组元素都由唯一的索引值来标识,该值在值在【菜单编辑器菜单编辑器】上上“Index 属性框属性框”中指定。当一个控中指定。当一个控件数组成员识别一个事件时,件数组成员识别一个事件时,Visual Basic将其将其 Index 属性属性值作为一个附加