Customizing the PowerPoint Ribbon at Run-Time

匿名 (未验证) 提交于 2019-12-03 02:03:01

问题:

I am developing a PowerPoint add-in and would like to temporarily disable some of the Ribbon controls while the add-in application is running.

I have developed a solution that works as expected when the Add-In is enabled, but this is not really adequate, because it disables some commonly used controls, like SlideMaster, SlideSorter, etc.

I am using PowerPoint 2010.

Here is a sample XML which is well-formed:

Here is a sample callback, taken from 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 

When I navigate to the View ribbon, an alert informs me that:

The macro cannot be found or has been disabled because of your security settings.

Presumably this is referring to the GetVisible macro? My macro settings are:

  • Enable all macros (not recommended)
  • Trust access to the VBA project object model

I have been struggling with what I have found so far but so far unable to implement suggestions. Most answers are specific to Excel. I have not really found anything specific to PowerPoint, but figured it should not be terribly difficult to port code from one application to another, as I have done this for many other things in VBA.

I have also tried this method, but the SetCustomUI is not available in PowerPoint at the Application or Presentation level, perhaps it is unique or only applicable to Visual Studio?

回答1:

After quite a bit of trial & error, I believe I have a functional solution, although there are some things I am not certain about which I will describe below.

I have tested this in a PPTM file with a subroutine to control the public TrapFlag variable, which determines whether to hide/disable certain controls. I have also tested this in a PPAM where this flag is set when the application launches, not when the Add-In is loaded.

This allows me to manipulate the RibbonUI at runtime.

Here is the XML:

`    

Here is the VBA callbacks, generated from the CustomUI Editor application, modified as per my requirements.

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 

Some uncertainties

  • I am still not entirely sure what some Ron deBruin's code does (here), or whether it is necessary. I have done some testing and I do not really sure that the public variable xmlID is necessary in this case. He uses that somehow which I cannot understand.
  • Also, I am not able to use the same callback on the tab group as I use on the command in the XML, so I use the tag getEnabled for the commands, but I have to use getVisible for the groups. These are tied to the callback functions EnableControl and VisibleGroup, respectively. In any case, VisibleGroup seems to disable the groups, so functionally it is the same.
  • I also believe that the getEnabled tag will prevent hotkey and programmatic access to those commands that I disable.


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!