2013-07-15 34 views
5

Tôi đang phát triển bổ trợ PowerPoint và muốn tạm thời vô hiệu hóa một số điều khiển Ribbon trong khi ứng dụng bổ trợ là chạy.Tùy chỉnh Dải băng PowerPoint lúc Chạy-Thời gian

tôi đã phát triển một giải pháp mà làm việc như mong đợi khi các Add-In là kích hoạt, nhưng điều này là không thực sự đầy đủ, bởi vì nó vô hiệu hóa một số điều khiển thông dụng, như SlideMaster, SlideSorter vv

tôi đang sử dụng PowerPoint 2010.

đây là một XML mẫu mà là nổi hình thành:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
    <ribbon startFromScratch="false"> 
     <tabs> 
      <tab idMso="TabView"> 
       <group idMso="GroupMasterViews" getVisible="GetVisible"/> 
      </tab> 
     </tabs> 
    </ribbon> 
</customUI> 

đây là một callback mẫu, lấy từ this SO answer:

Sub GetVisible(control As IRibbonControl, ByRef returnedVal As Boolean) 
    If TrapFlag Then 
     returnedVal = False ' control is hidden 
    Else: 
     returnedVal = True ' control is not hidden 
    End If 
End Sub 

Khi tôi tìm đến View ribbon, một cảnh báo thông báo với tôi rằng:

vĩ mô không thể tìm thấy hoặc đã bị vô hiệu vì các thiết lập bảo mật của bạn.

Có lẽ đây là tham chiếu đến số GetVisible macro? thiết lập macro của tôi là:

  • Enable tất cả các macro (không khuyến khích)
  • ủy thác quyền truy cập vào các VBA mô hình đối tượng dự án

tôi đã phải vật lộn với những gì tôi đã tìm thấy cho đến nay nhưng cho đến nay không thể để thực hiện các đề xuất. Hầu hết các câu trả lời đều dành riêng cho Excel. Tôi đã không thực sự tìm thấy bất cứ điều gì cụ thể cho PowerPoint, nhưng figured nó không phải là terribly khó khăn để cổng mã từ một ứng dụng khác, như tôi đã làm điều này cho nhiều thứ khác trong VBA.

Tôi cũng đã thử phương pháp this, nhưng SetCustomUI không có sẵn trong PowerPoint ở cấp độ Application hoặc Presentation, có lẽ nó là duy nhất hoặc chỉ áp dụng cho Visual Studio?

Trả lời

3

Sau một chút thử nghiệm lỗi &, tôi tin rằng tôi có một giải pháp chức năng, mặc dù có một số điều tôi không chắc chắn về việc tôi sẽ mô tả bên dưới.

Tôi đã thử nghiệm điều này trong tệp PPTM với một chương trình con để kiểm soát biến số TrapFlag công khai, xác định xem có ẩn/vô hiệu các điều khiển nhất định hay không. Tôi cũng đã thử nghiệm điều này trong một PPAM nơi cờ này được đặt khi ứng dụng khởi chạy, không khi bổ trợ được tải.

Điều này cho phép tôi thao tác RibbonUI khi chạy.

Đây là XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` 
    <customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
    <commands> 
     <command idMso="ViewSlideSorterView" getEnabled="EnableControl"/> 
     <command idMso="ViewNotesPageView" getEnabled="EnableControl"/> 
     <command idMso="ViewSlideShowReadingView" getEnabled="EnableControl"/> 
     <command idMso="ViewSlideMasterView" getEnabled="EnableControl"/> 
     <command idMso="ViewHandoutMasterView" getEnabled="EnableControl"/> 
     <command idMso="ViewNotesMasterView" getEnabled="EnableControl"/> 
     <command idMso="WindowNew" getEnabled="EnableControl"/> 
    </commands> 
    <ribbon startFromScratch="false"> 
     <tabs> 
      <tab idMso="TabView"> 
       <group idMso="GroupMasterViews" getVisible="VisibleGroup"/> 
       <group idMso="GroupPresentationViews" getVisible="VisibleGroup"/> 
      </tab> 
     </tabs> 
    </ribbon> 

Đây là callbacks VBA, được tạo ra từ việc áp dụng CustomUI Editor, sửa đổi theo yêu cầu của tôi.

Option Explicit 
Public TrapFlag As Boolean 
Public Rib As IRibbonUI 
Public xmlID As String 

Public Sub SetFlag() 
Dim mbResult As Integer 
    mbResult = MsgBox("Do you want to disable some controls on the Ribbon?", vbYesNo) 
    If mbResult = vbYes Then 
     TrapFlag = True 
    Else: 
     TrapFlag = False 
    End If 
End Sub 

'Callback for customUI.onLoad 
Sub RibbonOnLoad(ribbon As IRibbonUI) 
    'MsgBox "onLoad" 
    Set Rib = ribbon 
End Sub 

'I use this Callback for disabling some Controls: 
' ViewSlideSorterView 
' ViewNotesPageView 
' ViewSlideShowReadingView 
' ViewSlideMasterView 
' ViewHandoutMasterView 
' ViewNotesMasterView 
' WindowNew 
Sub EnableControl(control As IRibbonControl, ByRef returnedVal) 
    returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running. 
    'MsgBox ("GetEnabled for " & control.Id) 
    'Debug.Print control.Id & " enabled = " & CStr(returnedVal) 
    Call RefreshRibbon(control.Id) 
End Sub 

'I use this Callback for disabling/hiding some tab groups: 
' GroupMasterViews 
' GroupPresentationViews 
Sub VisibleGroup(control As IRibbonControl, ByRef returnedVal) 
    returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running. 
    'MsgBox "GetVisible for " & control.Id 
    'Debug.Print control.Id & " enabled = " & CStr(returnedVal) 
    Call RefreshRibbon(control.Id) 
End Sub 

Sub RefreshRibbon(Id As String) 
    xmlID = Id 
    'MsgBox "Refreshing ribbon for " & Id, vbInformation 
    If Rib Is Nothing Then 
     MsgBox "Error, Save/Restart your Presentation" 
    Else 
     Rib.Invalidate 
    End If 
End Sub 

Một số bất trắc

  • tôi vẫn không hoàn toàn chắc chắn những gì mã số Ron deBruin của không (here), hoặc cho dù đó là cần thiết. Tôi đã thực hiện một số thử nghiệm và tôi không thực sự chắc chắn rằng biến công khai xmlID là cần thiết trong trường hợp này. Ông ấy sử dụng bằng cách nào đó mà tôi không thể hiểu được.
  • Ngoài ra, tôi không thể sử dụng callback tương tự trên tab group như tôi sử dụng trên command trong XML, vì vậy tôi sử dụng thẻ getEnabled cho các lệnh, nhưng tôi phải sử dụng getVisible cho các nhóm. Các số này được liên kết với các hàm gọi lại EnableControlVisibleGroup tương ứng. Trong mọi trường hợp, VisibleGroup dường như là vô hiệu hóa các nhóm, vì vậy chức năng là như nhau.
  • Tôi cũng tin rằng thẻ getEnabled sẽ ngăn truy cập phím nóng và có lập trình cho các lệnh mà tôi vô hiệu hóa.
Các vấn đề liên quan