2013-07-15 15 views
5

Sto sviluppando un componente aggiuntivo di PowerPoint e desidero disattivare temporaneamente alcuni controlli della barra multifunzione mentre l'applicazione aggiuntiva è in esecuzione.Personalizzazione della barra di PowerPoint in fase di esecuzione

ho sviluppato una soluzione che funziona come previsto quando il componente aggiuntivo è abilitato , ma questo in realtà non è adeguata, perché disabilita alcuni controlli comunemente utilizzati, come SlideMaster, SlideSorter, ecc

I sto usando PowerPoint 2010.

Ecco un XML di esempio che è ben formato:

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

Ecco un callback di esempio, tratto da 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 

Se navigando al nastro View, un avviso mi informa che:

La macro non può essere trovato o è stato disattivato a causa delle impostazioni di sicurezza.

Presumibilmente questo si riferisce al GetVisible macro? Le mie impostazioni macro sono:

  • Attiva tutte le macro (non raccomandato)
  • attendibile l'accesso al VBA progetto oggetto del modello

ho lottato con quello che ho trovato finora, ma finora non implementare suggerimenti. La maggior parte delle risposte sono specifiche per Excel. Non ho davvero trovato nulla di specifico per PowerPoint, ma ho pensato che non dovrebbe essere terribilmente difficile portare il codice da un'applicazione a un'altra, come ho fatto per molte altre cose in VBA.

Ho anche provato this metodo, ma il SetCustomUI non è disponibile in PowerPoint a livello Application o Presentation, forse è unico o applicabile solo a Visual Studio?

risposta

3

Dopo un po 'di errore di prova &, credo di avere una soluzione funzionale, anche se ci sono alcune cose di cui non sono certo e che descriverò di seguito.

Ho testato questo in un file PPTM con una subroutine per controllare il TrapFlag variabile pubblica, che determina se nascondere/disabilitare alcuni controlli. Ho anche provato questo in una PPAM dove questo flag è impostato all'avvio dell'applicazione, non quando viene caricato il componente aggiuntivo.

Questo mi consente di manipolare RibbonUI in fase di esecuzione.

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

Ecco i callback VBA, generati dall'applicazione customUI Editor, modificati secondo le mie esigenze.

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 

Alcune incertezze

  • io non sono ancora del tutto sicuro di quello che il codice di un po 'di Ron DeBruin fa (here), o se è necessario. Ho fatto alcuni test e non sono proprio sicuro che la variabile pubblica xmlID sia necessaria in questo caso. Lo usa in qualche modo che non riesco a capire.
  • Inoltre, io non sono in grado di utilizzare la stessa richiamata sulla scheda group come ho uso sul command in XML, in modo da utilizzare il tag getEnabled per i comandi, ma devo usare getVisible per i gruppi. Questi sono collegati alle funzioni di callback EnableControl e VisibleGroup, rispettivamente. In ogni caso, VisibleGroup sembra disabilitare i gruppi, in modo funzionale è lo stesso.
  • Credo anche che il tag getEnabled impedisca l'accesso programmatico e hotkey a quei comandi che disabilito.
Problemi correlati