Powerpoint 插件制作日记-1

来源:互联网 发布:群ping软件 编辑:程序博客网 时间:2024/06/10 11:23

因为一个外包项目的需要,尝试了在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