Powerpoint 插件制作日记-1
2013-04-03 15:37
197 查看
因为一个外包项目的需要,尝试了在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版)
以上代码的主要作用是在工具菜单中添加两个子项:关闭窗口,打开窗口,并且两个按钮的事件都绑定到myButton_Click上
以上方法主要处理在点击按钮的时候对工具栏的操作(此处其实应该可以仅采用一个按钮,但是不知为何我在测试的过程中发现,采用一个按钮以上代码不能多次执行,也就是说只能在第一次点击的时候有效,之后点击则无效,望高手解答)
通过以上的操作,我们的插件已经能实现在powerpoint 03上显示菜单和工具栏了,接下来我们来完善对07,2010的支持
在实现IRibbonExtensibility接口的GetCustomUI方法中添加代码,此方法是返回定义Ribbon UI的xml字符串,在这里,我将xml放到了资源文件中,因此,方法内容很简单
Ribbon2的xml格式如下:
其作用是添加新的名叫PPA的tab,并且在此tab中定义一个叫PPAGroup的group,此group中添加两个按钮btnA和btnB,分别关联事件button1_Click,button2_Click
button1_Click button2_Click的定义可以直接放到继承自IRibbonExtensibility接口的类中,方法定义如下:
这样,在powerpoint执行的时候就会自动解析xml,并且在触发点击事件的时候执行绑定的方法
后续:对于Ribbon UI xml的生成其实可以借助vs项目模板中的Office系列,这个项目模板是基于VSTO的,其实本来基于VSTO很容易开发office07,10的插件(截图中的MyXmltab就是采用vsto的方法开发,此法需要在ThisAddIn.cs文件中添加一个如下的重写来实现Robbin UI的加载
)但无奈其不支持03,所以我们只能创建普通的外接程序了。
闲话:在做这些之前其实没有任何头绪,期间也google了很多资料,包括msdn的资料也查阅了,但直到完成后发现其实挺简单的,感叹微软的工具真的很强大啊!
相关代码下载
推荐一个博客,上面有很多vsto开发的文章:http://blog.csdn.net/v_jzho
其实如果仅仅只做插件的话还是挺容易,但考虑到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
相关文章推荐
- 使用vsto制作的outlook插件,安装加载失败
- 【Android日记】Android Studio插件
- 40款非常棒的jQuery 插件和制作教程(系列一)
- 【TomoEngine】 第十一讲 【MOBA制作日记六】 字体渲染
- jQuery制作Mac Lion OS滚动条效果插件
- UE4 读取XML插件制作
- Jquery制作的页码插件
- 怎样为你的Windows Live Writer制作一个简单的插件
- <Unity3D>NGUI插件中Atlas和Font的制作
- PowerPoint插件出问题的解决方法
- [封装插件]使用Jquery制作一个标签页的效果
- 制作AppCan插件的那些坑
- npm插件制作及发布基础教程
- DELPHI的美化插件VCLskin5.6下载(支持DELPHI2010,含233种皮肤和皮肤制作.
- jquery傻瓜基础教程之教你如何制作简单的dialog插件
- 用jQuery旋转插件jqueryrotate制作转盘抽奖
- Unity3D 制作场景地图 插件
- 学PowerPoint模板技巧 提高制作效率
- 网页制作辅助工具-jQuery标尺参考线插件
- Jquery制作让HTML元素具有输入框功能的插件