菜单和工具栏

qwe 新手上路 2003-5-3 03:07

建立有用的自定义应用程序的基本原则之一是提供用户与Visual Basic应用程序之间简洁一致的交互方式。菜单和工具栏为向用户显示简单的命令和选项提供了快捷、方便,而且被广泛接受的方式。在Microsoft Office 中,很容易对菜单和工具栏进行设计和修改;Microsoft Excel 采用了统一的自定义化的界面-“自定义”对话框。因为所有的菜单和工具栏都用同样类型的类来表示-CommandBar 对象-所以也很容易从Visual Basic中来定义和控制它们。

修改用户界面的工具

有两种自定义菜单栏和工具栏的工具:共享“自定义”对话框和Visual Basic。虽然,在每个Office应用程序之间,“自定义”对话框仍有很小的区别,但是用于修改菜单栏和工具栏的可编程对象在所有的应用程序中都是相同的。本节讲述了“自定义”对话框和共享可编程对象,以及何时和怎样使用这些工具。

“自定义”对话框

本章的这一节讨论怎样使用“自定义”对话框和Visual Basic代码来修改菜单栏和工具栏。在两种技术都可作同样修改的场合下,使用“自定义”对话框能更快和更容易地完成设计时刻更改。

显示“自定义”对话框

在“视图”菜单里,指到“工具栏”,然后单击“自定义”。

Microsoft Excel在“自定义”对话框(含“工具栏”表,“命令”表和“选项”表)中提供了相同的控件,但是前三种应用软件还在“工具栏”表和“命令”表中包含了其他一些元素,专门用于这些软件本身的自定义。这些元素将在下面的段落中进行介绍。

Microsoft Excel “工具栏”表包含一个“附加”按钮,用来显示“附加工具栏”对话框。用户可以用这个对话框把菜单栏从应用程序的工作区拷贝到活动工作区。要作更多的了解,请参考本章后面“用户界面的更改范围”一节的内容。

当用户在任何Microsoft Office 应用程序中打开“自定义”对话框后,就可以按同样的步骤来修改任何内置或自定义的菜单和工具栏,步骤如下。

在“工具栏”对话框的“工具栏”一表中,用户可以选择出要显示和修改的菜单栏或工具栏,在它们的名字前面的复选框里打上钩。新创建的菜单栏或工具栏会自动显示出来。
单击任何一个菜单项(包括菜单和子菜单的标题)或者是工具栏控件,把它选中。当打开“自定义”对话框的时候,和控件相关联的命令是不能运行的。
在选定的项或控件上按下鼠标右键,显示出快捷菜单,该菜单中包含了可使用的自定义选项。菜单命令和工具栏按钮的选项包括重新设置命令;删除项或控件;更改它的名字;指出它是否有名字及图标,或是两者都有;修改它的图标;以及设置它开始一组 (也就是说,在它的上方或下方有一条线)。
注释 某些内置的命令或控件不能使用这些选项中的一种或几种;在快捷菜单上不能使用的选项将变成阴暗显示。

当“自定义”对话框打开时,用户可以通过拖放来重新安排项和控件的顺序,还可以从“命令”表里添加新的项和控件。要做更多的了解,请参考本章后面“菜单系统的设计时刻修改”以及“工具栏的设计时刻修改”两节里的有关步骤。

Visual Basic

通常,要创建或修改引进了Visual Basic程序的Microsoft Office应用程序的用户界面,应当使用“自定义”对话框。用户通过“自定义”对话框对用户界面所做的更改叫做设计时刻更改。

用户也可以在Visual Basic代码中使用共享的Microsoft Office对象模型的命令栏部分,以此来添加和修改菜单及工具栏:高级对象是CommandBars集合,在所有的Microsoft Office应用程序中由CommandBars属性返回。每一个菜单栏、快捷键菜单,以及工具栏都可以用该集合中的某个CommandBar对象来表示。每一个CommandBar对象包括一个CommandBarControls集合;在菜单栏或工具栏上的每个控件都可以用几个这样的集合来表示。

要了解有关CommandBars集合、它所包含的所有对象,以及这些对象的属性和方法的更多内容,请参考“命令栏概述”和“帮助”中相应的对象、属性和方法主题。

用户也可以编写代码,运行一次就能创建或更改菜单栏或工具栏的元素;实际上,这些代码模拟了在“自定义”对话框中所进行的设计时刻更改。但是在某些Microsoft Office应用程序中,可能要求用户将这类Visual Basic 代码和“自定义”对话框组合起来去设计Visual Basic应用程序。在以下一些常见场合,用户必须使用代码和容器应用程序界面的组合:

如果用户不能使用“自定义”对话框来创建一个新的菜单栏时,就需要使用Visual Basic来完成创建菜单栏的任务。在Visual Basic中建好菜单栏后,可以使用“自定义”对话框来设计该菜单栏中的各个菜单。
如果用户的容器应用程序不能在“自定义”对话框打开时,显示内置或自定义的快捷菜单,用户必须使用Visual Basic代码去修改这些快捷菜单。
如果用户的容器应用程序不能提供用于在工具栏上添加或修改文本框、下拉式列表框,或者组合框时,用户必须使用Visual Basic 代码来添加和设计这些控件。
用户也可以编写存在于Visual Basic应用程序中的代码,该应用程序在运行时对菜单系统进行修改(例如,用户可以编写在某种条件下禁用某菜单中的某一命令的代码,或者根据用户的动作给某个菜单栏添加一个菜单)。在用户的Visual Basic 应用程序运行时,用户代码产生的更改叫做运行时刻更改。

用户界面的更改范围

关于在何处对用户界面进行更改以及怎样存储更改,每一个Microsoft Office应用程序使用略微不同的规则。理解怎样才能控制更改的范围是非常重要的,因为它决定了用户的Visual Basic 应用程序显示用户自定义界面的能力。

可以通过三种方法,在用户自定义的应用程序中使用自定义菜单栏和快捷菜单:

用户可以把自定义工具栏和工作区或工作簿一起保存。当用户从Microsoft Excel退出时,在工作区中的工具栏会自动地保存在文件Username8.xlb中(其中的“Username”是Windows95当前登录的用户名)。如果用户没有登录,文件存为Excel8.xlb。在工作簿里的工具栏保存在工作簿文件中。

工作簿级的菜单栏和工具栏使用户能够方便地为自定义的应用程序(例如,一个加载应用程序)创建一个美观的用户界面、分配自定义工具栏按钮和它们支持的过程。如果用户打算分配带有一个自定义应用程序的自定义工具栏,就应该把该工具栏附加到包含那个应用程序的工作簿上,使得工具栏和应用程序那个保存在同一个文件里。

将菜单栏或工具栏从工作区移动到工作簿

如果“自定义”对话框尚未打开,那么用鼠标指到“视图”菜单里的“工具栏”上,然后单击“自定义”。
在“工具栏”表上单击“附加”按钮。
显示出“附加工具栏”对话框。

在“自定义”对话框里,单击想要复制到活动工作簿的菜单栏或工具栏的名字。
单击“复制”。
所复制的菜单栏或工具栏的名字就出现在工作簿框中。

用户可以删除原始的工作区级的菜单栏或工具栏,单击“自定义”对话框中的“工具栏”表,选择要删除的菜单栏或工具栏的名字,然后单击“删除”按钮。如果用户没有删除菜单栏或工具栏在工作区的版本,还可以对其进行更改而不会影响到工作簿中保存的版本。如果用户对工作区中的菜单栏或工具栏进行了更改,而且想更新工作簿中的版本使它同工作区的版本保持一致,可以再次将工作区中的版本复制到工作簿里,替换工作簿原来的版本。

把菜单栏或工具栏复制到工作簿之后,该菜单栏或工具栏只有在用户打开工作簿之后才可以使用。菜单栏或工具栏在工作簿中的版本不但保留着它们的名字和内容,而且还保留着为菜单项或工具栏控件指定的代码;菜单栏或工具栏的位置、大小以及形状;它在屏幕上的显示位置;和它是处于显示状态还是隐藏状态。

用户也可以删除菜单栏或工具栏的工作簿版本。

删除菜单栏或工具栏的工作簿版本

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单下的“工具栏”上,然后单击“自定义”。
在“工具栏”表上,单击“附加”按钮。
显示出“附加工具栏”对话框。

在工作簿框的“工具栏”内,单击想删除的菜单栏或工具栏的名字。
单击“删除”按钮。
注释 不能使用Visual Basic把菜单栏或工具栏附加到工作簿上或是从工作簿中把它们删除。

当用户打开包含一个或多个菜单栏或工具栏的工作簿时,Microsoft Excel 首先判断是否已经存在有一个同名的工作区菜单栏或工具栏。如果不存在,Microsoft Excel会创建一个新的工作区菜单栏或工具栏,并且把在工作簿里的版本复制过来。这样一来,用户得到了菜单栏或工具栏的最新副本,用户可以作许多变动:隐藏它,或者从工作簿级的副本那儿复制菜单项或控件,也可以向把菜单项项或控件复制到工作簿级的副本里去。

没有办法对菜单栏或工具栏进行重命名,于是当工作簿再次打开时,工作区已经存在着与工作簿版本同名的菜单栏或工具栏,Microsoft Excel使用工作区的副本而不是将工作簿的版本重新进行装载。但是,当用户单击相应的菜单项项或控件时,打开的工作簿里的菜单栏或工具栏所支持的过程仍然能够运行。

开发人员可以设计一个菜单栏或工具栏,然后把它附加到工作簿中。当用户打开工作簿时,就能使用该自定义菜单栏或工具栏了。用户既可以对它进行编辑,还能把菜单项项或控件从中移动到个人的菜单栏或工具栏里,这都不会影响保存在工作簿里的副本。当用户退出Microsoft Excel时,用户更改后的菜单栏和工具栏和工作簿文件一起保存。当用户再次启动Microsoft Excel时,编辑过的菜单栏或工具栏仍然可以使用;单击一个开发人员的菜单项或工具栏控件可以装载工作簿,其中包含了附加到那些菜单项或控件的过程。要生成新的工作簿菜单栏或工具栏,可以删除被编辑过的副本。

选择对用户界面进行最佳增强

菜单是用户界面命令的列表,用户可以从中选择命令。菜单提供了一种方便且一致的方法对命令进行分组,并且向用户提供了使用它们的简便方式。执行相关任务的命令可以列在同一个菜单下,同时命令还可以进行分组(用线与其他的命令或命令组分隔开)。子菜单构成了下一级的组织结构,快捷菜单把一组相关的命令组织起来,用以完成一项专门的任务。

用户能够为命令指定访问键,从而可以用键盘发命令,用户还能够为命令指定快捷键,从而更快地使用命令。另外,菜单比工具栏占用的空间要少,因为菜单中的各项只有在需要使用的时候才显示出来,并不需要在屏幕上分配专门的显示空间。另一方面,如果用户想快速地以图形方式使用命令,那最好还是使用工具栏。

工具栏包含一些快捷,用来执行被频繁使用的命令。对表示某种特性设置(例如,加粗或倾斜格式)、可视化命令以及用鼠标点击执行的命令来说,使用工具栏较为理想。另外,当用户工作时,工具栏始终显示在屏幕上,而菜单只有在使用的时候才显示出来;在工具栏上找出某个特殊的按钮要比在菜单栏里找出某条命令容易得多。但是,如果要方便地使用键盘命令,或是想显示出命令的层次结构,抑或是可用的显示屏幕有限,那么最好使用菜单。

如果需要演示用户的一组复杂的选项,那么用对话框比工具栏和菜单都要强。如果想在用户正在使用的数据的附近安置工具,那么最好的解决办法可能就是在工作表或文档里直接安置控件了。要做进一步详细的了解,请参考本书的第十二章“ActiveX 控件和对话框”。

菜单系统

每一个Microsoft Office 应用程序的菜单系统都是由完整的一套菜单以及菜单上的菜单项所组成的。一个菜单可以是主菜单、子菜单或是快捷菜单。一个菜单项通常是一条命令或是一个子菜单的标题。在本章中,“组件”这个术语一般指任何菜单或菜单项。

菜单栏处在活动窗口的顶端,它显示出所有菜单的名称,菜单可以随时为应用程序所使用。也就是说,Microsoft Office 应用程序能够根据一次活动窗口的变化或一条Visual Basic指令相应地改变菜单栏的显示。例如,当用户在Microsoft Excel 中编辑图表时,包含一组用于图表环境的菜单的菜单栏会自动显示出来。

一个菜单是菜单项的一张列表,菜单项在用户单击菜单栏上的菜单名时才出现(下拉)。

一个子菜单是附加在另一个菜单(父菜单)旁边的菜单,靠近父菜单上某个子菜单标题。每个子菜单标题都有一个指向右边的箭头。用户可以给菜单或快捷菜单添加子菜单。当用户用鼠标指到父菜单上的子菜单标题时,就会显示出相应的子菜单。

一个快捷菜单是包含了与某个专门命令有关的一组命令的浮动菜单。当用户在某个对象上点击鼠标右键时,就会显示出快捷菜单。

自定义菜单系统的原则

用户可以通过很多途径对Microsoft Office应用程序的菜单系统进行修改:可以创建新的菜单栏、在内置或自定义菜单栏中添加新的菜单、在内置或自定义菜单或子菜单中添加新的菜单项,而且还可以给菜单项指派宏。另外,用户也可以随时恢复到内置菜单系统的默认状态。

添加自定义组件或修改内置组件

每个Microsoft Office应用程序都带有自己的内置菜单系统。用户可以修改它的内置系统,也可以创建和修改自定义的菜单组件。

如果用户添加或改变了较少数目的组件,那么对菜单栏、菜单或菜单项进行修改比较合适的。例如,如果用户只是想提供一个访问菜单的宏,那么可以在内置菜单里添加进一个菜单项,然后把宏链接到该菜单项。

如果用户需要作更大范围的修改,最好创建一个新的完整组件。例如,如果用户想添加几个新菜单-每个都包括几个新的菜单项-那么创建一个包含所有新菜单的全新的菜单栏会比较合适一些。

使用子菜单

如果用户的菜单系统显得拥挤而且浏览困难,那么可以使用子菜单来有效地组织它们,并且通过减少每个时刻显示给用户的信息数量来增加Visual Basic应用程序的清晰度。例如,假定要创建一个包含了几个选项的菜单,如下图所示。

可以用下面所示的任何一种方法来使用子菜单,都能显示出相同的菜单项。

通过使用子菜单,可以连续地浏览一系列命令,而如果使用别的方式可能只好通过一连串的对话框才能完成这些命令。但是,如果需要创建较为复杂的一系列子菜单来演示一组命令,那么对话框是更好的解决办法。

使用快捷菜单

使用文本框、列表框和组合框

虽然可以在Visual Basic应用程序的菜单、快捷菜单和子菜单里添加内置或自定义文本框、列表框和组合框,但是这类控件还是用在工具栏里比较好。在某些需要显示或返回一种简单设置的情况下,使用菜单上的文本框会很方便。在显示菜单的同时,列表框和组合框也显示出当前的设置。但是,一旦用户在框里选择了新值,菜单也就随之被关闭了(用户不能查看或是修改设置,必须再次打开菜单来确认)。

如果要在菜单里添加内置文本框、列表框和组合框,须使用与添加内置命令相同的技术(参考本章后面的“添加命令和命令分组”一节的内容)。如果要添加自定义文本框、列表框和组合框,须使用和把它们添加到工具栏相同的技术(参考本章后面的“工具栏的设计时刻修改”一节的内容)。

菜单系统的设计时刻修改

菜单的设计时刻修改是指在应用程序运行前对菜单系统所进行的更改。包括添加、删除、移动和恢复菜单组件,以及设置菜单组件在运行时不随条件更改而变化的属性。

添加自定义菜单栏

使用“自定义”对话框

用户需使用CommandBars集合的Add方法来创建一个新的菜单栏;Add方法中的参数MenuBar决定了所创建的CommandBar 对象是否被显示成菜单栏。下面的例子创建了一个名叫“Custom Menu Bar”的新菜单栏。

Set cstm = CommandBars.Add(Name:="Custom Menu Bar", Position:=msoBarTop, _
MenuBar:=True, Temporary:=False)

添加菜单

用户可以向任何内置或自定义菜单栏中添加一个菜单。因为Microsoft Office 应用程序能够在不同的内容中显示不同的内置菜单栏,所以也可以在不只一个菜单栏中添加一条相同的命令,以此保证用户无论是在什么上下关系里都可以使用该命令。例如,在Microsoft Excel 中,用户可能想给每个菜单栏添加一个专门的Accounting菜单,于是公司里的雇员可以在任何工作表里运行相应的宏。

在向菜单栏添加菜单时,用户可以为该菜单指定访问键;当显示菜单时,访问键下面加有下划线。

注释 虽然Microsoft Office应用程序可以在“自定义”对话框的“工具栏”表中列出包含快捷菜单的工具栏,但是用户既不能直接向这些工具栏添加自定义快捷菜单,也不能从中删除内置的快捷菜单。但是,用户能够在快捷菜单上添加、删除或自定义菜单项。要做更多的了解,请参考本节后面的“添加和修改快捷菜单”的内容。

使用“自定义”对话框

“自定义”对话框为向内置或自定义菜单栏添加菜单提供了一种便利的方法。

向菜单栏添加自定义菜单

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果要进行修改的菜单栏没有显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框内打上对钩。
在“命令”表中,在“类别”一栏内单击“新菜单”。
将“新菜单”一项从“命令”栏拖到菜单栏中想添加菜单的地方。
在菜单栏中的“I”形条指出了在放开鼠标键时新菜单添加的位置。

在新菜单上单击鼠标右键,然后在“名字”栏中键入一个名字。在为该菜单设定的作为访问键的字母前面键入一个“&”符。
当单击该菜单的名字时,就显示出一个空菜单。要了解有关向新菜单中添加菜单项的内容,请参看本节后面“添加命令和命令分组”的内容。

“自定义”对话框还为向内置或自定义菜单栏添加任何内置菜单的副本提供了一种快捷的方法。用户可以自定义副本中的命令而不会影响到原来的内置菜单。

向菜单栏添加内置菜单的副本

如果“自定义”对话框尚未打开,将鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果要进行修改的菜单栏没有显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框打上对钩。
在“命令”表中,在“类别”一栏内单击“内置菜单”。
将“内置菜单”一项从“命令”栏拖到菜单栏中想添加菜单的地方。
在菜单栏中的“I”形条指出了在放开鼠标键时新菜单添加的位置。

技巧 用户也可以打开包含了要被复制的菜单的菜单栏,然后按下“CTRL”,同时将该菜单从中拖到另一个菜单栏里,完成复制。

用户需使用CommandBarControls集合中的Add方法来向CommandBar对象添加菜单,该对象表示某个菜单栏。在msoControlPopup里设置Add方法的Type参数指示所添加的控件用来显示一个菜单。显示菜单的控件叫做pop-up(弹出)控件。参数Before指示新菜单在原有菜单栏诸菜单中的位置。通过Add法设置对象CommandBarPopup的Caption属性,用于指定菜单的名称和访问键。以下这个Microsoft Excel的例子在工作表菜单栏的“窗口”菜单左边添加了一个名为“Accounting”的新菜单。

Set cstmAccounting = CommandBars("Worksheet Menu Bar").Controls _
.Add(Type:=msoControlPopup, Before:=9)
cstmAccounting.Caption = "&Accounting"

注释 用户在新菜单的名称里作为该菜单访问键的字母前面加一个“&”符。一旦添加好了菜单,当用户通过Controls(Index)引用该菜单时,可以在菜单名中使用“&”符,也可以不用。

添加子菜单

子菜单是附加在另一个菜单(父菜单)旁边,靠近某个菜单项(子菜单标题) 的菜单。用户可以给菜单、其他的子菜单和快捷菜单添加子菜单。

当用户单击菜单栏中的菜单名显示出该菜单的各项时,可以将鼠标指到父菜单中的子菜单标题上,这时子菜单上的菜单项就显示出来。类似于首先给菜单栏添加一个空菜单(有名字但没有菜单项)然后再添加某些菜单项,用户也须首先给父菜单添加一个空的子菜单,然后再添加菜单项。

使用“自定义”对话框

使用“自定义”对话框来给另一个菜单添加子菜单。

向菜单添加子菜单

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含要进行修改的菜单的菜单栏没有显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框内打上对钩。
在“命令”表中,在“类别”一栏内单击“新菜单”。

将“新菜单”一项从“命令”栏拖到菜单栏中想添加子菜单的地方。
为了指出新子菜单的位置,把它从菜单名(如果有必要,随同后面的子菜单题注)上拖过,以此来打开要添加子菜单的菜单或子菜单,再拖到它在该菜单或子菜单中所处的位置上,然后放开鼠标左键。在菜单栏中的水平的“I”形条指出了在放开鼠标左键时子菜单添加的位置。

在新的子菜单上单击鼠标右键,然后在“名字”栏中键入一个名字。在为该子菜单设定的作为访问键的字母前面键入一个“&”符。
当单击该子菜单的名字时,就显示出一个空的子菜单。要了解有关如何向新的子菜单中添加菜单项,请参看本节后面“添加命令和命令分组”一节的内容。

用户需使用CommandBarControls集合的Add方法来向CommandBar对象添加子菜单,该对象表示另一个菜单栏。在msoControlPopup里设置Add方法的Type参数用来指定出添加的控件是一个pop-up(弹出)控件-类型和指示菜单栏中某个菜单的控件相同。参数Before指定了新菜单在原有菜单栏诸菜单中的位置。通过Add方法设置CommandBarPopup对象的Caption属性,用于指定子菜单的名称和访问键。在下面这个Microsoft Excel的例子中在工作表菜单栏的Accounting菜单底下添加了一个名为“Product”的新的子菜单。

Set cstmAcctProduct = CommandBars("Worksheet Menu Bar").Controls("Accounting") _
.Controls.Add(Type:=msoControlPopup)
cstmAccProduct.Caption = "&Product"

注释 用户在新子菜单的名称里作为该菜单访问键的字母前面加一个“&”符。一旦添加好了子菜单,当用户通过Controls(索引)引用该子菜单时,可以在子菜单名中使用“&”符,也可以不用。

添加命令和命令分组

用户可以给任何内置或自定义的菜单或子菜单添加命令,也可以修改其外观并且进行直观上的逻辑分组。本节讨论如何向菜单和子菜单添加命令。下面的一节讨论如何添加快捷菜单以及向快捷菜单添加菜单项这一特殊问题。

注释 虽然可以向菜单和子菜单添加文本框、列表框以及组合框,但这通常不是显示或返回信息的最好办法。如果要添加自定义文本框、列表框和组合框,须使用和把它们添加到工具栏中相同的技术(参考本章后面的“工具栏的设计时刻修改”一节的内容)。

使用“自定义”对话框

“自定义”对话框提供了向菜单和子菜单添加菜单项的一种简便的方法。

向菜单或子菜单添加内置命令

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含要进行修改的菜单的菜单栏没有显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框打上对钩。
在“命令”表中,在“类别”一栏中选择命令的类别。
该类别的所有命令都列在“命令”一栏中。

将命令从“命令”栏中拖到菜单或子菜单中添加该命令的位置。
为了指出命令的位置,把该命令从菜单名(如果有必要,随同后面的子菜单标题)上拖过,以此来打开要添加命令的菜单或子菜单,再拖到它在该菜单或子菜单中应处的位置上,然后放开鼠标左键。在菜单栏中的水平的“I”形条指出了在放开鼠标左键时命令添加的位置。

技巧 用户也可以打开包含了要被复制的内置命令的菜单栏,然后按下“CTRL”,同时将该命令从中拖到另一个菜单栏里,完成复制。

用户也可以从“自定义”对话框也提供了向内置或自定义菜单栏添加自定义命令的一种快捷方法。但是,每种Microsoft Office应用程序都包含了不同的技术来使用“自定义”对话框完成该功能。下面的段落介绍了这些区别。

Microsoft Excel 按照和向菜单添加内置命令的过程相同的步骤来完成;在“类别”栏内,单击“宏”,然后将“自定义菜单项”从“命令”栏拖到它在菜单中应处的位置。在新菜单项上单击鼠标右键,任何单击“指定宏”。在“指定宏”对话框的“宏名”一栏中,键入要运行的宏的名字。

修改命令的外观

在菜单中的任何命令都可以在该命令的名字旁边显示出一个图标按钮。命令的“样式”决定了是否在命令旁边显示出一个图标按钮。“自定义”对话框打开后,使用快捷菜单上的命令来设定命令的式样。下表描述了式样对菜单命令的影响。

式样
菜单的外观

默认式样
图标按钮和名字

纯文本(在菜单中)
只有名字

纯文本(一般)
只有名字

图标和文本
图标按钮和名字

注释 在默认情况下,有些内置菜单命令没有和它们相关联的图标按钮,无论设置何种式样都不会显示图标。但是,可以给任何内置菜单命令添加图标。

当“自定义”对话框打开后,可以添加或修改菜单命令旁边的图标按钮。下表列出了可以使用的技术。

目 的
做 法

