Visual Basic 动态定制菜单
有时候需要设计创建的菜单能动态响应运行时的条件,如菜单项的动作在某些点上不适当时,通过使其失效可防止对该菜单项的选取。例如,在Word应用程序中,若剪贴板上没有任何文本,则“编辑”菜单中的“粘贴”菜单项变为灰色,不能被使用。
1. 创建菜单控件数组
既然Visual Basic将菜单项视为控件,因此就可以运用控件数组管理菜单项,即菜单控件数组。应用菜单控件数组的好处主要有两个:
- 用于动态增删菜单项
- 简化编程,用一段过程代码处理多个菜单项。
比如,可将【例7.2】中的“字体属性”菜单改为控件数组形式,需在菜单编辑器中进行如下设置:
(1) 保持“字体属性”菜单项中各属性值不变,并注意其“索引”框必须为空。
(2) 把“宋体”菜单项的名称改为mnuFont_Slkh,并将其“索引”设为0,即数组中的第1个元素。
(3) 把“隶书”菜单项的名称设为mnuFont_Slkh(与“宋体”菜单项名称相同),并将其“索引”设为1。
(4) 重复第3步,分别把“楷体”、“黑体”菜单项名称改为mnuFont_Slkh,“索引”值分别设为2,3。
单击“确定”按钮,返回到窗体设计窗口。则字体属性菜单的Click事件代码为:
Private Sub mnuFont_Slkh_Click(Index As Integer)
Select Case Index
Case 0
Text1.FontName = "宋体"
Case 1
Text1.FontName = "隶书"
Case 2
Text1.FontName = "楷体_GB2312"
Case 3
Text1.FontName = "黑体"
End Select
End Sub
需要注意的是菜单控件数组的各元素在菜单项显示区中必须是连续的,而且在同一缩进级上。创建菜单控件数组时,要把菜单中出现的分隔符也包括进去。
2. 使菜单命令有效或无效
所有的菜单控件都具有Enabled属性,当这个属性设为False时,菜单命令无效使它不响应动作。当Enabled属性设为False时,快捷键的访问也无效。一个无效的菜单项变为灰色,如图7.6所示。

图7.6 无效的菜单项
下列语句可使“编辑”菜单上的“粘贴”菜单项无效:
mnuEdit_Paste.Enabled = False
菜单标题的无效使得整个菜单无效,如下列代码将使“编辑”菜单无效:
mnuEdit.Enabled = False
3. 隐藏菜单
如果将菜单的Visible属性设置为False,则在运行时和开发环境中菜单及其所有子菜单都将被隐藏。当下拉菜单中的一个菜单项不可见时,其余的菜单项上移以填补空出的空间。如果菜单条上的菜单不可见,则菜单条上其余的控件会左移以填补该空间。
例如,创建两个单独的File菜单,把第一个File菜单最上面的菜单项命名为mnuFile1,把第二个File菜单命名为mnuFile2,两个菜单可以有相同的Caption属性,但他们必须有唯一的Name属性。无论在开发环境还是在运行中,切换这两个顶层菜单项的Visible属性,使一个可见,另一个隐藏。
利用该项技术,用户可以很容易地用替换集换出整个菜单集。如图7.7所示,显示了在同一窗体上的两个单独的菜单集,它们分别在单击“变换菜单”命令按钮前后出现。


图7.7 同一窗体上的两个不同菜单
这种效果可以用下面的代码实现:
Private Sub Command1_Click()
mnuColor.Visible = Not mnuColor.Visible
mnuTools.Visible = Not mnuTools.Visible
mnuEdit.Visible = Not mnuEdit.Visible
mnuOption.Visible = Not mnuOption.Visible
End Sub
Private Sub Form_Load()
mnuColor.Visible = False
mnuTools.Visible = False
End Sub
注意,使菜单控件不可见也产生使之无效的作用,通过菜单、热键或快捷键都无法访问该控件。
4. 运行时添加菜单控件
运行时可以添加菜单项,例如,Visual Basic的“文件”菜单就是根据打开的工程名添加菜单,显示出最近打开的工程名。
运行时添加菜单项必须使用控件数组。为了在运行时可以添加菜单项,在设计时必须设置该菜单项的Index属性为0,使它自动成为控件数的一个元素,同时也创建了一个在运行不可见的分隔条。当运行时用户第一次存储一个文件时,这个分隔条就会变得可见,且第一个文件名被加到该菜单上。运行时每存储一个文件,则会再装入一个菜单控件到该数组中,从而使该菜单增长。运行时所创建的控件可以使用Hide方法或者设置该控件的Visible属性为False来隐藏。如果要从内存中删除一个控件数组中的控件,可使用Unload语句。
例如,在编辑文件菜单时,可以在“另存为”菜单项后面添加一个菜单控件数组mnu_Filehistory(0)~mnu_Filehistory(4),分别代表分隔线及4个历史记录,并将它们的Visible属性设为False。然后,在“保存”单击事件过程中编写如下代码:
CommonDialog1.ShowSave
If CommonDialog1.FileName <> "" Then
mnu_Filehistory(0).Visible = True
Num = Num + 1
If Num > 4 Then
Num = 1
mnu_Filehistory(Num).Visible = True
mnu_Filehistory(Num).Caption = CommonDialog1.FileName
Else
mnu_Filehistory(Num).Visible = True
mnu_Filehistory(Num).Caption = CommonDialog1.FileName
End If
End If
运行程序时,每保存一个文件,菜单项就会自动添加一个历史记录,如图7.8所示。

图7.8 运行时添加菜单项
