此乃开博第一篇也。Office插件开发是一项古老的技术,彷佛从office2000开始,Office的插件体系就已经固定下来,后续版本也只是在不断完善和加入新功能。Office插件是在COM模型的基础上,实现了特定的接口,进而经过COM技术进行相互操做的一个dll文件。经过在相应的注册表位置进行注册,就能够被Office程序调用。html
在继续本篇教程以前,先来介绍一下本次开发的基本环境:编辑器
开发工具:Delphi 7 企业版ide
系统环境:Win7 64位系统 安装WPS Office 2013SP3(9.1.0.4953)函数
基于WPS V9版的API,这个版本基本兼容 MS Office 2007,你也能够基于MS Office的API接口,效果是同样的。本教程同时可用于MS Office 和 WPS Office。工具
Office插件是一个实现了IDTExtensibility2接口的COM组件,在导入相应的类型库后就能够引用AddInDesignerObjects_TLB.pas的相关接口,它的声明以下:开发工具
_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文件进行定义,功能实现以回调函数的形式调用,与传统的工具栏和菜单形式的插件相比,开发效率要高的多,本教程要介绍的就是这一技术。ui
在实现Ribbon界面,在插件中除了要实现IDTExtensibility2接口外,还要实现Ribbon界面的专用接口IRibbonExtensibility,这个接口定义在Office的类型库中,声明以下:spa
IRibbonExtensibility = interface(IDispatch) ['{000C0396-0000-0000-C000-000000000046}'] function GetCustomUI(const RibbonID: WideString): WideString; safecall; end;
这个接口只有一个方法GetCustomUI,返回值为界面设计的XML文件内容。咱们本次要实现的界面XML内容以下:.net
<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的类型库编辑器中添加,以下图。
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,就能够看到咱们的按钮了,以下图:
【原创文章,转载请注明出处】
本教程所有代码与资源文件下载:
http://pan.baidu.com/s/1eQrSOSE
本文参考内容以下:
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)
初来贵地交流技术,若有不对之处,欢迎你们批评指证。下节咱们将讲解如何给按钮添加图像!