使用预定义的图标按钮 用鼠标右键单击该命令,指到“更改按钮图标”,然后单击要选择的图标。
复制和粘贴另一个命令的图标 用鼠标右键单击被复制的图标所属的命令,然后选择“复制按钮图标”。在自定义图标的命令上单击鼠标右键,然后选择“粘贴按钮图标”。
从图形程序复制和粘贴 在图形程序中,打开要复制的图标。选择和复制该图标(最好是16x16象素的图形)。切换回原应用程序,单击“粘贴按钮图标”。
编辑命令的当前按钮图标 在命令上单击鼠标右键,然后选择“编辑按钮图标”。在“按钮编辑器”中,可以改变图标的颜色和形状,调整图标在控件上的位置,并且可以对修改进行预览。当完成对图标的编辑后,单击“确定”。
用命令的原始按钮图标对命令进行复位 在命令上单击鼠标右键,然后选择“复位按钮图标”。

命令分组

用户可以在菜单中用线条将相关的命令分隔成组。线条本身并不是菜单项;而且可以在菜单中的任何一项前面设置出现分隔线。用户可以在“自定义”对话框中将一条命令设为一组命令中的第一项。

在菜单中开始一个命令组

如果“自定义”对话框尚未打开,将鼠标指到“视图”菜单的“工具栏”上,然后单击“自定义”。
如果包含要进行修改的菜单的菜单栏尚未显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框打上对钩。
在希望上方出现分隔线的菜单项上单击鼠标右键,然后选择“开始一组”。
在该项上再次单击鼠标右键,在快捷菜单上的“开始一组”旁边出现一个对钩。要去掉菜单项之前的分隔线,可以在该项上单击鼠标右键然后再次选择“开始一组”(不再出现对钩)。

用户需使用CommandBarControls集合的Add方法来给CommandBar对象添加新的菜单项,该对象表示某个菜单或子菜单。要添加内置命令,可以使用Add方法的参数Id指定该命令的ID编号。在下面这个例子在“Custom Menu Bar”菜单栏的 “Quick Tools”菜单里添加了“Spelling”命令。

Set mySpell = CommandBars("Custom Menu Bar").Controls("Quick Tools") _
.Controls.Add(Id:=2)

要对如何确定Microsoft Office 应用程序的内置命令的ID编号做进一步了解,请参考本章后面的“菜单项和菜单栏控件ID编号”一节的内容。

要添加一条菜单命令,可以先添加一条新的菜单项,然后设置OnAction 属性来指定点击该项时运行的Visual Basic程序。设置Add 法的参数Type为msoControlButton指出该菜单项是一条命令。在下面这个Microsoft Excel例子里在工作表工具栏的“文件”菜单中添加了一个Open Database菜单项。当用户点击该菜单项时,Microsoft Excel 运行Visual Basic程序OpenDatabaseProc。Open Database直接出现在File菜单中Close命令的上面。

Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls.Add(Type:=msoControlButton, Before:=3)
With databaseItem
.Caption:="Open Database"
.OnAction:="OpenDatabaseProc"
End With

用户可以在Visual Basic 中设置表示菜单命令的对象它的许多属性,以此修改命令的外观。要做更进一步了解,请参考“帮助”中的Style属性和FaceID 属性,以及CommandBarButtion对象的其他属性和方法的帮助主题。

设置开始一组菜单项的菜单项(也就是说,前面有一线条的命令项),需要设置表示菜单项的CommandBarButton、CommandBarPopup或者CommandBarComboBox对象的BeginGroup属性为True(真)。要去除该线条,则设置属性BeginGroup为False(假)。使用Controls(Index) 来返回一个表示该项的对象,此处的Index是指菜单项的标题或索引号。下面的例子在“文件”菜单的Open Database 命令(在上面的例子里添加的)前面添加了一条分隔线。

Set databaseItem = CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls("Open Database")
databaseItem.BeginGroup = True

添加和修改快捷菜单

Microsoft Excel提供事件-BeforeRightClick-可以通过修改内置快捷菜单或显示自定义快捷菜单来响应它。

使用“自定义”对话框

用户可以使用CommandBars集合的Add方法来创建新的快捷菜单;将Add方法的参数Position设置为msoBarPopup,以此指出所创建的CommandBar对象应显示为快捷菜单。下面的例子创建了一个名为“Shortcuts1”的新快捷菜单。

Set cstm = CommandBars.Add(Name:="Shortcuts1", Position:=msoBarPopup, _
MenuBar:=False, Temporary:=False)

要在任何Microsoft Office应用程序中用Visual Basic修改自定义或内置快捷菜单,可以采用和前面章节讲述的使用Visual Basic向菜单里添加子菜单或命令相同的技术。使用CommandBars(name) 返回表示该快捷菜单的一个CommandBar对象,这里的name是指快捷菜单的名字。于是用户可以添加或修改任何在CommandBar对象中有效的Controls集合里的元素。

删除菜单组件

用户可以从菜单中删除内置或自定义的菜单项,可以从菜单栏中删除内置或自定义的菜单,还可以删除自定义菜单栏。但是要注意,即使可以删除快捷菜单和内置菜单栏上的所有项,还是不能删除快捷菜单或内置菜单栏本身。

删除内置菜单组件可以帮助用户根据需要定制自己的Visual Basic应用程序。例如,用户可能想从菜单中删除某条内置命令,并且用一个自定义命令的版本来替换它,该命令可为用户完成特殊的任务。用户也可能要删除某个菜单项以简化界面或者降低无经验者选择使用不适当命令的可能性。

注释 用户可以恢复已经删除的内置菜单栏、菜单或菜单项。但是,不能恢复自定义的菜单栏、菜单或菜单项;必须重新创建它们。

使用“自定义”对话框

打开“自定义”对话框的情况下,用户可以删除任何菜单组件。

删除菜单系统组件

如果“自定义”对话框尚未打开,将鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含要删除的菜单组件的菜单栏尚未显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框打上对钩。
在要删除的菜单组件上单击鼠标右键,然后在快捷菜单中选择“删除”。
要删除一个完整的自定义菜单栏,可以打开“自定义”对话框,选中“工具栏”表内“工具栏”一栏中该菜单栏的名字,然后单击“删除”按钮。就将内置菜单栏删除了。

用户可以使用Delete方法来删除自定义菜单栏、自定义或内置下拉菜单或子菜单以及自定义或内置菜单项。但是不能删除内置菜单栏或快捷菜单。

以下Microsoft Excel中的例子删除了绘图菜单栏里的“编辑”菜单。

CommandBars("Chart Menu Bar").Controls("Edit").Delete

以下的例子删除名为“Custom Menu Bar”的自定义菜单栏。

CommandBars("Custom Menu Bar").Delete

要了解如何恢复已删除的内置菜单组件,请参考下面一节的内容。

恢复内置菜单组件

用户能够恢复已经被删除的内置菜单栏、菜单或菜单项。但是,不能恢复已经删除的自定义菜单栏、菜单或菜单项;必须重建它们。

使用“自定义”对话框

用户可以使用“自定义”对话框来再次恢复内置菜单或子菜单中各个原始的内置菜单项。同样地,在恢复内置菜单栏的同时在该菜单栏中的所有菜单和子菜单也被重新恢复。

恢复内置菜单

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含将要被恢复的菜单的菜单栏尚未显示出来,在“工具栏”表的“工具栏”一栏内该菜单栏名字旁边的复选框打上对钩。
在要删除的菜单或子菜单上单击鼠标已经,如何在快捷菜单中选择“恢复”。
要恢复内置菜单栏,需要打开“自定义”对话框,选中“工具栏”表内“工具栏”一栏中该菜单栏的名字,然后单击“恢复”按钮。

使用Visual Basic

使用Reset 方法恢复内置菜单栏、菜单或子菜单组件。

以下Microsoft Excel中的例子恢复了绘图菜单栏中的“编辑”菜单。

CommandBars("Chart Menu Bar").Controls("Edit").Reset

菜单系统的运行时刻修改

用户可以在设计时刻对创建的菜单系统进行编程,使之在运行时能够对条件的变化动态地作出响应。用户可以用自己创建的自定义菜单栏替换默认菜单栏。如果某个菜单项用在某种上下关系中不合适,可以删除、隐藏或禁用该项以防止用户选中它(禁用菜单项也叫做使菜单项变暗,或者变灰)。如果一个菜单项用两种可能的状态来表示选项,用户可以使用命令图标按钮,在按钮被按下时表示打开选项,按钮被放开时表示关闭选项。最后,用户可能向根据当前的状态而对菜单项进行重命名。例如,在Microsoft Excel中,单击“窗口”菜单里的“冻结拆分窗口”,它将变为“撤销窗口冻结”。

注释 虽然既可以用“自定义”对话框也可以用Visual Basic来对菜单系统进行设计时刻更改,但是却只能用Visual Basic来进行运行时刻的更改。

显示自定义菜单栏

要显示自定义菜单栏而不是活动菜单栏,用户必须将表示该自定义菜单栏的CommandBar对象的Visible属性设置为True(真)。(要了解如何创建替换活动菜单栏的菜单栏,请参考本章前面的“添加自定义菜单栏”中的内容。)新的可见菜单栏会自动地替换活动菜单栏。当Visual Basic应用程序运行结束时,可以将Visible 属性设为False(假),重新显示默认菜单栏。

每当用户启动Microsoft Office应用程序时,都会显示默认菜单栏。在Word里,可以在启动时用自定义菜单栏来替换默认菜单栏-在退出程序前保存Normal模板的时候,最后显示的那个菜单栏是Word再次启动时的默认菜单栏。用户可以在Open事件过程中将某个菜单栏的Visible属性设置为True(真),用它来替换默认菜单栏。

动态地显示菜单组件

如果一个菜单组件仅仅用于某个专门的文档,那么该菜单组件最好只在该文档处于活动状态时才显示;这样做减轻了界面上不必要的混乱。用户可以限定某个菜单组件的生命周期,使之仅在用于文档时才出现。

如果用户想让菜单或菜单项仅仅为特定的文档出现,那么可以对Visual 属性进行设置,在用户每次激活文档时才显示该组件,而每当文档失活时又将该组件隐藏起来。如果用户想把菜单栏同特定的文档关联起来,那么也可以对Visual 属性进行设置,在用户激活文档时显示菜单栏,同时在文档失活时隐藏菜单栏,而不是每次都实际地添加或删除菜单栏。

要动态地显示菜单组件,不但要编写适当的事件程序来启用组件或显示组件,而且要编写事件程序来禁用或隐藏组件。如果正在对其菜单栏进行修改的应用程序不支持事件,那也就不能自定义动态的界面。对于这类应用程序的解决办法是为其他菜单项或工具栏按钮的OnAction属性指定类似的程序。如果应用程序支持ActiveX控件嵌入,那么也可以修改容器应用程序的界面来对那个控件所支持的事件进行响应。

启用或禁用菜单组件

如果想防止用户在某种条件下选择某个特殊的菜单项,可以禁用该菜单项。被禁用的命令仍然出现在菜单上,但是它变得阴暗,不响应用户的动作。使用Enable属性来启用或禁用菜单项。如果菜单项被启用,那么Enable属性为True(真),如果菜单项被禁用,Enable属性为False(假)(但是不能设置内置菜单项的Enable属性)。下面的这个Microsoft Excel中的例子向工作簿菜单栏的“文件”菜单中添加了Open Database命令,如何禁用该命令。

CommandBars("Worksheet Menu Bar").Controls("File") _
.Controls.Add("Open Database").Enabled = False

如果用户想禁用在某个菜单中的所有命令,那么可以禁用菜单本身。这样可以在用户不再访问菜单上所有的命令时,有效地禁用它们。下面的这个Microsoft Excel中的例子,禁用了工作簿菜单栏上的整个“文件”菜单。

CommandBars("Worksheet Menu Bar").Controls("File").Enabled = False

注释 可以禁用子菜单上的所有菜单项,但是却不能禁用子菜单本身。

指定菜单项的状态

如果一个菜单项表示的选项只有两种可能的状态,那么可以在该菜单项旁边添加图标按钮,用按钮是否被按下来显示选项的状态。每次用户单击该菜单项时,按钮就变到相反的状态-也就是打开或者关闭选项。用户可以通过设置菜单项的State属性来更改其外观。

要想弄清楚它是如何起作用的,可以假定以下例子中的 Microsoft Excel程序被指定到工作簿菜单栏中“视图”菜单里的自定义菜单项“Database”,该菜单项向用户提供了了两种选择,是在数据库视图中还是在工作簿视图中查看工作簿。用户每次单击菜单项Database,程序就将菜单项旁边的按钮图标在按下和放开之间进行切换(也就是说,程序设置State属性,然后切换视图)。

Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.State = msoButtonDown
'Switch to database view
Else
.State = mosButtonUp
'Switch to worksheet view
End If
End With
End Sub

每个内置和自定义菜单项都有文本和按钮图标;许多内置菜单项有空白的按钮图标。当使用“自定义”对话框来向菜单添加菜单项时,可以指定和修改该项的按钮图标。在运行时刻,用户可以设置菜单项的FaceId属性,用来指定菜单项状态改变时该菜单项旁边显示的按钮图标。要指定菜单项旁边显示的按钮图标,必须找出带有该按钮图标的内置命令,判断它的ID,然后为FaceId属性赋值。(改变一个菜单项的FaceId属性不会改变它的功能。)要对判断内置命令ID编号作更多了解,请参考本章后面“菜单项和工具栏控件的ID”一节的内容。

以下Microsoft Excel中的例子,不但切换了菜单项旁边按钮图标的状态,而且还改变了图标。当用户切换到数据库视图时,按钮图标被切换到grid(ID 987)。类似地,当用户切从数据库视图切换出去时,图标被设置为blank face(ID 1)。

Sub DatabaseView()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("Database")
If .State = msoButtonUp Then
.FaceId = 987
.State = msoButtonDown
'Switch to database view
Else
.FaceId = 1
.State = mosButtonUp
'Switch to worksheet view
End If
End With
End Sub

对菜单项进行重命名

如果用户使用菜单项的Caption属性去更改菜单项的名称,以此来响应Visual Basic代码中条件的改变。例如,假定用户已经创建了一个用于打开数据库的菜单命令。在用户打开数据库之后,用户可能会希望用关闭该数据库的命令来替换原来的命令。下面的例子说明了作用实在上述的功能。

CommandBars("MyMenubar").Controls("File").Controls("Open Database") _
.Caption = "Close &Database"

用这种办法对菜单项进行重命名时,要确保应用程序中的其他过程按照新名字来引用该菜单项(在本例中的新名字是Close Database,“关闭数据库”)。

也可以使用代表菜单项的变量。采用这种技术的好处之一是即使菜单项的标题改变了,变量仍然能够继续起作用。下面的例子给菜单项Open Database(“打开数据库”)设置了一个变量。

Set openData = CommandBars("My Menubar").Controls _
("File").Controls("Open Database")

可以用下面例子中的代码来更改标题。

openData.Caption = "Close &Database"

工具栏

每一个Microsoft Office应用程序都提供一个包含工具栏控件的工具栏系统,用户可以借助工具栏控件频繁地使用命令。每个工具栏都可以定位在应用程序窗口的顶部、底部以及左边或者右边,也可以作为浮动窗口放置在工作区的任何位置上。每个工具栏控件都是一个简单的图形化的控件,用户通过它和Visual Basic应用程序交换信息。要在一个Office应用程序中显示任何工具栏,可将鼠标指向“视图”菜单中的“工具栏”,然后单击需要显示的工具栏的名字。要查看其他的有效工具栏,可打开“自定义”对话框并且浏览在“类型”一栏中列出的多个工具栏。

工具栏控件可以分为几种类型;它们将在下面的段落中进行介绍。

最常用的工具栏按钮类型是包含一个小图标的简单按钮控件。这个图标称为按钮图标,直观地表示出工具栏按钮激活的命令或选项。用户可以单击其中一个工具栏图标来执行一条命令(例如,单击“常用”工具栏上的“新建”按钮可以创建一个新文档)或者在由一个按钮所表示的选项的两种可能状态之间进行交替切换(例如,单击“格式”工具栏上的“加粗”按钮,可以交替地设定所选文本为粗体或去除所选文本的粗体)。

工具栏控件的另一种类型包含了一个小图标和附加的下拉式调色板。用户单击下拉箭头就可以显示出调色板,然后选择调色板上的某个选项。用户单击按钮控件来应用当前选项。例如,在Microsoft Excel中,单击字体颜色按钮上的单击工具栏控件的按钮下拉箭头就显示出字体颜色调色板,用户可以从中进行选择。

工具栏控件也可以是文本框、列表框或组合框。用户可以在文本框中键入文本或点击下拉箭头,然后在列表中选择选项。例如,在“格式”工具栏上,既可以在“字号”下拉列表框中点中一个选项,

最后一种工具栏控件是pop-up(弹出)控件,它那个显示其他控件的菜单。在工具栏上的pop-up控件和菜单栏上菜单的名字从本质上讲是一样。Microsoft Excel、Word或PowerPoint中“绘图”工具栏的“绘图”按钮都是pop-up控件的例子。

注释 虽然工具栏控件和ActiveX控件有着相似的外观和方式,但是它们两者是不相同的。不能向工具栏添加ActiveX控件,也不能向文档或窗体添加工具栏控件。

既然理解了什么是工具栏以及工具栏控件的种类,就可以研究前面介绍的修改工具栏和工具栏控件的细节。在下面的各节中,将讨论怎样对工具栏和工具栏控件进行设计时刻和运行时刻的更改。

自定义工具栏的原则

Microsoft Office的应用程序向用户提供了修改内置工具栏的广泛途径,使它能更好地为用户服务。用户可以创建新的工具栏;向内置或自定义工具栏添加新的工具栏按钮;修改工具栏按钮上的图标;以及为工具栏按钮指定宏、“工具提示”文本和状态栏文本。

是修改内置工具栏还是创建新的工具栏取决于要进行更改的程度。如果仅添加或修改几个工具栏按钮,那么修改内置工具栏是有意义的;如果想提供的对命令的分类与现有的任何内置工具栏完全不同,或者要用一些自定义工具栏按钮来作为特别组,那么创建新的工具栏会更方便一些。无论所做的改变有多大,只要愿意,都可以把内置菜单系统恢复到默认的状态。

除了上述通常在设计时刻所做的变化之外,还可以使用Visual Basic程序,通过改变工具栏和工具栏按钮的属性,来对应用程序运行时用户的输入作出响应(也就是说,在运行时刻)。例如,当用户不再需要某个工具栏时,可以把它隐藏起来,也可以移动它或改变它的大小使它不再挡路,还可以禁用某个工具栏按钮以防用户在不适当的时刻点中它,以及在用户每次点中工具栏按钮时让工具栏按钮在按下和放开之间切换。

使用菜单

可以把pop-up(弹出)控件-和显示菜单栏中的菜单以及菜单中的子菜单相同的控件-添加到任何内置或自定义工具栏中。通常,向工具栏添加菜单是在自定义内置菜单栏(不会象添加工具栏控件那么方便)和添加大量工具栏控件之间一种有益的折衷方案。在Microsoft Excel、Word或PowerPoint中,“绘图”工具栏上的“绘图”按钮就是工具栏带菜单的例子。

向工具栏添加菜单、子菜单和菜单项,采取的步骤和将这些组件添加到菜单栏所采取的步骤相同,在本章“菜单的设计时刻修改”一节作过介绍。

使用文本框、列表框和组合框

在Microsoft Office应用程序中,可以向内置和自定义工具栏添加文本框、列表框和组合框。这些控件是很有处的,可以从用户那里频繁取得信息,也可以运行复杂的程序,程序根据控件的值在可能的结果范围内进行判断。

“自定义”对话框支持向任何工具栏添加内置文本框、列表框和组合框,但是不支持添加自定义的文本框、列表框和组合框;作为替代,必须使用Visual Basic来添加和设计这些控件。打开“自定义”对话框,可以更改任一内置或自定义文本框、列表框或组合框的宽度。

对工具栏的设计时刻修改

设计时刻修改包括创建新的工具栏;向工具栏中添加新的或内置的工具栏控件;从工具栏中删除工具栏控件;对工具栏控件进行分组或取消分组;以及改变文本框、列表框和组合框工具栏控件的宽度。用户还可以选择一个新的图标,或使用“按钮编辑器”来自定义一个图标,用来于某个特殊的工具栏相关联。

添加自定义工具栏

在许多情况下,用户可以通过向内置工具栏添加工具栏控件的方法实现一个完整的命令集合。但是如果想要以一种便于使用的形式来表示一个完整的命令集合,而和所有的内置命令完全不同,可以创建一个新的工具栏。通过“自定义”对话框或Visual Basic都能实现这一点。

使用“自定义”对话框

“自定义”对话框提供了添加自定义工具栏的一种便利的途径。

添加工具栏

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
在“工具栏”表中,单击“新建”。
在“工具栏名称”一栏中,键入新工具栏的名字,然后单击“确定”。
显示出一个有着该名字的浮动的空工具栏。

新工具栏被添加到“工具栏”表中的“工具栏”一栏中。

使用CommandBars集合的Add法来创建新的工具栏,设置Add方法的参数Position为msoBarLeft, msoBarTop, msoBarRight, msoBarBottom, 或 msoBarFloating,它们指定创建的CommandBar对象一个浮动工具栏还是固定位置的工具栏。下面的例子创建并显示了一个新的名叫“Custom Tools”的工具栏。

Set cstm = CommandBars.Add(Name:="Custom Tools", Position:=msoBarFloating, _
MenuBar:=False, Temporary:=False)
cstm.Visible = True

添加控件和控件分组

可以向任何内置或自定义工具栏添加控件,也可以直观地(用分隔线)把它们分成逻辑组。

使用“自定义”对话框

“自定义”对话框提供了向工具栏添加控件的一种简单的途径。

向工具栏添加内置控件

如果“自定义”对话框尚未打开,那么用鼠标指到“视图”菜单的“工具栏”上,然后单击“自定义”。
如果要作修改的工具栏尚未显示出来,那么在“工具栏”表的“工具栏”一栏内该工具栏名字旁边的复选框内打上钩。
在“命令”表中,在“类别”一栏中选中一种命令的类别。
所选类别的命令现在都列在“命令”一栏中。

将控件从“命令”栏中拖到菜单上要添加该控件的位置,然后放开鼠标。
在工具栏上的竖直“I”行条指出放开鼠标后控件添加的位置。

技巧 用户也可以打开包含了要被复制的控件的工具栏,然后按下“CTRL”,同时将该控件从中拖到另一个菜单栏里,完成复制。

“自定义”对话框也提供了向内置或自定义工具栏添加自定义命令的一条快捷的途径。但是,每个Microsoft Office应用程序都在使用“自定义”对话框实现该功能时采用了不同的技术。以下的段落介绍了这些区别。

Microsoft Excel 按照和向工具栏添加内置控件相同的步骤来完成;在“类别”栏内,单击“宏”,然后将“自定义按钮” 控件拖到工具栏中希望它出现的位置上。在新控件上单击鼠标右键,然后点击“指定宏”。在“指定宏”对话框中,选择要运行的宏。使用快捷菜单上的命令来改变控件的图标。

修改工具栏按钮的外观

按钮在工具栏上的外观既可以只是按钮图标,也可以只是按钮名称,或者是在名称旁边同时显示按钮图标。按钮的“样式”决定了按钮是带图标、还是只有名称或者既有图标又有名称。“自定义”对话框打开后,使用快捷菜单上的命令来设定按钮的式样。下表描述了式样对工具栏按钮的影响。

式 样
按 钮 的 外 观

默认式样 只有图标按钮
纯文本(在菜单中) 只有按钮图标
纯文本(一般) 只有名字
图标和文本 图标按钮和名字

当打开“自定义”对话框时,可以给工具栏按钮添加或修改图标。下表列出了可以使用的技术。

目 的
做 法

使用预定义的图标 用鼠标右键单击该按钮,指到“更改按钮图标”,然后单击要选择的图标。
复制和粘贴另一个按钮的图标 用鼠标右键单击被复制的图标所属的按钮,然后选择“复制按钮图标”。在自定义图标的按钮上单击鼠标右键,然后选择“粘贴按钮图标”。
从图形程序复制和粘贴 在图形程序中,打开要复制的图标。选择和复制该图标(最好是16x16象素的图形)。切换回原应用程序,单击“粘贴按钮图标”。
编辑按钮的当前图标 在按钮上单击鼠标右键,然后选择“编辑按钮图标”。在“按钮编辑器”中,可以改变图标的颜色和形状,调整图标在控件上的位置,并且可以对修改进行预览。当完成对图标的编辑后,单击“确定”。
用按钮的原始图标对命令进行复位 在按钮上单击鼠标右键,然后选择“复位按钮图标”。

可以使用分隔线按相关性对控件分组。分隔线本身不是控件;更确切地说,可以在工具栏的每个控件前都设置一条分隔线。可以使用“自定义”对话框设置某条命令是一组控件中的第一个控件。

在工具栏上开始一组按钮

如果“自定义”对话框尚未打开,那么用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含要进行修改的控件的工具栏尚未出现,那么在“工具栏”表的“工具栏”一栏内该工具栏名字旁边的复选框内打上钩。
在希望上方出现分隔线的控件上单击鼠标右键,任何选择“开始一组”。
再次在该控件上单击鼠标右键,在快捷菜单上的“开始一组”旁边显示出一个对钩。要去除在控件之前的分隔线,可以在该控件上单击鼠标右键然后再次选择“开始一组”(不再出现对钩)。

