在运行时自定义PowerPoint功能区

7 浏览
0 Comments

在运行时自定义PowerPoint功能区

我正在开发一个 PowerPoint 加载项,希望在加载项应用程序运行时暂时禁用一些功能区控件。

我已经开发了一个解决方案,当加载项启用时按预期工作,但这并不完全符合要求,因为它禁用了一些常用的控件,如幻灯片母版、幻灯片排序等。

我正在使用 PowerPoint 2010。

以下是一个格式良好的示例 XML:


    
        
            
                
            
        
    

以下是一个示例回调,取自这个 SO 回答

Sub GetVisible(control As IRibbonControl, ByRef returnedVal As Boolean)
    If TrapFlag Then
        returnedVal = False ' 控件被隐藏
    Else:
        returnedVal = True  ' 控件未被隐藏
    End If
End Sub

当我导航到“视图”功能区时,弹出窗口提示:

由于您的安全设置,找不到宏或已禁用宏。

这可能是指的是“GetVisible”宏?我的宏设置为:

  • 启用所有宏(不推荐)
  • 信任对 VBA 项目对象模型的访问

到目前为止,我一直在努力尝试已经找到的方法,但还没有能够实施建议。大多数答案都是针对 Excel 的。我没有真正找到任何特定于 PowerPoint 的东西,但我认为从一个应用程序移植代码到另一个应用程序不应该太困难,因为我在 VBA 中已经为许多其他事情做过这样的事情。

我还尝试了这个方法,但在 PowerPoint 的 ApplicationPresentation 级别上没有可用的 SetCustomUI,也许它是独特的或仅适用于 Visual Studio?

0
0 Comments

在运行时自定义PowerPoint功能区的问题是如何出现的以及解决方法是什么?

问题的出现原因:

作者试了很多次之后,相信已经找到了一个功能正常的解决方案,虽然还有一些不确定的地方需要进一步描述。作者在一个PPTM文件中进行了测试,该文件包含一个控制公共变量TrapFlag的子程序,该变量确定是否隐藏/禁用某些控件。作者还在PPAM中进行了测试,在应用程序启动时设置该标志,而不是在加载加载项时设置。

解决方法:

作者通过以下 XML 实现了在运行时操作 RibbonUI 的功能:



  
    
    
    
    
    
    
    
  
  
    
      
        
        
      
    
  

以下是根据作者要求修改的来自 CustomUI Editor 应用程序生成的 VBA 回调函数:

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

一些不确定的地方:

- 我仍然不完全确定 Ron deBruin 的代码(这里)的作用,或者是否有必要。我进行了一些测试,我不确定在这种情况下是否真的需要公共变量 xmlID。他以某种我无法理解的方式使用它。

- 我无法在 XML 中使用与我在命令上使用的相同回调函数来处理选项卡组,所以我对命令使用了 getEnabled 标签,但我必须对组使用 getVisible 标签。无论如何,VisibleGroup 似乎会禁用组,所以在功能上它是相同的。

- 我还相信 getEnabled 标签将阻止对我禁用的命令的热键和编程访问。

0