对 Microsoft Office 命令栏进行更多编程(1)

编程

对 Microsoft Office 命令栏进行更多编程
Frank C. Rice
Microsoft Corporation
Paul Cornell
Microsoft Corporation
2002 年 5 月 2 日

在上个月的专栏(英文)中,我向您介绍了“命令栏”,它们是在 Microsoft Office 中使用的用户界面组件,使用户能够在 Office 应用程序中执行操作。根据您对上个月专栏的反馈,我将向您介绍一些用于解决命令栏特定问题的附加信息和代码,具体内容包括:

Microsoft Outlook 如何以编程方式处理命令栏。
如何向命令栏按钮中添加自定义图像。
如何向命令栏中添加组合框。
如何禁用和隐藏命令栏以及命令栏控件。
如何定位命令栏。
如何动态添加和删除命令栏。
如何在给定的 Office 应用程序中列出命令栏和命令栏控件的通用属性。
命令栏和 Outlook 对象模型
在上个月的专栏中,我忘了告诉您 Microsoft Outlook 对象模型访问命令栏和命令栏控件的方式与其他 Microsoft Office 应用程序略有不同。

在除 Outlook 以外的应用程序中,您可以使用如下所示的代码访问命令栏:

Public Sub ListCommandBarNames()

    ' 用途:列出当前应用程序的所有命令栏名称。
    ' 注意:此代码对 Outlook 无效!

    Dim objCommandBar As Office.CommandBar
    
    For Each objCommandBar In Application.CommandBars
    
        Debug.Print objCommandBar.Name
        
    Next objCommandBar
    
End Sub

然而,尝试在 Outlook 中运行此代码将导致运行时错误。相反,您必须使用 Explorer 或 Inspector 对象的 CommandBars 属性,如下所示:

Public Sub ListOutlookExplorerCommandBarNames()

    ' 用途:列出当前资源管理器的所有命令栏名称。
    ' 注意:此代码只对 Outlook 有效!

    Dim objCommandBar As Office.CommandBar
    
    For Each objCommandBar In Application.ActiveExplorer.CommandBars
    
        Debug.Print objCommandBar.Name
        
    Next objCommandBar
    
End Sub

在前面的代码示例中,将代码 ActiveExplorer 替换为 ActiveInspector 可打印活动检查器的所有命令栏名称。对于那些不熟悉 Outlook 对象模型的用户,“浏览器”表示 Outlook 用户界面。“检查器”表示一个窗口,它包含特定的 Outlook 项(如电子邮件信息或联系人)以及 Outlook 项中的任何选项卡页(如任务项中的“详细信息”选项卡)。

向命令栏按钮中添加自定义图像
尽管可以使用 CommandBarButton 对象的 FaceId 属性将命令栏按钮的图像设置为 Office 提供的内置图像,但您可以使用 CommandBarButton 对象的 Picture 属性提供您创建的图像,也可以使用 CommandBarButton 对象的 Mask 属性创建自定义透明图像。

尽管在 Web 的共享软件和免费软件站点上有很多可用的图像编辑器,以及 Microsoft Visual C++ 这样的工具,但是要创建这些图像,使用 Microsoft 画图就足够了。要使用画图创建这些图像:

在“开始”菜单上,指向“程序”,指向“附件”,然后单击“画图”。
在“图像”菜单上,单击“属性”。
在“宽度”框中,键入“16”。在“高度”框中,键入“16”。确保选中“像素”和“彩色”选项,然后单击“确定”。
在“查看”菜单上,指向“缩放”,然后单击“自定义”。
单击“800%”选项,然后单击“确定”。
在“查看”菜单上,指向“缩放”,然后单击“显示网格”。
在“查看”菜单上,确保选中“工具箱”和“颜料盒”命令。
使用“工具箱”和“颜料盒”控件创建图像。
创建完图像之后,在“文件”菜单上,单击“保存”。
将图标保存为“256 色位图”。
下面是我创建的图像示例:

图 1:自定义的不透明位图

要创建透明图像,您必须创建相应的“图像掩码”。为此,请保存刚刚创建的图像,但要更改文件名。对于每个需要透明的像素,请用白色填充该像素。对于每个需要不透明的像素,请用黑色填充该像素。然后再次保存该图像。下面是我创建的图像掩码示例:

图 2:自定义位图掩码

下面是一些示例代码,显示如何向命令栏按钮中添加透明图片:

Public Sub NewPictureOnNewCommandBar()

    ' 用途:向命令栏按钮中添加图片。

    Dim objCommandBar As Office.CommandBar
    Dim objCommandBarButton As Office.CommandBarButton
    Dim objPicture As stdole.IPictureDisp

    ' 如果不需要透明图像,请将下一行代码注释掉。
    Dim objMask As stdole.IPictureDisp

    Const PICTURE_PATH As String = "C:\My Pictures\OK.bmp"

    ' 如果不需要透明图像,请将下一行代码注释掉。
    Const PICTURE_MASK As String = "C:\My Pictures\OKMask.bmp"

    Const COMMAND_BAR_NAME As String = "测试命令栏"

    ' 将下一行替换为:
    ' For Each objCommandBar In Application.ActiveExplorer.CommandBars <- 对于 Outlook
    ' For Each objCommandBar In Application.VBE.CommandBars <- 对于 Visual Basic Editor
    For Each objCommandBar In Application.CommandBars
    
        If objCommandBar.Name = COMMAND_BAR_NAME Then
        
            objCommandBar.Delete
            
        End If
    
    Next objCommandBar
    
    Set objCommandBar = Application.CommandBars.Add(COMMAND_BAR_NAME)
    Set objCommandBarButton = _
        objCommandBar.Controls.Add(msoControlButton)
    Set objPicture = LoadPicture(PICTURE_PATH)

    ' 如果不需要透明图像,请将下一行代码注释掉。
    Set objMask = LoadPicture(PICTURE_MASK)

    objCommandBarButton.Picture = objPicture

    ' 如果不需要透明图像,请将下一行代码注释掉。
    objCommandBarButton.Mask = objMask

End Sub

如前面的代码所示,请在代码中为不透明图像创建一个对象,为图像掩码创建一个对象;每个对象都必须为 stdole.IPictureDisp 类型。接下来,通过调用对象的 LoadPicture 方法对这两个对象分别进行初始化。最后,将命令栏按钮对象的 Picture 属性设置为不透明图像对象,将命令栏按钮对象的 Mask 属性设置为图像掩码。

以下是不透明和透明图像的最终外观:

图 3:命令栏按钮上的不透明和透明图像

顺便说一下,请勿将 CommandBarButton 对象的 FaceId 属性与 CommandBarButton 对象的 Id 属性混淆在一起。Id 属性确定该命令栏控件的内置操作。所有自定义命令栏控件 Id 属性的默认值均为 1。将自定义命令栏控件的 Id 属性设置为 1 以外的数字会将自定义命令栏控件的操作设置为内置操作(前提是应用程序中存在此 ID 的内置操作)。为了便于参考,下列代码列出了应用程序中所有命令栏控件的所有 ID:

Public Sub ListCommandBarControlIDs()

    ' 用途:列出当前应用程序所有命令栏控件的 ID。

    Dim objCommandBar As Office.CommandBar
    Dim objCommandBarControl As Office.CommandBarControl
    
    ' 将下一行替换为:
    ' For Each objCommandBar In Application.ActiveExplorer.CommandBars <- 对于 Outlook
    ' For Each objCommandBar In Application.VBE.CommandBars <- 对于 Visual Basic Editor
    For Each objCommandBar In Application.CommandBars
    
        For Each objCommandBarControl In objCommandBar.Controls
        
            Debug.Print objCommandBarControl.Caption & " " & _
                objCommandBarControl.ID
            
        Next objCommandBarControl
    
    Next objCommandBar
    
End Sub

向命令栏中添加组合框
要向命令栏中添加组合框,请使用 CommandBarControls 集合的 Add 方法,并将 msoControlComboBox 枚举常数传递给 Type 参数。然后使用 CommandBarComboBox 对象的 AddItem 方法向组合框中添加选项。

以下函数向现有命令栏中添加组合框:

Public Function AddComboBoxToCommandBar(ByVal strCommandBarName As String, _
        ByVal strComboBoxCaption As String, _
        ByRef strChoices() As String) As Boolean

    ' 用途:向命令栏中添加组合框。
    ' 接受:
    '   strCommandBarName:添加组合框的命令栏名称。
    '   strChoices():组合框选项数组。
    ' 返回:如果组合框已成功添加至命令栏中,则为 True。
    
    Dim objCommandBarControl As Office.CommandBarControl
    Dim objCommandBarComboBox As Office.CommandBarComboBox
    Dim varChoice As Variant
    
    On Error GoTo AddComboBoxToCommandBar_Err
    
    ' 删除以前添加的此组合框的所有实例。
    ' 将下一行代码替换为:
    ' For Each objCommandBarControl In _
    '   Application.ActiveExplorer.CommandBars.Item(strCommandBarName).Controls _
  <- 对于 Outlook
    ' For Each objCommandBarControl In _
    '   Application.VBE.CommandBars.Item(strCommandBarName).Controls _
          <- 对于 Visual Basic Editor
    For Each objCommandBarControl In Application.CommandBars.Item(strCommandBarName).Controls

        If objCommandBarControl.Caption = strComboBoxCaption Then
    
            objCommandBarControl.Delete
    
        End If

    Next objCommandBarControl

    ' 创建组合框。
    ' 将下一行代码替换为:
    ' Set objCommandBarComboBox = _
    '   Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox) _
  <- 对于 Outlook
    ' Set objCommandBarComboBox = _
    '   Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox) _
  <- 对于 Visual Basic Editor
    Set objCommandBarComboBox = _
      Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox)
       
    objCommandBarComboBox.Caption = strComboBoxCaption
    
    For Each varChoice In strChoices
    
        objCommandBarComboBox.AddItem varChoice
        
    Next varChoice
    
AddComboBoxToCommandBar_End:
    
    AddComboBoxToCommandBar = True
    Exit Function
        
AddComboBoxToCommandBar_Err:

    AddComboBoxToCommandBar = False
    
End Function

时间: 2025-01-27 00:23:33

对 Microsoft Office 命令栏进行更多编程(1)的相关文章

对 Microsoft Office 命令栏进行更多编程(3)

编程 CommandBarDocumenter 和 CommandBarControlDocumenter 子例程在开发命令栏解决方案时,我经常需要获取特定命令栏或命令栏控件的索引.名称或标题.我创建了 CommandBarDocumenter 和 CommandBarControlDocumenter 子例程,以便将所有命令栏和命令栏控件的公共属性记录在给定的 Office 应用程序中. 要运行这些示例,请在 Visual Basic Editor 中将以下代码复制到 Microsoft Of

对 Microsoft Office 命令栏进行更多编程(2)

编程 可以使用如下所示的代码测试该函数: Public Sub TestAddComboBoxToCommandBar()     ' 用途:测试 AddComboBoxToCommandBar 函数.     Dim strChoices(4) As String        strChoices(1) = "Vanilla"    strChoices(2) = "Chocolate"    strChoices(3) = "Strawberry&q

使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程(一)

excel|visual|word|编程 使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程 Kerry Loynd 和 Siew-Moi KhorMicrosoft Corporation 2002年10月 适用于:    Microsoft Office XP    Microsoft Visual C#摘要:了解 Microsoft C# 和大型复杂的 COM 服务器之间的 COM 互操作性.本文介绍了如何准备 Off

使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程(二)

excel|visual|word|编程 示例 3:打开现有的 Word 文档 同 Documents.SaveAs 方法一样,Documents.Open 方法签名在 Office 2000 和 OfficeXP 之间也存在差别,因此新名称包装在 #if 声明中.Open 方法和 SaveAs 方法一样简单,如下所示:     object fileName = Environment.CurrentDirectory+"\\example3";    object optional

Programming Microsoft Office 2000 Web Components第一

第一章第二节 Office Web Components是什么? Office Web Components是一组的COM控件,设计的目的是为众多的控件容器提供交互的电子表格建模,数据报表和数据可视化功能.OWC库包含四个主要的组件:电子表格组件,图表组件,透视表组件和数据源组件.我们将在这一节中简要论述每个控件,然后在后续各章中讨论更多细节. 注释: COM也被称作ActiveX.当微软发明了术语"ActiveX"来描述COM技术时,我正在Visual Basic小组,这个术语使得我

Programming Microsoft Office 2000 Web Components第一章

web 译者说明:<Programming Microsoft Office 2000 Web Components>是我从网上下载的一本讲述OWC技术的英文电子书,之所以要翻译这本书,是基于以下几个想法:1.阅读英文资料时常常会不求甚解,忽略很多细节和不容易阅读的句子,如果强迫自己逐句的翻译出来,则会对原来的英文资料有更加全面.详细和深刻的了解.2.可以锻炼自己在英语方面的能力.3.能够给其他需要这方面的资料的朋友提供一定的帮助. 这是本人初次进行这方面的工作,本人的技术和英文能力都很一般,

Programming Microsoft Office 2000 Web Components第一章第一节

web 第一章第二节 Office Web Components是什么? Office Web Components是一组的COM控件,设计的目的是为众多的控件容器提供交互的电子表格建模,数据报表和数据可视化功能.OWC库包含四个主要的组件:电子表格组件,图表组件,透视表组件和数据源组件.我们将在这一节中简要论述每个控件,然后在后续各章中讨论更多细节. 注释: COM也被称作ActiveX.当微软发明了术语"ActiveX"来描述COM技术时,我正在Visual Basic小组,这个术

怎么删除ie浏览器命令栏上面的图标

在 Internet Explorer 9 (IE9) 命令栏中,添加了更多的IE快捷操作,让您在 IE 浏览器中进行各类操作的时候更加方便快捷.不过有时候我们安装某些软件以后,这些软件也会将一些相关的快捷操作图标按钮添加到命令栏中,让命令栏变得臃肿起来,如何才能删除 IE9 浏览器命令栏上面不需要的图标呢? 收起这个图片展开这个图片   解决方法: 在命令栏上单击右键,在移动鼠标至"自定义",单击"添加或删除命令". 收起这个图片展开这个图片   在弹出对话框的&

在Microsoft Office System中使用ADO.NET数据集(四)

ado|数据 在Office文档中使用DataSet中的数据 一旦DataSet中填充完毕你所需要的数据,并且断开了数据库连接,你就有多种方法在各种Office文档中使用这些数据.Microsoft Office System本质上不能处理大多数基于.NET的对象,因此,通常你必须使用COM互用性(COM interoperability)来维护这些数据,并将这些数据转换为你希望添入的工作表或其他文档所能识别的数据类型.你可以在Microsoft Office System使用它新集成的XML功