可以使用CommandBarControls集合的Add方法来向CommandBar对象添加新的控件,该对象表示某个特定的工具栏。要添加内置控件,可以用Add方法的参数Id指示该命令的ID编号。在下面这个例子在“Quick Tools”工具栏里添加了控件“Spelling”。

Set mySpell = CommandBars("Quick Tools").Controls.Add(Id:=2)

要对如何决定Microsoft Office 应用程序的内置命令的ID编号做更多的了解,请参考本章后面的“菜单项和菜单栏控件ID编号”一节的内容。

要添加自定义控件,可以先添加新的控件,然后设置OnAction 属性来指定点击该控件时运行的Visual Basic程序。设置Add 法的参数Type为msoControlButton指出该控件是一个按钮。设置该控件的FaceId值为一个内置控件的ID,用以复制该内置控件的外观。在下面这个Microsoft Excel例子里,在常用工具栏的“保存”按钮前添加了一个按钮。当用户点击该菜单项时,Microsoft Excel 运行Visual Basic程序OpenDatabaseProc。这个;例子还设置按钮上的图标是grid(ID 987)。

Set databaseItem = CommandBars("Standard").Controls. _
Add(Type:=msoControlButton, Before:=3)
With databaseItem
.OnAction:="OpenDatabaseProc"
.FaceId = 987
End With

用户可以在Visual Basic 中设置表示工具栏按钮的对象它的许多属性,以此修改控件的外观。要作更多的了解,请参考“帮助”中的Style属性和FaceID 属性,以及CommandBarButtion对象的其他属性和方法的帮助主题。

设置开始一组控件的控件(也就是说,前面有一线条的控件),需要设置表示控件的CommandBarButton、CommandBarPopup或者CommandBarComboBox对象的BeginGroup属性为True(真)。要去除该线条,则设置属性BeginGroup为False(假)。使用Controls(Index),此处的索引是指控件的标题或索引号,来返回一个表示该控件的对象。。

添加和初始化文本框、列表框和组合框控件

可以通过“自定义”对话框添加内置文本框、列表框和组合框控件。步骤和本节前面介绍的添加内置控件的步骤相同。

添 加 控 件
指 定 类 型

文本框 msoControlEdit
列表框 msoControlDropDown
组合框 msoControlComboBox

可以使用文本框、列表框或组合框的Style属性指明在该框的左边是否显示控件的标题。

下面的例子向自定义工具栏添加了一个标为“Quarter”的组合框,并且给该组合框指定了一个名为“ScrollToQuarter”的宏。

Set newCombo = CommandBars("Custom1").Controls _
.Add(Type:=msoControlComboBox)
With newCombo
.AddItem "Q1"
.AddItem "Q2"
.AddItem "Q3"
.AddItem "Q4"
.Style = msoComboNormal
.OnAction = "ScrollToQuarter"
End With

当用户的vba应用程序运行时,在用户每次改变组合框控件时都要调用指定到该控件的OnAction属性中的过程。在该过程中,可以使用CommandBars对象的ActionControl属性来发现被更改的控件并且返回被更改的值。ListIndex属性返回输入到组合框中的内容。

删除工具栏控件

删除内置工具栏控件能够帮助用户定制自己的vba应用程序以满足需要。例如,要从删除工具栏中删除一个内置控件并且用该命令的自定义版本来替换它,新版本将执行用户的专门任务。抑或是要删除某个控件以简化界面或减少没有经验用户选用不希望使用的那些命令的可能性。

注释 可以恢复已经被删除的内置工具栏或工具栏控件。但是,不能恢复已经被删除的自定义工具栏或工具栏控件;必须重新创建它们。

使用“自定义”对话框

在“自定义”对话框打开的情况下,可以删除任何工具栏控件。

删除工具栏控件

如果“自定义”对话框尚未打开,用鼠标指到“视图”菜单中的“工具栏”上,然后单击“自定义”。
如果包含要删除的工具栏控件的工具栏尚未显示出来,在“工具栏”表的“工具栏”一栏内该工具栏名字旁边的复选框打上对钩。
在要删除的控件上单击鼠标右键,然后在快捷菜单中单击“删除”。
要删除一个完整的自定义工具栏,可以打开“自定义”对话框,在“工具栏”表中的“工具栏”一栏内,选中该工具栏的名字,然后单击“删除”按钮。但是不能删除内置工具栏。

可以使用Delete方法来删除自定义工具栏以及自定义或内置的工具栏控件。但不能删除内置工具栏。

以下Microsoft Excel中的例子从“常用”工具栏中删除了“打印”控件。

CommandBars("Standard").Controls("Print").Delete

下面的例子删除了名叫“Custom Bar”的自定义工具栏

CommandBars("Custom Bar").Delete

用户也可以恢复已经删除的内置工具栏控件。要做更多了解,请参考下一节的内容。

恢复内置工具栏控件

用户可以恢复已经删除的内置工具栏控件。但是,不能恢复已经被删除的自定义工具栏或工具栏控件;必须重新创建它们。

使用“自定义”对话框

用户可以使用“自定义”对话框来恢复内置工具栏中的内置控件集合。

恢复内置工具栏

如果“自定义”对话框尚未打开,则用鼠指向“视图”菜单中的“工具栏”一项,然后单击“自定义”。
在“工具栏”表上,选择要恢复的内置工具栏。
单击“恢复”。
使用Visual Basic

可以使用Reset方法来恢复内置工具栏的组件。

以下Microsoft Excel中的例子恢复了“常用”工具栏的默认控件集合。

CommandBars("Standard").Reset

对工具栏的运行时刻修改

用户可以对在设计时刻创建的工具栏进行编程,使其那个在运行时对条件的变化作出动态响应。如果一个特殊的控件在某个场合下不是合适的选择,那么抑或可以删除或者禁用该控件以防止用户点中它。如果一个控件有两种状态来表示选项,用户可以采用在控件被按下时表示打开选项,控件被放开时表示关闭选项。

注释 虽然既可以使用“自定义”对话框也可以使用Visual Basic对工具栏进行设计时刻修改,但是必须使用Visual Basic来进行任何运行时刻修改。

显示或隐藏工具栏和工具栏控件

工具栏在屏幕上所占用的空间也可以以其他方式用来显示日期;用户可以在必要的时候显示工具栏而在不再需要它的时候把它隐藏起来。工具栏在它的Visual 属性为True(真)时是可见的,而在该属性为False(假)时是不可见的。设置该属性为True(真)就等价于,在“工具栏”对话框中的“工具栏”表里该工具栏名字旁边的复选框内打上对钩,然后单击“确定”。

下面的Microsoft Excel的过程指定给“视图”菜单中的菜单项View MyToolbar,用户每次点击该菜单项,就使该过程在菜单项和工具栏Visible属性的两种状态之间进行切换。当工具栏重新出现时,它所处的位置就是它隐藏不可见时的位置。

Sub ViewMyAppToolbar()
With CommandBars("Worksheet Menu Bar").Controls("View").Controls("View MyToolbar")
If .State = msoButtonUp Then
.State = msoButtonDown
CommandBars("MyAppTools").Visible = True
Else
.State = msoButtonUp
CommandBars("MyAppTools").Visible = False
End If
End With
End Sub

当工具栏可见时,用户可以单击上面的任何控件,运行给控件指定的过程。

如果想要一个特定的工具栏只在某种条件存在时才出现,那么可以在运行时刻隐藏或显示工具栏控件。通过设置Visible属性为True(真)或False(假),能够有效地向用户工作区添加控件,或者从用户工作区中去掉控件而不必真正地删除该控件。

注释 因为Word可以在文档和模板中保存自定义信息,那么当文档或模板有效时,就会显示出自定义工具栏和工具栏控件,而当文档或模板无效时,又会把它们隐藏起来。与此相对照,因为Microsoft Excel在工作簿级保存自定义信息,又会需要在事件代码中使用Visible属性来动态地更改界面。

移动工具栏及调整工具栏的大小

用户可能希望在自己的应用程序运行时能够随着条件的改变来调整屏幕上工具栏的突出性。这可以通过改变工具栏的大小或位置来做到。用户可以使用工具栏所支持的几种属性来对其进行调整;将它们定位在应用程序窗口的底部、底部、左边或者右边;或者将它们放在屏幕的随便什么位置(如果它们是浮动工具栏的话)。要对表示工具栏的CommandBar对象的属性和方法作更多的了解,请参考“帮助”中的“CommandBar 对象”,使用标题上的跳转来显示属性和方法的列表。

