2013-07-15 1 views
5

Я разрабатываю надстройку PowerPoint и хочу временно отключить некоторые элементы управления лентой, в то время как приложение надстройки - работает.Настройка ленты PowerPoint во время выполнения

Я разработал решение, которое работает, как ожидалось, когда надстройка включена, но это не совсем адекватной, поскольку он отключает некоторые часто используемые элементы управления, как SlideMaster, SlideSorter и т.д.

I я использую PowerPoint 2010.

Вот пример XML, который хорошо образован:

<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> 

Вот пример обратного вызова, взятый из 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 

Когда я перейти к View ленты, предупреждение сообщает мне, что:

Макрос не может быть найден или был отключен из-за настроек безопасности.

Предположительно это относится к макросу GetVisible? Мои макро настройки:

  • Включить все макросы (не рекомендуется)
  • Trust доступа к объекту проекта модели VBA

Я изо всех сил с тем, что я нашел до сих пор, но до сих пор не удалось для реализации предложений. Большинство ответов относятся к Excel. Я действительно не нашел ничего особенного для PowerPoint, но решил, что не должно быть ужасно сложно переносить код из одного приложения в другое, поскольку я сделал это для многих других вещей в VBA.

Я также попытался this метод, но SetCustomUI не доступен в PowerPoint на Application или Presentation уровне, возможно, он является уникальным или только к Visual Studio?

ответ

3

После некоторого испытания & ошибка, я считаю, что у меня есть функциональное решение, хотя есть некоторые вещи, о которых я не уверен, о которых я расскажу ниже.

Я проверил это в файле PPTM с подпрограммой для управления переменной TrapFlag, которая определяет, следует ли скрывать/отключать определенные элементы управления. Я также проверил это в PPAM, где этот флаг установлен, когда приложение запускает, не при загрузке надстройки.

Это позволяет мне управлять RibbonUI во время выполнения.

Вот 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> 

Вот обратные вызовы VBA, сгенерированные из приложения CustomUI Editor, модифицированные в соответствии с моими требованиями.

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 

Некоторые неопределенности

  • Я до сих пор не совсем уверен, что код некоторых Рона deBruin в делает (here), или является ли это необходимым. Я провел некоторое тестирование, и я не уверен, что в этом случае необходима публичная переменная xmlID. Он использует это как-то, чего я не понимаю.
  • Кроме того, я не в состоянии использовать ту же функцию обратного вызова на вкладке group как я использовать на command в XML, поэтому я использую тег getEnabled для команд, но я должен использовать getVisible для групп. Эти привязаны к функциям обратного вызова EnableControl и VisibleGroup, соответственно. В любом случае VisibleGroup, как представляется, отключить группы, поэтому функционально это одно и то же.
  • Я также считаю, что тег getEnabled будет препятствовать горячей клавише и программному доступу к тем командам, которые я отключил.