第9章菜单与对话框第9章菜单与对话框9.1使用菜单菜单是Windows应用程序中十分关键的要素之一,它以分组的形式组织多个命令或操作,为用户灵活操作应用程序提供了便捷的手段。在实际的应用中,菜单可分为两种基本类型:下拉式菜单和弹出式菜单。下拉式菜单一般通过单击菜单栏中菜单标题(如“文件”、“编辑”、“视图”等)的方式打开,弹出式菜单则通过用鼠标右键单击某一区域的方式打开。9.1.1下拉式菜单在下拉式菜单系统中,一般有一个主菜单,称为菜单栏。其中包括一个或多个选择项,称为菜单标题。当单击一个菜单标题时,包含菜单项的列表(菜单)即被打开。菜单由若干个命令、分隔条、子菜单标题(其右边含有三角的菜单项)等菜单项组成。当选择子菜单标题时又会“下拉”出下一级菜单项列表,称为子菜单。VB的菜单系统最多可达6层。1.菜单控件在VB中,菜单也是一个图形对象,即控件。与其它控件一样,它具有定义其外观与行为的属性。在设计或运行时可以设置Caption属性、Enabled和Visible属性、Checked属性以及其它属性。菜单控件只包含一个事件,即Click事件,当用鼠标或键盘选中该菜单控件时,将调用该事件。与一般控件不同的是,菜单控件不在VB的工具箱中,需要在VB的“菜单编辑器”中进行菜单的设计。2.菜单编辑器用菜单编辑器可以创建新的菜单和菜单项、在已有的菜单上增加新命令、编辑已有的菜单命令、以及修改和删除已有的菜单和菜单项。在VB系统的“工具”菜单中选择“菜单编辑器”,或在“工具栏”上单击“菜单编辑器”按钮都可以打开菜单编辑器,如图9-2所示。图9-2菜单编辑器菜单编辑器分为三个部分:1)菜单控件属性区。用于设置菜单项的各个属性,表9-1列出其中的主要属性:表9-1菜单控件的主要属性其他属性可参见VB的联机帮助。属性说明标题(Caption)设置菜单项的标题,相当于控件的Caption属性,也是显示在菜单中的字符。可以在标题中设置热键。可以用分割线将某些菜单项归为一类并与其他项隔开。名称(Name)设置菜单项的名称,相当于控件的Name属性。菜单项的命名规则与控件的命名规则相同。索引(Index)设置菜单控件数组的下标,相当于控件数组的Index属性。快捷键(Shortcut)可设置与菜单项等价的快捷键。在程序运行时,按下快捷键会立刻运行一个菜单项。快捷键的赋值包括功能键与控制键的组合,如〈Ctrl〉+〈F1〉键或〈Ctrl〉+〈A〉键。它们出现在菜单中相应菜单项的右边。复选(Checked)“复选”属性设置为True时,可以在相应的菜单项旁加上记号“√”。表明该菜单项当前处于活动状态。有效(Enabled)用来设置菜单项的操作状态。如果该属性被设置为False,则相应的菜单项会变“灰”,不响应用户事件。可见(Visible)设置该菜单项是否可见。如果该属性被设置为False,则相应的菜单项将被暂时从菜单中去掉,直到该属性重新被设置为True。2)编辑区。编辑区共有7个按钮,用来对输入的菜单项进行简单的编辑。3)菜单控件列表框。菜单控件列表框位于菜单编辑器的下部,输入的菜单项在这里显示出来,并通过内缩符号表明菜单项的层次,如图9-3所示。图9-3菜单控件列表框与对应的菜单项3.下拉式菜单的设计下面通过一个例子来说明菜单程序设计的基本方法和步骤,这个方法具有通用性,无论多复杂的菜单都可以通过这个方法设计出来。【例9-1】为例4-13中的电子标题板增加一个菜单,利用菜单来控制标题板的内容、字体、字体风格等,如图9-4所示。图9-4利用菜单控制标题板只需在例4-13的基础上作如下修改:①打开菜单编辑器,按照表9-3设计菜单项:表9-3菜单项的设置标题(Caption)名称(Name)说明标题板(&F)menu主菜单项1….文本内容(&T)txt子菜单项11….文本字体(&N)nam子菜单项12….….宋体song子菜单项121….….隶书li子菜单项122….….楷体kai子菜单项123….….黑体hei子菜单项124….文本风格(&S)styl子菜单项13….….粗体bld子菜单项131….….斜体itl子菜单项132….….下划线undrln子菜单项133②编写菜单项代码。编写“文本内容”项Txt的Click事件代码:PrivateSubTxt_Click()temp=InputBox(请输入标题板的新内容,输入,Label1.Caption)IftempThenLabel1.Caption=tempEndIfEndSub编写“文本字体”中4个菜单选项的Click事件代码:PrivateSubsong_Click()Label1.FontName=宋体EndSubPrivateSubli_Click()Label1.FontName=隶书EndSubPrivateSubkai_Click()Label1.FontName=楷体_GB2312EndSubPrivateSubhei_Click()Label1.FontName=黑体EndSub编写“文本风格”中3个菜单选项的Click事件代码:PrivateSubbld_Click()bld.Checked=Notbld.CheckedLabel1.FontBold=bld.CheckedEndSubPrivateSubItl_Click()Itl.Checked=NotItl.CheckedLabel1.FontItalic=Itl.CheckedEndSubPrivateSubUndrln_Click()Undrln.Checked=NotUndrln.CheckedLabel1.FontUnderline=Undrln.CheckedEndSub4.菜单控件数组既然VB将菜单项视为控件,因此就能运用控件数组的概念。菜单控件数组的作用主要有两个:1)用于动态地增删菜单项。2)简化编程,用一段代码处理多个菜单项。【例9-2】在例9-1中使用菜单控件数组。只需在例9-1的基础上作如下修改:1)打开菜单编辑器,按照表9-4修改菜单项:表9-4菜单项的修改标题(Caption)名称(Name)索引(Index)说明标题板(&F)Menu主菜单项1….文本内容(&T)txt子菜单项11….文本字体(&N)txtFont子菜单项12….….宋体fname1子菜单项121….….隶书fname2子菜单项122….….楷体fname3子菜单项123….….黑体fname4子菜单项124….文本风格(&S)Styl子菜单项13….….粗体Styly1子菜单项131….….斜体Styly2子菜单项132….….下划线Styly3子菜单项1332)修改菜单项代码。删除原“文本字体”中4个菜单选项的Click事件代码,编写“文本字体”菜单中的菜单控件数组fname的Click事件代码:PrivateSubfname_Click(IndexAsInteger)SelectCaseIndexCase1Label1.Fontname=宋体Case2Label1.Fontname=隶书Case3Label1.Fontname=楷体_GB2312Case4Label1.Fontname=黑体EndSelectEndSub删除原“文本风格”中3个菜单选项的Click事件代码,编写“文本风格”菜单中的菜单控件数组Styly的Click事件代码:PrivateSubStyly_Click(IndexAsInteger)Styly(Index).Checked=NotStyly(Index).CheckedSelectCaseIndexCase1Label1.FontBold=Styly(Index).CheckedCase2Label1.FontItalic=Styly(Index).CheckedCase3Label1.FontUnderline=Styly(Index).CheckedEndSelectEndSub5.菜单项的可用与不可用VB设计的菜单可以根据程序的运行状态动态地进行调整。当菜单项所指示的操作不适合当前的环境时,可以暂时将其关闭,不让用户选择该菜单项,也可以干脆把它隐藏起来,就像根本没有这个菜单项一样,等到条件成熟时,再重新显示被隐藏的菜单项。【例9-3】在例9-2中,当前文本的字体在菜单中被关闭——菜单项呈灰色,可以选择未被选择的字体。如图9-5所示。只需在例9-2的基础上修改“文本字体”菜单中的菜单控件数组fname的Click事件代码:PrivateSubfname_Click(IndexAsInteger)SelectCaseIndexCase1Label1.Fontname=宋体Case2Label1.Fontname=隶书Case3Label1.Fontname=楷体_GB2312Case4Label1.Fontname=黑体EndSelectForEachxInfnamex.Enabled=IIf(x.Index=Index,False,True)NextEndSub图9-5菜单项的可用与不可用隐藏一个菜单项的办法也是很简单的。在上例中,修改“文本字体”菜单中的菜单控件数组Fontname的Click事件代码如下,即可隐藏或重现菜单项(如图9-6)。PrivateSubfname_Click(IndexAsInteger)SelectCaseIndexCase1Label1.FontName=宋体Case2Label1.FontName=隶书Case3Label1.FontName=楷体_GB2312Case4Label1.FontName=黑体EndSelectForEachxInfnamex.Visible=IIf(x.Index=Index,False,True)NextEndSub9.1.2弹出式菜单弹出式菜单能以灵活的方式为用户提供更加便利的操作,它可以根据用户单击鼠标右键时的位置,动态地调整菜单项的显示位置,同时也改变菜单项显示内容,因此弹出式菜单又称为“上下文菜单”或“快捷菜单”。为了显示“弹出式菜单”,可以使用PopupMenu方法,语法为:[〈窗体名〉.]PopupMenu〈菜单名〉[,flags[,x[,y[,boldcommand]]]]Flags参数为一些常量数值的设置,包含位置常数及行为常数两个指定值,见表9-5和表9-6。表9-5位置常数表9-6行为常数位置常数说明0(默认)菜单左上角位于X4菜单上框中央位于X8菜单右上角位于X行为常数说明0(默认)菜单命令只接受右键单击2菜单命令可接受左、右键单击Boldcommand参数可以指定在显示的弹出式菜单中想以粗体字体出现的菜单项的名称。在弹出式菜单中只能有一个菜单项被加粗。为创建一个不显示在菜单栏里的菜单,可在设计时使顶级菜单项目为不可见(保证在菜单编辑器里的“Visible”复选框没有被选上)。当VB显示一个弹出式菜单时,指定的顶级菜单的Visible属性会被忽略。【例9-4】在例9-1中实现弹出式菜单(如图9-7)。图9-7自定义的弹出式菜单只需增加标签和窗体的MouseDown事件代码:PrivateSubLabel1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=2ThenPopupMenuStyl,6EndIfEndSubPrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=2ThenPopupMenutxtfont,6EndIfEndSub注意:在VB的文本框中,即使不编程也可以得到一个弹出式菜单。9.2公共对话框“公共对话框”(CommonDialog)控件为用户提供了一组标准的系统对话框,可以使用它进行打开或保存文件、设置打印选项、选择各种颜色以及选择字体等的操作。另外还可以通过