恢复内置工具栏

如果一个默认工具栏已经被修改了-被用户或Vba过程-用户能够通过Reset方法将工具栏恢复到它的默认状态。使用该方法等价于,在“自定义”对话框中的“工具栏”一栏里选中被自定义的内制工具栏的名字,然后单击“确定”。

下面的例子将所有工具栏恢复到它们的默认状态,同时删除所了所有的自定义工具栏。

For Each cb In CommandBars
If cb.BuiltIn Then
cb.Reset
Else
cb.Delete
End If
Next

当心 当使用Reset方法时要小心;它不但能够恢复任何被删除的内置工具栏控件,而且还会删除任何添加的自定义工具栏控件。要牢牢记住,另一个宏可能已经向工具栏添加了自定义工具栏,复位工具栏也会删除这些控件。为了避免这些问题,应该一个一个地删除应用程序所添加的工具栏控件,而不要复位整个工具栏。

启用或禁用工具栏控件

用户可能想在自己的应用程序运行时控制某个工具栏控件的可用性,以此来防止在不合适的时刻点中该按钮。要做到这一点,可以动态地启用或禁用工具栏控件。当工具栏被禁用时,点中它不会有什么反应,也不会运行和它关联的过程。使用Enable属性来设置或返回工具栏控件的状态(被启用或被禁用)。

下面的例子禁用了“常用”工具栏中的第三个按钮。

CommandBars("Standard").Controls(3).Enabled = False

指出工具栏控件的状态

如果一个工具栏按钮表示有着两种状态的一个选项,可以通过改变按钮的外观来指出当前选项的状态;当选项打开时,与之相关联的按钮显示出被按下的状态;当选项关闭时,按钮显示被放开的状态。

如果工具栏按钮显示出被按下的状态,工具栏按钮的State属性值为msoButtonDown;而如果工具栏按钮显示出被放开的状态,该属性值为msoButtonUp。下面的过程被指定给新的工具栏控件Database View,在对工作簿的特殊查看间进行切换之前,它能够改变该控件的外观。

Sub DatabaseView()
With CommandBars("MyAppToolbar").Controls(3)
If .State = msoButtonDown Then
.State = msoButtonUp
'Switch to database view
Else
.State = msoButtonDown
'Switch to worksheet view
End If
End With
End Sub

修改文本框、列表框和组合框控件

如果给工具栏添加了文本框、列表框或组合框控件,那么可以进行运行时刻更改,比如改变控件中文本框部分的当前值、向控件的列表框中添加或从中删除项(只适用于列表框和组合框)。

用户能够通过设置文本框、列表框或组合框控件的Text属性,来反映自己的Visual Basic应用程序的状态。例如,如果单击一个工具栏按钮来运行名为“MaxZoom”的过程(一个自定义过程,能够以最大显示比例显示活动文档),组合框控件的文本框部分能够更加精确地调整显示比例,并且显示出比例值,该比例值能够被设置到最大值。

使用AddItem和RemoveItem方法来向列表框或组合框控件中的列表部分添加以及从中删除项(通过索引编号)。例如,如果在Word里创建了一个列表框,它遵循用户在一个时段内所使用的样式,用户可以在每次使用一种样式时向控件的列表部分添加一种样式的名称。

注释 在列表框或组合框控件里添加项或从中删除项时要小心;这将导致所有项的索引编号发生移动。

用户可以使用列表框和组合框的其他属性和方法来改变运行时刻一个控件的外观。例如,可以为控件添加和调整标题列表(标题列表是位于一个控件列表部分顶部的列表项组,用分隔线把该组同其他列表项分隔开)。要更进一步了解文本框、列表框和组合框控件的使用,请参考“帮助”中“使用命令栏”的内容。

菜单项和工具栏控件的IDs

每个内置菜单栏和工具栏控件相关联的功能都属于某个特定的Office应用程序,与此相反的是,每个菜单项和工具栏控件的标题、按钮图标、宽度以及其他默认属性都保存在能够被所有应用程序共享的资源中。可以使用ID编号从该资源中找出特定的菜单项和工具栏控件。

注释 该资源还包含pop-up(弹出)控件的默认属性,该控件用来显示内置菜单。但是,那些pop-up(弹出)控件并不包含菜单中的内置菜单项;也就是说,pop-up(弹出)是空的。

虽然一般可以忽略一个菜单项或控件的ID,而是使用“自定义”对话框来更改内置或自定义菜单和工具栏,但是仍然需要参考某项的ID来完成对用户自定义界面的某些更改。以下是需要参考ID的以下场合。

要给一个内置或自定义菜单或工具栏指派一项,但是在设计时刻该项在“自定义”对话框中并不存在。
在运行时刻向一个菜单栏或工具栏添加内置项。
在运行时刻将一个特定的按钮图标复制到另一个按钮。
可以为CommandBarControls 集合的Add方法中的参数Id指定一个内置项ID,并且可以为任何自定义或内置控件的FaceId 属性指定一个项ID。
注释 即使共享资源包含了所有Office应用程序中的每个菜单项和工具栏控件的有关信息,用户所添加的项和控件,它们的功能必须包含在用户正在使用的应用程序里面。例如,不能向Word中一个工具栏添加Microsoft Excel 的“删除行”工具栏按钮(ID 293)。但是,可以把“删除行”工具栏按钮的外观从Microsoft Excel 复制到Word里给一个工具栏控件。

可以使用以下方法之一,来得到一个特定Office应用程序中内置菜单项和工具栏控件的ID编号。

在一个模块中,编写代码把一个已经存在于菜单或工具栏中的菜单项或工具栏控件赋值给一个对象变量,然后使用调试工具监测该对象Id属性的值。得到ID后,可以采用Add方法向另一个菜单或工具栏添加该菜单项或控件的副本,也可以通过把ID赋给另一个按钮的FaceId 属性来复制图标给另一个按钮。

Run the following procedure in one of the Office applications to create a text document that lists the IDs and captions of all the built-in commands in that application.

在一个Office应用程序中运行以下过程,创建一个列出该应用程序中所有内置命令的ID和标题的文本文档。

Sub outputIDs()
Const maxId = 4000
Open "c:\ids.txt" For Output As #1
' Create a temporary command bar with every
' available item and control assigned to it.
Set cbr = CommandBars.Add("Temporary", msoBarTop, False, True)
For i = 1 To maxId
On Error Resume Next
cbr.Controls.Add Id:=i
Next
On Error GoTo 0
' Write the ID and caption of each control to the output file.
For Each btn In cbr.Controls
Write #1, btn.Id, btn.Caption
Next
' Delete the command bar and close the output file.
cbr.Delete
Close #1
End Sub

在一个Office应用程序中运行以下过程,创建一个自定义工具栏的集合,该集合包含了和Office里FaceId属性的有效值数目同样多的按钮;每个按钮的图标和工具提示文本被设置为其中的一个值。可以对内置命令(见前面的过程)的ID编号和这些工具栏上某个按钮的FaceId属性值进行交叉索引,反之亦然。

Sub MakeAllFaceIds()
'Make fourteen toolbars with 300 faces each.
'Note that maxId is greater than last valid ID, so
'error will occur when first invalid ID is used.
Const maxId = 3900
On Error GoTo realMax
For bars = 0 To 13
firstId = bars * 300
lastId = firstId + 299
Set tb = CommandBars.Add
For i = firstId To lastId
Set btn = tb.Controls.Add
btn.FaceId = i
btn.TooltipText = "FaceId = " & i
Next
tb.Name = ("Faces " & CStr(firstId) & " to " _
& CStr(lastId))
tb.Width = 591
tb.Visible = True
Next
'Delete the button that caused the error and set toolbar name
realMax:
btn.Delete
tb.Name = ("Faces " & CStr(firstId) & " to " _
& CStr(i - 1))
tb.Width = 591
tb.Visible = True
End Sub

注释 内置菜单pop-up(弹出)控件的ID编号在30002到30426之间。记住,这些ID编号返回的内置菜单副本为空。


qwe 新手上路 2003-5-3 03:17

Excel 资深人员的例子
http://j-walk.com/ss/excel/tips/tip53.htm
本贴包含图片附件:
img

yanjian VBA超级菜鸟 2003-5-3 21:46

好长啊,辛苦了,收下先

fanjy 新手上路 2003-5-5 15:01

收到

jydd1 白金长老 2003-5-5 15:10

收下,慢慢学习

FENGJUN 认证会员 2003-5-5 18:04

好东西,谢谢!

Contributors: FHL