Powerpoint 插件制作日记-1
因為一個外包項目的需要,嘗試了在powerpoint上開發插件,算是一種學習精神,準備讓插件支持powerpoint 2003,2007,2010 三個版本
其實如果僅僅只做插件的話還是挺容易,但考慮到2007和2010使用的Ribbon UI以及2003的普通菜單式UI,所以決定做一個同時適應兩種UI的插件。
最終實現的效果如下:
Powerpoint 2003 (在工具菜單里面加入 菜單項,點擊菜單項后 顯示工具欄)
Powerpoint 2010(在Ribbon tab上添加新的tab, PPA, 然后在此tab里面添加新的按鈕)
實現過程如下:
打開vs2010新建項目->其他項目類型->擴展性->共享的外界程序 然后點擊確定
vs 將打開 共享外接程序向導界面,在向導中依次下一步,然后根據提示選擇以及填寫相關信息,在這里,我們選擇為Misrosoft Powerpoint(主機)創建項目。
完成后雙擊打開默認生成的Connect.cs文件
此類默認繼了?Object, Extensibility.IDTExtensibility2兩個對象,現在我們為其添加IRibbonExtensibility接口,并且實現接口
接下來在此類的OnConnection方法中處理普通界面的顯示(這里主要針對2003版)
var menubar = applicationObject.CommandBars["Menu Bar"];var toolsItem = menubar.Controls["工具(&T)"] as CommandBarPopup;if (toolsItem != null){myButton1 = toolsItem.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true) as CommandBarButton;myButton1.Caption = "打開窗口";myButton1.Visible = true;myButton1.Click += new _CommandBarButtonEvents_ClickEventHandler(myButton_Click);myButton2 = toolsItem.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true) as CommandBarButton;myButton2.Caption = "關閉窗口";myButton2.Visible = false;myButton2.Click += new _CommandBarButtonEvents_ClickEventHandler(myButton_Click);}以上代碼的主要作用是在工具菜單中添加兩個子項:關閉窗口,打開窗口,并且兩個按鈕的事件都綁定到myButton_Click上
void myButton_Click(CommandBarButton Ctrl, ref bool CancelDefault) {try{if (toolbar == null){try{toolbar = applicationObject.CommandBars["My_Toolbar"];}catch { }if (toolbar == null){toolbar = applicationObject.CommandBars.Add("My_Toolbar", 1, missing, true);var save = (CommandBarButton)toolbar.Controls.Add(1, missing, missing, missing, missing);save.Caption = "Save";save.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonIcon;save.Click += new _CommandBarButtonEvents_ClickEventHandler(save_Click);save.Picture = PictureHost.GettIPictureDispFromPicture(RES.android);//PictureHost是繼承自AxHost的一個類,主要作用是將Image對象轉換為IPictureDisp對象 }}if (toolbar.Visible){//toolbar.Delete();toolbar.Visible = false;myButton1.Visible = true;myButton2.Visible = false;}else{toolbar.Visible = true;myButton1.Visible = false;myButton2.Visible = true;}}catch (Exception e){MessageBox.Show(e.Message + "\n" + e.StackTrace);} }以上方法主要處理在點擊按鈕的時候對工具欄的操作(此處其實應該可以僅采用一個按鈕,但是不知為何我在測試的過程中發現,采用一個按鈕以上代碼不能多次執行,也就是說只能在第一次點擊的時候有效,之后點擊則無效,望高手解答)
通過以上的操作,我們的插件已經能實現在powerpoint 03上顯示菜單和工具欄了,接下來我們來完善對07,2010的支持
在實現IRibbonExtensibility接口的GetCustomUI方法中添加代碼,此方法是返回定義Ribbon UI的xml字符串,在這里,我將xml放到了資源文件中,因此,方法內容很簡單
public string GetCustomUI(string RibbonID) {return RES.Ribbon2; }Ribbon2的xml格式如下:
<?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"><ribbon><tabs><tab label="PPA" id="PPA"><group id="PPAGroup" label="PPA Group"><button label="btnA" showImage="true" id="btnA" onAction="button1_Click" /><button label="btnB" showImage="true" id="btnB" onAction="button2_Click" /></group></tab></tabs></ribbon> </customUI>其作用是添加新的名叫PPA的tab,并且在此tab中定義一個叫PPAGroup的group,此group中添加兩個按鈕btnA和btnB,分別關聯事件button1_Click,button2_Click
button1_Click?button2_Click的定義可以直接放到繼承自IRibbonExtensibility接口的類中,方法定義如下:
public void button1_Click(IRibbonControl control) {System.Windows.Forms.MessageBox.Show("hello"); }這樣,在powerpoint執行的時候就會自動解析xml,并且在觸發點擊事件的時候執行綁定的方法
?
后續:對于Ribbon UI xml的生成其實可以借助vs項目模板中的Office系列,這個項目模板是基于VSTO的,其實本來基于VSTO很容易開發office07,10的插件(截圖中的MyXmltab就是采用vsto的方法開發,此法需要在ThisAddIn.cs文件中添加一個如下的重寫來實現Robbin UI的加載
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() {return new Ribbon2(); })但無奈其不支持03,所以我們只能創建普通的外接程序了。
閑話:在做這些之前其實沒有任何頭緒,期間也google了很多資料,包括msdn的資料也查閱了,但直到完成后發現其實挺簡單的,感嘆微軟的工具真的很強大啊!
相關代碼下載
推薦一個博客,上面有很多vsto開發的文章:http://blog.csdn.net/v_jzho
總結
以上是生活随笔為你收集整理的Powerpoint 插件制作日记-1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps2021直装版|ps2021中文直装
- 下一篇: 影驰gtx960显卡怎么样_影驰gtx9