设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3253|回复: 5
打印 上一主题 下一主题

[Access本身] [分享][转帖]对 Microsoft Office 命令栏进行更多编程

[复制链接]
跳转到指定楼层
1#
发表于 2006-5-11 06:18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对 Microsoft Office 命令栏进行更多编程<FONT>
Frank C. Rice
Microsoft Corporation
Paul Cornell
Microsoft Corporation
2002 年 5 月 2 日



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


  • Microsoft Outlook&reg; 如何以编程方式处理命令栏。
  • 如何向命令栏按钮中添加自定义图像。
  • 如何向命令栏中添加组合框。
  • 如何禁用和隐藏命令栏以及命令栏控件。
  • 如何定位命令栏。
  • 如何动态添加和删除命令栏。
  • 如何在给定的 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 中运行此代码将导致运行时错误。相反,您必须使用 ExplorerInspector 对象的 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



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

向命令栏按钮中添加自定义图像

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

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


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


下面是我创建的图像示例:

  1. [img]http://www.microsoft.com/china/msdn/Archives/library/dnofftalk/images/office05022002-fig01.gif[/img]
复制代码

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

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

  1. [img]http://www.microsoft.com/china/msdn/Archives/library/dnofftalk/images/office05022002-fig02.gif[/img]
复制代码

图 2:自定义位图掩码

下面是一些示例代码,显示如何向命令栏按钮中添加透明图片:
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2006-5-11 06:20:00 | 只看该作者
禁用和隐藏命令栏与命令栏控件

开发 Office 解决方案时,您可能需要防止用户在与该解决方案关联的某些命令栏和命令栏控件上单击。例如,您可能需要防止用户单击“窗体”工具栏上的任何控件,以免修改您在 Microsoft Word 中创建的自定义窗体。您也可能需要为给定的解决方案禁用“工具”菜单上的“宏”命令。

将命令栏或命令栏控件的 Enabled 属性设置为 False 可禁用命令栏或命令栏控件;同样,将命令栏或命令栏控件的 Enabled 属性设置为 True 可启用命令栏或命令栏控件。

将命令栏或命令栏控件的 Visible 属性设置为 False 可隐藏命令栏或命令栏控件;同样,将命令栏或命令栏控件的 Visible 属性设置为 True 可显示命令栏或命令栏控件。

要尝试此操作,请将以下代码行输入到“立即”窗口。每个代码行将切换指定的命令栏或命令栏控件的启用或可见状态。如果在 Outlook 或 Microsoft Visual Basic&reg; Editor 中输入此代码,请务必使用 <CODE class=ce>Application.ActiveExplorer</CODE> 或 <CODE class=ce>Application.VBE</CODE> 术语。要返回到开始时的启用或可见状态,请确保将每行运行两次。Application.CommandBars("Tools").Enabled = _

  Not Application.CommandBars("Tools").Enabled

Application.CommandBars("Tools").Controls("Macro").Enabled = _

  Not Application.CommandBars("Tools").Controls("Macro").Enabled

Application.CommandBars("Tools").controls("Macro").Visible = _

  Not Application.CommandBars("Tools").controls("Macro").Visible



定位命令栏

命令栏的 Position 属性指定命令栏在应用程序中的位置。msoBarLeftmsoBarTopmsoBarRightmsoBarBottom 枚举常数指定在应用程序的左边、上边、右边或下边显示命令栏。msoBarFloating 枚举常数指定命令栏不靠接到应用程序的边缘。msoBarPopup 枚举常数指定命令栏是弹出菜单。

以下函数更改所指定的命令栏的位置。Public Function ChangeCommandBarPosition(ByVal strCommandBarName As String, _

        ByVal msoPosition As MsoBarPosition) As Boolean



    ' 用途:更改命令栏的位置。

    ' 接受:

    '   strCommandBarName:要更改位置的命令栏名称。

    ' 返回:如果命令栏移动成功,则为 Ture。

   

    On Error GoTo ChangeCommandBarPosition_Err

   

    ' 将下一行代码替换为:

    ' Application.ActiveExplorer.CommandBars.Item(strCommandBarName).Position = _

  msoPosition <- 对于 Outlook

    ' Application.VBE.CommandBars.Item(strCommandBarName).Position = _

      msoPosition <- 对于 Visual Basic Editor

    Application.CommandBars.Item(strCommandBarName).Position = msoPosition

   

ChangeCommandBarPosition_End:

   

    ChangeCommandBarPosition = True

    Exit Function

        

ChangeCommandBarPosition_Err:



    ChangeCommandBarPosition = False

   

End Function



可以使用如下所示的代码测试该函数:Public Sub TestChangeCommandBarPosition()



    ' 用途:测试 ChangeCommandBarPosition 函数。

   

    If ChangeCommandBarPosition("Standard", msoBarFloating) = True Then

   

        MsgBox "命令栏已成功移动。"

        

    Else

   

        MsgBox "未能移动命令栏。某些命令栏无法" & _

            "以某些方式移动。"

   

    End If

   

End Sub



动态添加和删除命令栏

有时需要将命令栏与特定 Office 文档关联在一起。例如,您需要在特定 Office 文档打开时才显示某些自定义命令栏,并在特定 Office 文档关闭时将其隐藏。要以编程方式执行此操作,使用 Excel 就是一个不错的示例。要测试该操作,请创建一个新的空白工作簿,然后将 Sheet1 重命名为 CommandBarInfo。将以下信息键入 CommandBarInfo 工作簿中:

  1. [img]http://www.microsoft.com/china/msdn/Archives/library/dnofftalk/images/office05022002-fig04.gif[/img]
复制代码

图 4:在 Excel 中动态创建命令栏的信息

在 Visual Basic Editor 中,将以下代码添加到与新空白工作簿关联的新代码模块中:<RE>ublic Function CreateCommandBarPopup() As Boolean



    ' 用途:根据 Excel 工作表中提供的信息,

    ' 创建一个包含菜单项的命令栏弹出控件。

   

    ' 返回:如果命令栏弹出控件

    ' 成功添加,则为 True。

   

    Dim objWorksheet As Excel.Worksheet

    Dim objCommandBarControl As Office.CommandBarControl

    Dim objCommandBarPopup As Office.CommandBarPop
3#
 楼主| 发表于 2006-5-11 06:21:00 | 只看该作者
CommandBarDocumenter 和 CommandBarControlDocumenter 子例程

在开发命令栏解决方案时,我经常需要获取特定命令栏或命令栏控件的索引、名称或标题。我创建了 <CODE class=ce>CommandBarDocumenter</CODE> 和 <CODE class=ce>CommandBarControlDocumenter</CODE> 子例程,以便将所有命令栏和命令栏控件的公共属性记录在给定的 Office 应用程序中。

要运行这些示例,请在 Visual Basic Editor 中将以下代码复制到 Microsoft Office XP 应用程序的代码模块,然后运行以下子例程之一或两者都运行。屏幕出现提示时,请将结果保存为文本文件 (.txt)。这使结果更容易加载到应用程序(例如 Microsoft Excel)中以便查看和过滤。<RE>ublic Sub CommandBarDocumenter()



    ' 用途:将当前应用程序中有关所有命令栏的信息

    ' 写入文本文件。

   

    ' 您必须先设置对 Microsoft 脚本运行时的引用

    ' (scrrun.dll) 才能使此代码正确运行。

   

    ' 注意:此代码仅适用于 Microsoft Office XP。

   

    Dim objCommandBar As Office.CommandBar

    Dim strType As String

    Dim strPosition As String

    Dim objFileSaveDialog As Office.FileDialog

    Dim objFSO As Scripting.FileSystemObject

    Dim objTextStream As Scripting.TextStream

    Const SAVE_BUTTON As Integer = -1

   

    Set objFileSaveDialog = Application.FileDialog(msoFileDialogSaveAs)

   

    objFileSaveDialog.Title = "将结果另存为"

   

    ' 用户单击“保存”按钮。

    If objFileSaveDialog.Show = SAVE_BUTTON Then

     

        Set objFSO = New Scripting.FileSystemObject

        Set objTextStream = objFSO.CreateTextFile(objFileSaveDialog.SelectedItems.Item(1))

        



        objTextStream.WriteLine "Name" & vbTab & _

            "Type" & vbTab & _

            "Enabled" & vbTab & _

            "Visible" & vbTab & _

            "Index" & vbTab & _

            "osition" & vbTab & _

            "Protection" & vbTab & _

            "Row Index" & vbTab & _

            "Top" & vbTab & _

            "Height" & vbTab & _

            "Left" & vbTab & _

            "Width"

        

        ' 将下一行替换为:

        ' For Each objCommandBar In Application.ActiveExplorer.CommandBars _

           <- 对于 Outlook

        ' For Each objCommandBar In Application.VBE.CommandBars <- 对于 _

            Visual Basic Editor

        For Each objCommandBar In Application.CommandBars

   



            Select Case objCommandBar.Type

                Case msoBarTypeMenuBar

                    strType = "Menu Bar"

                Case msoBarTypeNormal

                    strType = "Normal"

                Case msoBarTypePopup

                    strType = "Pop-Up"

            End Select

        

            Select Case objCommandBar.Position

                Case msoBarBottom

                    strPosition = "Bottom"

                Case msoBarFloating

                    strPosition = "Floating"

                Case msoBarLeft

                    strPosition = "Left"

                Case msoBarMenuBar

                    strPosition = "Menu Bar"

                Case msoBarPopup

                    strPosition = "Pop-Up"

                Case msoBarRight

                    strPosition = "Right"

                Case msoBarTop

                    strPosition = "Top"

            End Select

        

            Select Case objCommandBar.Protection

                Case msoBarNoChangeDock

                    strProtection = "No Change Dock"

                Case msoBarNoChangeVisible

                    strProtection = "No Change Visible"

                Case msoBarNoCustomize

                    strProtection = "No Customize"

                Case msoBarNoHorizontalDock

                    strProtection = "No Horizontal Dock"

                Case msoBarNoMove

                    strProtection = "No Move"

                Case msoBarNoProtection

                    strProtection = "No Protection"

                Case msoBarNoResize

                    strProtection = "No Resize"

                Case msoBarNoVerticalDock

                    strProtection = "

点击这里给我发消息

4#
发表于 2006-5-11 17:27:00 | 只看该作者
挺不錯,謝謝分享
5#
发表于 2006-5-13 02:04:00 | 只看该作者
好文章应该应该顶一下。
6#
发表于 2006-5-13 05:24:00 | 只看该作者
收藏
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 04:26 , Processed in 0.113835 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表