您的位置:首页 > 其它

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版)

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: