运行时创建和修改菜单

设计时创建的菜单也能动态地响应运行时的条件。例如,如果菜单项的动作在某些点上成为不适当时,通过使其失效可防止对该菜单项的选取。比如:在 MDI NotePad 应用程序中,如果剪贴板上没有任何文本,则“编辑”菜单中的“粘贴”菜单项变暗,因而就不能被选。

如果有一个菜单控件数组,也可以动态地增加菜单项。这将在本主题后面的“运行时添加菜单控件”中讲述。

也可以编写应用程序,使用复选标志来指示几个命令中的哪一个是最后选取的。例如:如果工具栏被显示,MDI NotePad 应用程序工具栏的“选项”菜单项就会显示一个复选标志。本节描述的其它菜单控件功能包括使菜单项可见或不可见以及增加或删除菜单项操作的代码。

使菜单命令有效或无效

所有的菜单控件都具有 Enabled 属性,当这个属性设为 False 时,菜单命令无效使它不响应动作。当 Enabled 设为 False 时,快捷键的访问也无效。一个无效的菜单控件会变暗,如图 6.11 所示的“粘贴”菜单项。

图 6.11 一个无效的菜单项

例如:下列语句使 MDI NotePad 应用程序中“编辑”菜单上的“粘贴”菜单项无效。

mnuEditPaste.Enabled = False

菜单标题的无效使得整个菜单无效,因为不首先单击菜单标题,就不能访问任何菜单项。例如:下列代码将使 MDI NotePad 应用程序的“编辑”菜单无效。

mnuEdit.Enabled = False

显示菜单控件上的复选标志

使用 Checked 属性,可以把一个复选标志放置在菜单上以便:

图 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 应用程序中被打开的文件,会动态地创建菜单项来显示刚打开文件的路径名。

图 6.13 运行时创建并显示的菜单控件数组的元素

运行时为了创建控件必须使用控件数组。因为设计时 mnuRecentFile 菜单控件的 Index 属性进行了赋值,它自动地成为控件数组的一个元素-即使还没有创建其它元素。

当创建 mnuRecentFile(0) 时,实际上创建了一个在运行时不可见的分隔符条。当运行时用户第一次存储一个文件时,这个分隔符条就会变得可见,且第一个文件名被加到该菜单上。运行时每存储一个文件,则会再装入一个菜单控件到该数组中,从而使该菜单增长。

运行时所创建的控件可以使用 Hide 方法或者设置该控件的 Visible 属性为 False 来隐藏。如果要从内存中删除一个控件数组中的控件,请使用 Unload 语句。