對 Microsoft Office 命令欄進行更多編程(1)

來源:互聯網
上載者:User
編程 對 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



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。