![]() ![]() |
|
VisualBasic菜单在应用程序中的使用二 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:48:27 文章录入:杜斌 责任编辑:杜斌 | |
|
|
所创建的每个菜单可以包含最多五级子菜单。子菜单会分支出另一个菜单以显示它自己的菜单项。需使用子菜单的场合有: 菜单栏已满。 某一特定菜单控件很少被用到。 要突出某一菜单控件与另一个的关系。 然而,如果菜单栏中还有空间,最好再创建一个菜单标题而不是子菜单。这样,当菜单拉下时所有控件都可见。限制使用子菜单也是一种好的编程策略,它可以免去查找应用程序菜单界面的负担(大多数应用程序都只使用一级子菜单)。 在菜单编辑器中,在不是菜单标题的菜单控件之下缩进的任何菜单控件,都是子菜单控件。一般来说,子菜单控件可以包括子菜单项、分隔符条和子菜单标题。 要创建子菜单,请按照以下步骤执行: 1. 创建想作为子菜单标题的菜单项。 2. 创建将出现在新子菜单中的各个项目,然后单击右箭头按钮将它们缩进。 在菜单编辑器中每一缩进级前都加了四个点 (....)。要删除一缩进级,单击左箭头按钮。 注意 如果想用多于一级的子菜单,可以考虑使用对话框来替代。对话框允许在一个地方指定好几个选择。关于使用对话框的内容,请参阅本章后面的“对话框”。 创建菜单控件数组 菜单控件数组就是在同一菜单上共享相同名称和事件过程的菜单项目的集合。菜单控件数组使用于: 在运行时要创建一个新菜单项,它必须是控件数组中的成员。如 MDINotepad 示例,它就用一个菜单控件数组来存储新近打开的文件清单。 简化代码,因为通用代码块可以被所有菜单项使用。 每个菜单控件数组元素都由唯一的索引值来标识,该值在菜单编辑器上“Index 属性框”中指定。当一个控件数组成员识别一个事件时,Visual Basic将其 Index 属性值作为一个附加的参数传递给事件过程。事件过程必须包含有核对 Index 属性值的代码,因而可以判断出正在使用的是哪一个控件。 详细信息 关于控件数组的详细信息,请参阅第七章“使用 Visual Basic 的标准控件”中的“使用控件数组”。要在菜单编辑器中创建菜单控件数组,请按照以下步骤执行: 1. 选取窗体。 2. 从“工具”菜单中,选取“菜单编辑器”。 - 或 - 在“工具栏”上单击“菜单编辑器”按钮。 3. 在“标题”文本框中,键入想出现在菜单栏中的第一个菜单标题的文本。菜单标题文本显示在菜单控件列表框中。 4. 在“名称”文本框中,键入将在代码中用来引用菜单控件的名称。保持“索引”框是空的。 5. 在下一个缩进级,通过设定“标题”和“名称”来创建将成为数组中第一个元素的菜单项。 6. 将数组中第一个元素的“索引”设置为 0。 7. 在第一个的同一缩进级上创建第二个菜单项。 8. 将第二个元素的“名称”设置成与第一个元素相同,且把它的“索引”设置为 1。 9. 对于数组中的后续元素重复步骤 5- 8。 重点 菜单控件数组的各元素在菜单控件列表框中必须是连续的,而且必须在同一缩进级上。创建菜单控件数组时,要把在菜单中出现的分隔符条也包括进去。 运行时创建和修改菜单 设计时创建的菜单也能动态地响应运行时的条件。例如,如果菜单项的动作在某些点上成为不适当时,通过使其失效可防止对该菜单项的选取。比如:在 MDI NotePad 应用程序中,如果剪贴板上没有任何文本,则“编辑”菜单中的“粘贴”菜单项变暗,因而就不能被选。 如果有一个菜单控件数组,也可以动态地增加菜单项。这将在本主题后面的“运行时添加菜单控件”中讲述。 也可以编写应用程序,使用复选标志来指示几个命令中的哪一个是最后选取的。例如:如果工具栏被显示,MDI NotePad 应用程序工具栏的“选项”菜单项就会显示一个复选标志。本节描述的其它菜单控件功能包括使菜单项可见或不可见以及增加或删除菜单项操作的代码。 使菜单命令有效或无效 所有的菜单控件都具有 Enabled 属性,当这个属性设为 False 时,菜单命令无效使它不响应动作。当 Enabled 设为 False 时,快捷键的访问也无效。一个无效的菜单控件会变暗,如图 6.11 所示的“粘贴”菜单项。 ![]() 例如:下列语句使 MDI NotePad 应用程序中“编辑”菜单上的“粘贴”菜单项无效。 mnuEditPaste.Enabled = False 菜单标题的无效使得整个菜单无效,因为不首先单击菜单标题,就不能访问任何菜单项。例如:下列代码将使 MDI NotePad 应用程序的“编辑”菜单无效。 mnuEdit.Enabled = False 显示菜单控件上的复选标志 使用 Checked 属性,可以把一个复选标志放置在菜单上,以便: 表示打开/关闭条件的状态。选取菜单命令可交替地增加和删除此复选标志。 指示几个模式中哪一个正在起作用。MDI NotePad 应用程序的“选项”菜单使用复选标志来指示工具栏的状态,如图 6.12 所示。 在 Visual Basic 中可以用 Checked 属性来创建复选标志。通过选取被标记为 Checked 的复选框来设置菜单编辑器中的 Checked 属性的初始值。在运行时要从一个菜单控件上增加或删除复选标志,可以从代码中设置它的Checked 属性。例如:
Private Sub mnuOptions_Click () '根据 Visible 属性设置复选标志的状态。 mnuOptionsToolbar.Checked = picToolbar.Visible End Sub ![]() 使菜单控件不可见 在菜单编辑器中,通过选取被标记为 Visible 的复选框,可以设置菜单控件的 Visible 属性的初值。在运行时,要使一个菜单控件可见或不可见,可以从代码中设置其 Visible 属性。例如: mnuFileArray(0).Visible = True ' 使控件可见。 mnuFileArray(0).Visible = False ' 使控件不可见。 当一个菜单控件不可见时,菜单中的其余控件会上移以填补空出的空间。如果控件位于菜单栏上,则菜单栏上其余的控件会左移以填补该空间。 注意 使菜单控件不可见也产生使之无效的作用,因为该控件通过菜单、访问键或者快捷键都再无法访问。如果菜单标题不可见,则该菜单上所有控件均无效。 运行时添加菜单控件 运行时菜单可以增长。例如:在图 6.13 中 作为 SDI NotePad 应用程序中被打开的文件,会动态地创建菜单项来显示刚打开文件的路径名。 ![]() 运行时为了创建控件必须使用控件数组。因为设计时对mnuRecentFile菜单控件的 Index 属性进行了赋值,它自动地成为控件数组的一个元素——即使还没有创建其它元素。 当创建 mnuRecentFile(0) 时,实际上创建了一个在运行时不可见的分隔符条。当运行时用户第一次存储一个文件时,这个分隔符条就会变得可见,且第一个文件名被加到该菜单上。运行时每存储一个文件,则会再装入一个菜单控件到该数组中,从而使该菜单增长。 运行时所创建的控件可以使用 Hide 方法或者设置该控件的 Visible 属性为False 来隐藏。如果要从内存中删除一个控件数组中的控件,请使用 Unload语句。 编写菜单控件的代码 当用户选取一个菜单控件时,一个 Click 事件出现。需要在代码中为每个菜单控件编写一个 Click 事件过程。除分隔符条以外的所有菜单控件(以及无效的或不可见的菜单控件)都能识别 Click 事件。 在菜单事件过程中编写的代码与在控件任何其它事件过程中编写的代码完全相同。例如:“文件”菜单中的“关闭”菜单项的 Click 事件的代码看上去如下: Sub mnuFileClose_Click() Unload Me End Sub 一旦菜单标题被选取,Visual Basic 将自动地显示出一个菜单;但是,没有必要为一个菜单标题的 Click 事件过程编写代码,除非想执行其它操作,比如每次显示菜单时使某些菜单项无效。 注意 在设计时,当关闭菜单编辑器时,所创建的菜单将显示在窗体上。在窗体上选取一个菜单项将显示那个菜单控件的 Click 事件过程。 显示弹出式菜单 弹出式菜单是独立于菜单栏而显示在窗体上的浮动菜单。在弹出式菜单上显示的项目取决于按下鼠标右键时指针所处的位置;因而,弹出式菜单也被称为上下文菜单。 在 Microsoft Windows 95 中,可以通过单击鼠标右键来激活上下文菜单。在运行时,至少含有一个菜单项的任何菜单都可以作为弹出式菜单被显示。为了显示弹出式菜单,可使用 PopupMenu 方法。这个方法使用下列语法: [object.]PopupMenu menuname [, flags [,x [, y [, boldcommand ]]]] 例如:当用户用鼠标右键单击一个窗体时,以下的代码显示一个名为 mnuFile的菜单。可用 MouseUp 或者 MouseDown 事件来检测何时单击了鼠标右键,虽然标准用法是使用 MouseUp 事件: Private Sub Form_MouseUp (Button As Integer, Shift As _ Integer, X As Single, Y As Single) If Button = 2 Then ' 检查是否单击了鼠标右键。 PopupMenu mnuFile ' 把文件菜单显示为一个弹出式菜单。 End If End Sub 直到菜单中被选取一项或者取消这个菜单时,调用 PopupMenu 方法后面的代码才会运行。 注意 每次只能显示一个弹出式菜单。在已显示一个弹出式菜单的情况下,对后面的调用 PopupMenu 方法将不予理睬。在一个菜单控件正活动的任何时刻,调用 PopupMenu 方法均不会被理睬。 常常会想用一个弹出式菜单来访问那些在菜单栏中不常用的选项。为创建一个不显示在菜单栏里的菜单,可在设计时使顶级菜单项目为不可见(保证在菜单编辑器里的“Visible”复选框没有被选上)。当 Visual Basic 显示一个弹出式菜单时,指定的顶级菜单的 Visible 属性会被忽略。 Flags 参数 在PopupMenu 方法中使用 flags 参数可以进一步定义弹出式菜单的位置与性能。下表列出了可用于描述弹出式菜单位置的标志。 ![]() 想要指定一个标志,从每组中选取一个常数,再用 Or 操作符将它们连起来。下面的代码是,当用户单击一个命令按钮时,显示一个上边框在窗体中心的弹出式菜单。弹出式菜单触发受到鼠标右键或左键单击的菜单项的Click 事件。
Private Sub Command1_Click () ' X 变量和 Y 变量的尺寸。 Dim xloc, yloc '设置 X 变量和 Y 变量到窗体中心。 xloc = ScaleWidth / 2 yloc = ScaleHeight / 2 '显示弹出式菜单。 PopupMenu mnuEdit, vbPopupMenuCenterAlign Or _ vbPopupMenuRightButton, xloc, yloc End Sub Boldcommand 参数 使用 boldcommand 参数来指定在显示的弹出式菜单中想以粗体字体出现的菜单控件的名称。在弹出式菜单中只能有一个菜单控件被加粗。 MDI 应用程序中的菜单 在 MDI 应用程序中,每一个子窗体的菜单都显示在 MDI 窗s体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单(如果有的话)就代替菜单栏上的 MDI 窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示 MDI 窗体的菜单(见图 6.14 和 6.15)。MDI 应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel 只显示“文件”与“帮助”菜单。当用户打开一个文件时,其他菜单就会显示出来(“文件”、“编辑”、“视图”、“插入”、“格式”、“工具”、“数据”和“窗口”等等)。 创建 MDI 应用程序的菜单 通过给 MDI 窗体和子窗体添加菜单控件,可以为 Visual Basic 应用程序创建菜单。管理 MDI 应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在 MDI 窗体上(即使没有子窗体可见时)。当运行该应用程序时,如果没有可见的子窗体,会自动显示 MDI 窗体菜单,如图 6.14所示。 把应用于子窗体的菜单控件放置到子窗体中。在运行时,只要有一个子窗体可见,这些菜单标题就会显示在 MDI 窗体的菜单栏中。 有些应用程序支持多种类型的文档。例如,在 Microsoft Access 中,可以打开表格、查询、窗体和其它文档类型。要在 Visual Basic 中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和另一个带有完成图表任务菜单的子窗体。 ![]() 在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时,则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示 MDI 窗体的菜单。关于创建菜单的详细内容,请参阅本章前面的“在应用程序中使用菜单”部分。 创建“窗口”菜单 大多数 MDI 应用程序(例如:Microsoft Word for Windows 与 MicrosoftExcel)都结合了“窗口”菜单。这是一个显示所有打开的子窗体标题的特殊菜单,如图 6.15 所示。另外,有些应用程序将操纵子窗体的命令,比如“层叠”、“平铺”与“排列图标”,放在这个菜单中。 在 MDI 窗体或者 MDI 子窗体上的任何菜单控件,只要将其 WindowList属性设置为 True,都可以用于显示打开子窗体的清单。在运行时,VisualBasic 自动管理与显示标题清单,并在当前正有焦点的标题旁边显示一个复选标志。另外,在窗口清单的上方自动放置一个分隔符条。 要设置 WindowList 属性,请按照以下步骤执行: 1. 选取希望菜单出现其上的窗体,从“工具”菜单中,选取“菜单编辑器”。 注意 WindowList 属性只应用于 MDI 窗体和 MDI 子窗体。它对标准窗体(非 MDI)不起作用。 2. 在菜单编辑器列表框中,选取希望打开的子窗体的清单显示在其上的菜单。 3. 选取“WindowList”复选框。 在运行时,这个菜单显示打开的子窗体的清单。另外,这个菜单控件的WindowList 属性返回 True。 详细信息 请参阅《语言参考》的“WindowList 属性”。 ![]() 排列子窗体 就像前面所提到的,有些应用程序把诸如平铺 (Tile)、层叠 (Cascade) 与排列图标 (Arrange Icons) 等操作列在和打开的子窗体列表的同一个菜单上。在 MDI 窗体中使用 Arrange 方法来重新对齐子窗体。可以层叠、水平平铺或者沿着 MDI 窗体的下部排列的子窗体图标等方式来显示子窗体。下面的实例示出了“层叠”、“平铺”和“排列图标”菜单控件的 Click 事件过程。 Private Sub mnuWCascade_Click () '层叠子窗体。 frmMDI.Arrange vbCascade End Sub Private Sub mnuWTile_Click () '平铺子窗体。 frmMDI.Arrange vbTileHorizontal End Sub Private Sub mnuWArrange_Click () '排列所有子窗体图标。 frmMDI.Arrange vbArrangeIcons End Sub 注意 内部常数 vbCascade、vbTileHorizontal 和 vbArrangeIcons 都在对象浏览器的 Visual Basic (VB) 对象库中列出。 当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都像具有可变尺寸边框那样被定位。这使得子窗体可能重叠。
|
|
![]() ![]() |