转载

Ribbon界面的Office插件开发

此乃开博第一篇也。 Office 插件开发是一项古老的技术,似乎从 office2000 开始, Office 的插件体系就已经固定下来,后续版本也只是在不断完善和加入新功能。 Office 插件是在 COM 模型的基础上,实现了特定的接口,进而通过 COM 技术进行相互操作的一个 dll 文件。通过在相应的注册表位置进行注册,就可以被 Office 程序调用。

在继续本篇教程之前,先来介绍一下本次开发的基本环境:

开发工具: Delphi 7  企业版

系统环境: Win7 64 位系统 安装 WPS Office 2003SP3(9.1.0.4953)

基于 WPS V9 版的 API ,这个版本基本兼容  MS Office 2007 ,你也可以基于 MS Office API 接口,效果是一样的。本教程同时可用于 MS Office  和  WPS Office

Office 插件是一个实现了 IDTExtensibility2 接口的 COM 组件,在导入相应的类型库后就可以引用 AddInDesignerObjects_TLB.pas 的相关接口,它的声明如下:

Ribbon界面的Office插件开发

_IDTExtensibility2 = interface(IDispatch)   ['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']   procedure OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode;     const AddInInst: IDispatch; var custom: PSafeArray); safecall;   procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall;   procedure OnAddInsUpdate(var custom: PSafeArray); safecall;   procedure OnStartupComplete(var custom: PSafeArray); safecall;   procedure OnBeginShutdown(var custom: PSafeArray); safecall; end; 

在此不多做介绍,具体可参考 MSDN ,里面有详细的介绍。

Ribbon 界面是 Office2007 新增的界面,这个界面的插件开发,将界面设计与功能实现进行了分离,界面以 XML 文件进行定义,功能实现以回调函数的形式调用,与传统的工具栏和菜单形式的插件相比,开发效率要高的多,本教程要介绍的就是这一技术。

在实现 Ribbon 界面,在插件中除了要实现 IDTExtensibility2 接口外,还要实现 Ribbon 界面的专用接口 IRibbonExtensibility ,这个接口定义在 Office 的类型库中,声明如下:

IRibbonExtensibility = interface(IDispatch)     ['{000C0396-0000-0000-C000-000000000046}']     function GetCustomUI(const RibbonID: WideString): WideString; safecall;   end;

这个接口只有一个方法 GetCustomUI ,返回值为界面设计的 XML 文件内容。我们本次要实现的界面 XML 内容如下:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">  <ribbon startFromScratch="false">   <tabs>    <tab id="DemoTab" label="育林软件">     <group id="loadFormsGroup" label="测试分组">      <button id="btn1" label="测试功能" onAction="OnAction" getImage="GetImage"/>      <button id="btn2" label="关于我们" onAction="OnAction" getImage="GetImage"/>     </group>    </tab>   </tabs>  </ribbon> </customUI> 

关于 XML 的定义规则请参考 MSDN ,上面有详细介绍。 OnAction 是回调函数,用于响应按钮点击, GetImage 用于返回按钮的图片。

我们的 COM 对象定义如下:

type TTestRibbon = class(TAutoObject, IDTExtensibility2, IRibbonExtensibility, ITestRibbon) private  protected   {实现IRibbonExtensibility接口}   function GetCustomUI(const RibbonID: WideString): WideString; safecall;   {实现IDTExtensibility2接口}   procedure OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode;     const AddInInst: IDispatch; var custom: PSafeArray); safecall;   procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall;   procedure OnAddInsUpdate(var custom: PSafeArray); safecall;   procedure OnStartupComplete(var custom: PSafeArray); safecall;   procedure OnBeginShutdown(var custom: PSafeArray); safecall;   {实现ITestRibbon接口,这两个方法就是我们要用的回调函数}   procedure OnAction(const ctrl: IDispatch); safecall;   function GetImage(const ctrl: IDispatch): IDispatch; safecall; public  end; 

ITestRibbon 是我们 com 对象定义的接口,它有两个方法 OnAction GetImage ,如果 XML 中定义的控件较多,我们需要添加的回调函数就越多,每种控件的回调函数都是大同小异,我们实现的就是针对普通按钮的回调函数,需要在 delphi 的类型库编辑器中添加,如下图。

Ribbon界面的Office插件开发

OnAction 你也可以定义为其它名称,只要参数类型相同,什么名字都可以,但要注意名称一定要跟 XML 中定义的一样,也就是说你这里定义的什么名字, XML 文件中 onActon 后面也要用什么名字。类型库导入完成,接口定义完成就开始实现部分了,这才是重点。说实话,在接口定义部分我也走了不少弯路,研究了几个晚上才搞明白,网上基于 .net 的相关内容不少,但参考性不强, .net com 的实现进行了封装,开发者不用关心定义,只要写代码就可以了,但 delphi 要做的工作还有很多。虽然麻烦,但好处还是有的, .net 开发的插件要附带很多文件, delphi 开发的插件只要发布一个 dll 就可以了。

下面我们来看实现部分,先看 GetCustomUI

function TTestRibbon.GetCustomUI(const RibbonID: WideString): WideString; var Str:TStrings; begin   Str:=TStringList.Create;   Str.LoadFromFile('C:/CustomUI.xml');   Result := Str.Text;   Str.Free; end;

这里我们选择从文件载入 XML 数据,主要是为了后期修改与调试方便,等到发布的时候,完全可以将 XML 文件加入进资源文件,从资源中载入。

到这里,如果我们编译后安装插件,就可以在 Office 中显示我们的按钮了,但由于没有实现 OnAction ,所以点击按钮是没有任何反应的,下面我们来实现 OnAction 回调函数。它的定义如下:

procedure OnAction(const ctrl: IDispatch); safecall;

根据微软的定义, ctrl 是一个 IRibbonControl 接口的参数,这个接口定义在 Office 的通用类型库中,这个参数是我们判断到底是哪个按钮调用了这个函数的基础,就是依据 IRibbonControl ID 属性,这个 ID 就是 XML 中定义的 Id ,我们的实现如下:

procedure TTestRibbon.OnAction(const ctrl: IDispatch); begin   if (ctrl as IRibbonControl).Id = 'btn1' then     MessageBox(0, '您点击了按“测试功能”!', '提示', MB_OK + MB_ICONINFORMATION)   else     MessageBox(0, '您点击了按钮“关于我们”!', '提示', MB_OK + MB_ICONINFORMATION); end;

到此一个简单的插件就已经完成了,下面说一下插件安装。

将以下内容保存为注册表文件 .reg ,并双击导入注册表。

Windows Registry Editor Version 5.00  [HKEY_CURRENT_USER/Software/Microsoft/Office/Word/Addins/Yulinsoft.TestRibbon] "FriendlyName"="测试Ribbon插件" "Description"="测试插件" "LoadBehavior"=dword:00000003 "CommandLineSafe"=dword:00000001  [HKEY_CURRENT_USER/Software/Kingsoft/Office/WPS/AddinsWL] "Yulinsoft.TestRibbon"=""

然后再用命令行 regsvr32 注册我们的 dll ,注意文件路径正确,注册成功后打开 Word2007 WPS ,就可以看到我们的按钮了,如下图:

Ribbon界面的Office插件开发

Ribbon界面的Office插件开发

本文参考内容如下:

http://gregmaxey.mvps.org/word_tip_pages/customize_ribbon_main.html

Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)

Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)

Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)

初来贵地交流技术,如有不对之处,欢迎大家批评指证。下节我们将讲解如何给按钮添加图像!

正文到此结束
Loading...