程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Ribbon界面的Office插件開發,ribbonoffice插件

Ribbon界面的Office插件開發,ribbonoffice插件

編輯:Delphi

Ribbon界面的Office插件開發,ribbonoffice插件


      此乃開博第一篇也。Office插件開發是一項古老的技術,似乎從office2000開始,Office的插件體系就已經固定下來,後續版本也只是在不斷完善和加入新功能。Office插件是在COM模型的基礎上,實現了特定的接口,進而通過COM技術進行相互操作的一個dll文件。通過在相應的注冊表位置進行注冊,就可以被Office程序調用。

在繼續本篇教程之前,先來介紹一下本次開發的基本環境:

開發工具:Delphi 7 企業版

系統環境: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文件進行定義,功能實現以回調函數的形式調用,與傳統的工具欄和菜單形式的插件相比,開發效率要高的多,本教程要介紹的就是這一技術。

在實現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的類型庫編輯器中添加,如下圖。

 

     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)

初來貴地交流技術,如有不對之處,歡迎大家批評指證。下節我們將講解如何給按鈕添加圖像!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved