2013-07-15 9 views
5

पर पावरपॉइंट रिबन को कस्टमाइज़ करना मैं पावरपॉइंट ऐड-इन विकसित कर रहा हूं और कुछ रिबन नियंत्रण अस्थायी रूप से अक्षम करना चाहता हूं, जबकि ऐड-इन एप्लिकेशन चल रहा है।रन-टाइम

मैं एक समाधान के रूप में की उम्मीद जब ऐड-में सक्षम है काम करता है कि विकसित किया है, लेकिन यह वास्तव में पर्याप्त है क्योंकि यह कुछ अधिक इस्तेमाल किया नियंत्रण अक्षम कर देता है, SlideMaster, SlideSorter की तरह नहीं है, आदि

मैं

<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 से लिया: PowerPoint 2010

यहाँ उपयोग कर रहा हूँ एक नमूना एक्सएमएल जो अच्छी तरह से बना है

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 मैक्रो का जिक्र कर रहा है? मेरे मैक्रो सेटिंग्स हैं:

  • सभी मैक्रो (नहीं अनुशंसित)
  • ट्रस्ट VBA प्रोजेक्ट ऑब्जेक्ट मॉडल

मुझे लगता है मैं अब तक, लेकिन अभी तक असमर्थ क्या पाया है के साथ संघर्ष कर दिया गया है के लिए पहुंच सक्षम सुझावों को लागू करने के लिए। अधिकांश उत्तर एक्सेल के लिए विशिष्ट हैं। मुझे वास्तव में पावरपॉइंट के लिए विशिष्ट कुछ भी नहीं मिला है, लेकिन यह पता लगाया गया है कि यह एक आवेदन से दूसरे एप्लिकेशन में बंदरगाह कोड के लिए बहुत मुश्किल नहीं होना चाहिए, क्योंकि मैंने इसे वीबीए में कई अन्य चीजों के लिए किया है।

मैं भी this विधि की कोशिश की है, लेकिन SetCustomUI नहीं, Application या Presentation स्तर पर PowerPoint में उपलब्ध है शायद यह अद्वितीय या दृश्य स्टूडियो के लिए एक ही लागू होता है?

उत्तर

3

बहुत कम परीक्षण के बाद & त्रुटि, मेरा मानना ​​है कि मेरे पास एक कार्यात्मक समाधान है, हालांकि कुछ चीजें हैं जिनके बारे में मैं निश्चित नहीं हूं जिसके बारे में मैं नीचे वर्णन करूंगा।

मैंने इसे पीपीटीएम फ़ाइल में सार्वजनिक TrapFlag परिवर्तनीय को नियंत्रित करने के लिए एक सबराउटिन के साथ परीक्षण किया है, जो निर्धारित करता है कि कुछ नियंत्रण छुपाएं/अक्षम करें या नहीं। मैंने इसे पीपीएएम में भी परीक्षण किया है जहां एप्लिकेशन लॉन्च होने पर यह ध्वज सेट किया गया है, जब ऐड-इन लोड होता है।

यह मैं रनटाइम पर RibbonUI हेरफेर करने के लिए अनुमति देता है।

<?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 संपादक एप्लिकेशन से जेनरेट, मेरे आवश्यकताओं के अनुसार संशोधित है:

यहाँ एक्सएमएल है।

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 के रूप में मैं XML में command पर उपयोग पर एक ही कॉलबैक का उपयोग करने में सक्षम नहीं हूँ, इसलिए मैं आदेश के लिए टैग getEnabled उपयोग करते हैं, लेकिन मुझे लगता है समूहों के लिए getVisible उपयोग करना होगा। ये क्रमशः कॉलबैक फ़ंक्शंस EnableControl और VisibleGroup से बंधे हैं। किसी भी मामले में, VisibleGroup समूह को अक्षम करता है, इसलिए कार्यात्मक रूप से यह वही है।
  • मुझे यह भी विश्वास है कि getEnabled टैग उन आदेशों को हॉटकी और प्रोग्रामेटिक पहुंच को रोक देगा जो मैं अक्षम करता हूं।