用Delphi開(kāi)發(fā)Wps Office 插件一二_第1頁(yè)
用Delphi開(kāi)發(fā)Wps Office 插件一二_第2頁(yè)
用Delphi開(kāi)發(fā)Wps Office 插件一二_第3頁(yè)
用Delphi開(kāi)發(fā)Wps Office 插件一二_第4頁(yè)
用Delphi開(kāi)發(fā)Wps Office 插件一二_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 用Delphi開(kāi)發(fā)Wps Office 插件(一)一、開(kāi)發(fā)前的準(zhǔn)備工作本文的開(kāi)發(fā)環(huán)境是基于delphi 7.0 和WPS OFFICE 2009個(gè)人版。開(kāi)發(fā)前要先做好以下準(zhǔn)備工作。先導(dǎo)入相關(guān)的COM庫(kù)。打開(kāi)delphi ,點(diǎn)擊菜單"Project"-"Import Type Library.",在彈出的對(duì)話框中選擇相應(yīng)的類型庫(kù)(如下圖)。以上五個(gè)類型庫(kù)都要導(dǎo)入,由于每次只能導(dǎo)入一個(gè),所以要分五次導(dǎo)入?!癒ingsoft Add-In Designer”是Add-In插件COM接口對(duì)象?!癒ingsoft Office 1.0 Object Librar

2、y”是Wps Office 公用對(duì)象庫(kù)COM接口?!癒ingsoft WPS 2.0 Object Library”是WPS文字的COM接口?!癒ingsoft ET 2.0 Object Library”是WPS表格的COM接口?!癒ingsoft WPP 2.0 Object Library”是WPS演示的COM接口。二、創(chuàng)建插件框架創(chuàng)建插件COM 對(duì)象WPS Office的插件由一個(gè)實(shí)現(xiàn)了特定接口的DLL、一個(gè)XML配置文件以及插件本身需要的其他文件組成。WPS Office 插件DLL實(shí)際上是一個(gè)實(shí)現(xiàn)了_IDTExtensibility2接口的COM組件,這個(gè)接口就在我們剛才導(dǎo)入的“K

3、ingsoft Add-In Designer”對(duì)象中。我們只用創(chuàng)建一個(gè)COM對(duì)象來(lái)實(shí)現(xiàn)這個(gè)接口,就可以繼續(xù)我們的開(kāi)發(fā)了。打開(kāi)delphi 7.0 ,新建一個(gè)“ActiveX Library”,保存為“SimpleLib.dpr”。再新建一個(gè)“Automation Object”,CoClass Name輸入我們要?jiǎng)?chuàng)建的類名“SimpleAddin”,然后點(diǎn)擊OK按鈕。把彈出的類型庫(kù)編輯器關(guān)閉,將unit1保存為“untSimple.pas”,此時(shí)單元代碼如下:unit untSimple; $WARN SYMBOL_PLATFORM OFF interface uses ComObj, Ac

4、tiveX, SimpleLib_TLB, StdVcl; type TSimpleAddin = class(TAutoObject, ISimpleAddin) protected end; implementation uses ComServ; initialization TAutoObjectFactory.Create(ComServer,TSimpleAddin, Class_SimpleAddin, ciMultiInstance, tmApartment); end. 這是我們創(chuàng)建的com對(duì)象源碼,它目前還沒(méi)有實(shí)現(xiàn)相關(guān)的接口。下面我們要添加要使用的單元和要實(shí)現(xiàn)我接口。將光標(biāo)

5、定位到uses區(qū)段,在后面添加三個(gè)單元的引用,分別是“AddInDesignerObjects_TLB”、“KSO_TLB”、“WPS_TLB”,然后添加接口的實(shí)現(xiàn)。 TSimpleAddin = class(TAutoObject, ISimpleAddin, _IDTExtensibility, ICommandBarButtonEvents) protected 實(shí)現(xiàn)_IDTExtensibility2 procedure OnAddInsUpdate(var custom: PSafeArray); safecall; procedure OnBeginShutdown(var cus

6、tom: PSafeArray); safecall; procedure OnConnection(const app: IDispatch; ConnectMode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall; procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall; procedure OnStartupComplete(var custom: P

7、SafeArray); safecall; 實(shí)現(xiàn)ICommandBarButtonEvents procedure Click(const Ctrl: CommandBarButton; var CancelDefault:WordBool); stdcall; end; 由于我們要響應(yīng)工具欄按鈕的單擊事件,所以同時(shí)添加了ICommandBarButtonEvents接口的實(shí)現(xiàn)?,F(xiàn)在應(yīng)該說(shuō)一個(gè)插件的框架已經(jīng)完成了,具體實(shí)現(xiàn)怎樣的功能,就看我們自己的實(shí)現(xiàn)了。3、 實(shí)現(xiàn)我們的功能 由于是一個(gè)示例插件,所以我們要實(shí)現(xiàn)的功能很簡(jiǎn)單,就是在標(biāo)準(zhǔn)工具欄上添加兩個(gè)按鈕,點(diǎn)擊不同的按鈕彈出不同的信息。在具體實(shí)

8、現(xiàn)之前,我們先了解一下插件接口_IDTExtensibility2,它的聲明如下: _IDTExtensibility2 = interface(IDispatch) 'B65AD801-ABAF-11D0-BB8B-00A0C90F2744' procedure OnConnection(const Application: IDispatch; ConnectMode:ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall; procedure OnDisconnectio

9、n(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; 插件安裝時(shí),WPS Office會(huì)將插件DLL注冊(cè)(DllRegisterServe

10、r)到系統(tǒng)中。WPS Office啟動(dòng)時(shí),將通過(guò)插件平臺(tái)(管理插件的模塊)加載插件。插件平臺(tái)通過(guò)COM方式創(chuàng)建一個(gè)_IDTExtensibility2對(duì)象,然后調(diào)用_IDTExtensibility2.OnConnection。插件可以在OnConnection中做一些初始化操作,如添加菜單項(xiàng)、工具欄按鈕等。OnConnection之后,OnStartupComplete將被調(diào)用,至此插件加載完成。WPS關(guān)閉時(shí),插件平臺(tái)先后調(diào)用OnBeginShutdown和OnDisconnection。目前,WPS Office插件平臺(tái)不會(huì)調(diào)用插件的_IDTExtensibility2.OnAddInsU

11、pdate方法。插件實(shí)現(xiàn)一個(gè)空的OnAddInsUpdate就可以了,即直接返回S_OK,應(yīng)避免在其中編寫其他代碼,以免將來(lái)引起兼容問(wèn)題。下面是對(duì)五個(gè)方法的詳述(來(lái)自KingSoft官方文檔,翻譯成了delphi版):1.1. _IDTExtensibility2.OnConnection procedure OnConnection(const Application: IDispatch; ConnectMode:ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall;OnConnecti

12、on方法一共帶有4個(gè)參數(shù)。第一個(gè)參數(shù)Application是宿主程序?qū)ο?;第二個(gè)參數(shù)是ext_ConnectMode類型的枚舉值;第三個(gè)和第四個(gè)參數(shù)目前沒(méi)有使用,插件實(shí)現(xiàn)OnConnection時(shí)必須忽略這兩個(gè)參數(shù)。ext_ConnectMode定義了4個(gè)常量值,如下所示。 type ext_ConnectMode = TOleEnum; const ext_cm_AfterStartup = $00000000; ext_cm_Startup = $00000001; ext_cm_External = $00000002; ext_cm_CommandLine = $00000003; 其

13、中,ext_cm_Startup和ext_cm_AfterStartup是插件平臺(tái)加載COM插件時(shí)傳入OnConnection的。ext_cm_External和ext_cm_CommandLine目前沒(méi)有用到。a. ext_cm_StartupWPS啟動(dòng)時(shí),插件平臺(tái)會(huì)立即加載COM插件,調(diào)用OnConnection(Application, ext_cm_Startup)。b. ext_cm_AfterStartup用于安裝插件過(guò)程。安裝插件時(shí),WPS Office插件平臺(tái)會(huì)加載插件,并調(diào)用OnConnection(Application, ext_cm_AfterStartup),此時(shí)插件

14、要做兩件事情,即安裝后的初始化以及加載初始化。如果插件安裝以后不需要進(jìn)一步的配置等初始化工作,那么對(duì)這個(gè)插件而言,不需要區(qū)分ext_cm_AfterStartup和ext_cm_Startup。一般情況下,插件會(huì)在OnConnection中添加菜單項(xiàng)或者工具欄按鈕等功能入口。在WPS Office添加的菜單項(xiàng)或者工具欄按鈕,分為“臨時(shí)”和“持久”兩種類型。顧名思義,帶有“臨時(shí)”屬性的菜單項(xiàng)或工具欄按鈕,在WPS Office重新啟動(dòng)以后就不存在了;帶有“持久”屬性的菜單項(xiàng)或工具欄按鈕,在WPS Office重新啟動(dòng)以后,仍然存在。插件添加菜單項(xiàng)和工具欄按鈕時(shí),推薦使用“臨時(shí)”的菜單項(xiàng)和工具欄按

15、鈕,在宿主程序關(guān)閉時(shí),插件也不要調(diào)用API刪除菜單或工具欄按鈕。插件添加菜單項(xiàng)或工具欄按鈕時(shí),建議先檢查這些菜單或按鈕是否已經(jīng)存在,以免重復(fù)添加。1.2. _IDTExtensibility2.OnStartupComplete插件平臺(tái)加載插件過(guò)程中,會(huì)先后調(diào)用OnConnection和OnStartupComplete。如果插件需要在插件啟動(dòng)以后(OnConnection執(zhí)行完之后)做一些事情,可以將這些工作放到OnStartupComplete中執(zhí)行。大多數(shù)情況下,插件可以實(shí)現(xiàn)一個(gè)空的OnStartupComplete即可。1.3. _IDTExtensibility2.OnBeginSh

16、utdownWPS Office關(guān)閉過(guò)程中,插件平臺(tái)會(huì)調(diào)用OnBeginShutdown,通知插件做清理工作,如保存配置、終止未完成的工作、釋放系統(tǒng)資源等。OnBeginShutdown在OnDisconnection之前被調(diào)用。1.4. _IDTExtensibility2.OnDisconnectionOnDisconnection和OnConnection相對(duì)應(yīng),插件在OnConnection中添加菜單或工具欄命令、注冊(cè)事件通知,OnDisconnection則注銷事件通知。 procedure OnDisconnection(RemoveMode: ext_DisconnectMode

17、; var custom: PSafeArray); safecall; OnDisconnection帶RemoveMode和custom兩個(gè)參數(shù)。其中custom參數(shù)目前沒(méi)有用到,插件忽略這個(gè)參數(shù)即可;第一個(gè)參數(shù)RemoveMode是ext_DisconnectMode類型的枚舉值,如下所示: type ext_DisconnectMode = TOleEnum; const ext_dm_HostShutdown = $00000000; ext_dm_UserClosed = $00000001; 目前只用到了ext_dm_HostShutdown。WPS Office關(guān)閉時(shí),插件平臺(tái)

18、會(huì)調(diào)用插件的_IDTExtensibility2.OnDisconnection(ext_dm_HostShutdown, custum) 方法。前面推薦插件使用“臨時(shí)”的菜單和工具欄按鈕。使用“臨時(shí)”菜單和按鈕時(shí),插件在處理ext_dm_HostShutdown過(guò)程中不需要?jiǎng)h除菜單、按鈕等項(xiàng)目。 了解了以上內(nèi)容,下面開(kāi)始我們的實(shí)現(xiàn),先創(chuàng)建以下類成員變量: FApp : _Application; /我們的WPS文字接口對(duì)象 FBtnTest1, FBtnTest2 : _CommandBarButton; /工具欄按鈕對(duì)象FConnection1, FConnection2 : Intege

19、r;再添加兩個(gè)全局常量const Btn1TagId = 'Btn1' Btn2TagId = 'Btn2'我們要靠它們來(lái)辨別是哪個(gè)按鈕被點(diǎn)擊了。我們要關(guān)心的具體實(shí)現(xiàn)在以下三個(gè)函數(shù)中,其它函數(shù)我們可以不管:procedure TSimpleAddin.Click(const Ctrl: CommandBarButton; var CancelDefault: WordBool); var TagId: WideString; 調(diào)用messagebox函數(shù)要引用Windows單元。begin TagId := Ctrl.Tag; if TagId = Btn1Ta

20、gId then MessageBox(0, '您點(diǎn)擊了按鈕一。', '提示', MB_OK + MB_ICONINFORMATION) else if TagId = Btn2TagId then MessageBox(0, '您點(diǎn)擊了按鈕一。', '提示', MB_OK + MB_ICONINFORMATION) else Assert(false, '錯(cuò)誤的參數(shù)'); end; procedure TSimpleAddin.OnConnection(const app: IDispatch; ConnectM

21、ode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); var ToolBar: CommandBar; begin 獲取WPS接口引用 FApp := app as _Application; 獲取標(biāo)準(zhǔn)工具欄接口 ToolBar := FApp.CommandBars.Item'Standard' as CommandBar; 向標(biāo)準(zhǔn)工具欄對(duì)象添加按鈕一 FBtnTest1 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar

22、.Controls.Count+1, True) as _CommandBarButton; 設(shè)置按鈕一屬性 with FBtnTest1 do begin Style := ksoButtonCaption; ToolTipText := '我的測(cè)試一' Caption := '測(cè)試一' Tag := Btn1TagId; 這個(gè)標(biāo)記是區(qū)別不同按鈕的 end; 將按鈕事件連接到我們實(shí)現(xiàn)的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest1, IID_ICommandBarButtonEvents, self

23、, FConnection1); 向插件工具欄對(duì)象添加按鈕二 FBtnTest2 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar.Controls.Count+1, True) as _CommandBarButton; 設(shè)置按鈕一屬性 with FBtnTest2 do begin Style := ksoButtonCaption; ToolTipText := '我的測(cè)試二' Caption := '測(cè)試二' Tag := Btn2TagId; 這個(gè)標(biāo)記是區(qū)別不同按鈕的 end; 將按鈕事件連

24、接到我們實(shí)現(xiàn)的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest2, IID_ICommandBarButtonEvents, self, FConnection2); end; Procedure TSimpleAddin.OnDisconnection(RemoveMode:ext_DisconnectMode;var custom: PSafeArray); begin 先斷開(kāi)事件連接。 InterfaceDisconnect( FBtnTest1, DIID_CommandBarButtonEvents, FConnection1

25、); InterfaceDisconnect( FBtnTest2, DIID_CommandBarButtonEvents, FConnection2); 釋放FApp接口引用。 FApp := nil; end; 代碼編寫至此,我們的DLL文件算是完成了,編譯后就生成了“SimpleLib.dll”,它只實(shí)現(xiàn)了簡(jiǎn)單的功能,就是在標(biāo)準(zhǔn)工具欄上添加兩個(gè)按鈕,點(diǎn)擊不同按鈕會(huì)彈出不同的信息框。要把它安裝到我們的WPS Office 2009中,還要編寫一個(gè)配置文件,下面我們進(jìn)行插件配置文件的編寫。四、編寫插件配置文件并安裝WPS Office插件的配置文件是一個(gè)符合一定命名規(guī)則的XML文件。插件配

26、置文件必須和插件DLL放在相同的文件夾中。插件配置文件的文件名必須遵循“addon-name.app-name.lang.xml”這樣的格式。a. addon-name插件模塊的名稱,必須和插件模塊的文件名完全一致。如WpsAddonDemo.dll插件,addon-name為“WpsAddonDemo”。b. app-name插件支持的WPS模塊,包括:wps、et、wpp、kso,其中kso表示支持WPS Office的所有模塊。c. lang插件支持的語(yǔ)言版本,如1033、2052等?!?”表示支持所有語(yǔ)言。假如WpsAddonDemo.dll插件支持WPS Office的所有模塊,支持

27、簡(jiǎn)體中文,那么它的配置文件名稱為“WpsAddonDemo”。如果插件需要針對(duì)WPS Office的不同模塊編寫不同的配置文件,那么可以按照以上規(guī)則編寫多個(gè)配置文件。插件平臺(tái)優(yōu)先使用精確匹配的插件配置文件,以WpsAddonDemo插件為例,WPS文字啟動(dòng)時(shí),插件平臺(tái)先查找名為“WpsAddonDemo”的配置文件,若找不到則繼續(xù)查找名為“WpsAddonDemo”的配置文件,如果都找不到,則說(shuō)明該插件不支持WPS文字。<?xml version="1.0" encoding="utf-8"?><!- id:插件DLL的CLSID。 v

28、ersion:插件的版本號(hào),形式的版本號(hào)。將顯示在插件平臺(tái)對(duì)話框中。 type:必須是comaddin。 author:作者名字。將顯示在插件平臺(tái)對(duì)話框中。 name:插件名稱。將顯示在插件平臺(tái)對(duì)話框中。 desc:插件簡(jiǎn)介。將顯示在插件平臺(tái)對(duì)話框中。 image:插件圖標(biāo)文件(32 X 32),將顯示在WPS插件平臺(tái)對(duì)話框中。 homepage:插件主頁(yè)網(wǎng)址。將在插件平臺(tái)對(duì)話框中顯示一個(gè)主頁(yè)按鈕。 help:幫助頁(yè)面的網(wǎng)址。將在插件平臺(tái)對(duì)話框中顯示一個(gè)問(wèn)號(hào)按鈕。 loadimm:必須是“1”。 updateitv:檢查更新的時(shí)間間隔,默認(rèn)為7天。-><ksoplug

29、in version="1"><propertyid="70D748C8-974D-44C0-8115-9072478A6009" version="234" type="comaddin" name="插件示例" author="WPS"desc="WPS Office 插件簡(jiǎn)介" image="icon.jpg" homepage="help=""loadimm="1

30、"updateitv="7" /></ksoplugin>圖(1) 插件屬性示例插件配置文件中至少要包含id、version、type、name四項(xiàng)數(shù)據(jù)。a. id插件id是插件COM組件的CLSID,WPS Office插件平臺(tái)將根據(jù)id加載插件,獲取_IDTExtensibility2接口。b. verion插件版本號(hào)使用Windows風(fēng)格的命名方式,即主版本號(hào)子版本號(hào)修正版本號(hào)構(gòu)建,如“”。插件版本號(hào)會(huì)顯示在插件平臺(tái)對(duì)話框中。c. typetype必須為comaddin,說(shuō)明插件DLL是一個(gè)COM組件。d. name在插件平臺(tái)對(duì)話框中看到的

31、插件名稱。e. loadimm WPS啟動(dòng)時(shí)是否立即加載插件,必須為“1”,表示立即加載插件。我們的插件配置文件名為“”,內(nèi)容如下:<?xml version="1.0" encoding="UTF-8"?><ksoplugin version="1"> <property id="31257FD7-797F-4D21-A919-6A8F333A077F" version="" type="comaddin" author=&quo

32、t;yulinsoft" name="測(cè)試插件" desc="這是一個(gè)示例插件,用于演示delphi開(kāi)發(fā)的WPS插件。" homepage=" help=" loadimm="1" updateitv="2" /></ksoplugin>將XML文件保存到與DLL文件相同的目錄中,打開(kāi)WPS,點(diǎn)擊插件平臺(tái),選擇“安裝本地插件”,定位到我們的插件目錄,選定“”文件打開(kāi)就可以了,成功安裝后,我們會(huì)在插件平臺(tái)和標(biāo)準(zhǔn)工具欄上看到如下變化:點(diǎn)擊不同的按鈕會(huì)彈出不同的信息框,這說(shuō)

33、明我們的插件開(kāi)發(fā)成功了。(本系列文章在百度空間首發(fā),轉(zhuǎn)載請(qǐng)注明出處。)用Delphi開(kāi)發(fā)Wps Office 插件(二)在上文中,我們已經(jīng)開(kāi)發(fā)了一個(gè)簡(jiǎn)單的WPS插件,它只是在標(biāo)準(zhǔn)工具欄中添加了兩個(gè)按鈕,而且這兩個(gè)按鈕似乎與其它的標(biāo)準(zhǔn)按鈕不一樣,它沒(méi)有按鈕圖標(biāo),只顯示了按鈕標(biāo)題,那我們能不能也讓這個(gè)按鈕也和其它按鈕一樣呢?答案是肯定的,這一節(jié)我們就來(lái)研究一下怎樣讓按鈕顯示圖標(biāo)。1、 相關(guān)接口及聲明我們添加的按鈕實(shí)際上是一個(gè)_CommandBarButton接口,它的聲明如下: _CommandBarButton = interface(CommandBarControl) '00023C

34、90-FFFE-0000-C000-000000111146' property Style: KsoButtonStyle read Get_Style write Set_Style; property FaceId: SYSINT read Get_FaceId write Set_FaceId; property Picture: IDispatch read Get_Picture write Set_Picture; end; 省略了其它內(nèi)容,只留下了我們需要的這三個(gè)屬性是我們本節(jié)的關(guān)鍵,讓按鈕顯示圖標(biāo)就要看它們了,Style是一個(gè)KsoButtonStyle類型,它的聲明

35、如下:type KsoButtonStyle = TOleEnum; const ksoButtonAutomatic = $00000000; ksoButtonIcon = $00000001; /只顯示圖標(biāo) ksoButtonCaption = $00000002; /只顯示標(biāo)題 ksoButtonIconAndCaption = $00000003; /顯示圖標(biāo)和標(biāo)題 ksoButtonIconAndWrapCaption = $00000007; ksoButtonIconAndCaptionBelow = $0000000B; ksoButtonWrapCaption = $000

36、0000E; ksoButtonIconAndWrapCaptionBelow = $0000000F; 我們只關(guān)心我們注釋的三個(gè),其它的不用關(guān)注,因?yàn)槲以跍y(cè)試時(shí)發(fā)現(xiàn)設(shè)為其它值并沒(méi)有什么特殊的效果。要想讓按鈕顯示按鈕,要先把按鈕的Style設(shè)置為ksoButtonIcon或ksoButtonIconAndCaption,然后再將FaceID設(shè)為一個(gè)整數(shù),它對(duì)應(yīng)的是WPS公共圖標(biāo)庫(kù)的圖標(biāo)索引,具體每個(gè)數(shù)字對(duì)應(yīng)哪個(gè)圖標(biāo),我們隨后會(huì)具體介紹。繼續(xù)打開(kāi)上文中的示例代碼,我們?cè)O(shè)置添加的兩個(gè)按鈕屬性如下: with FBtnTest1 do begin Style := ksoButtonIconAndC

37、aption; FaceId:=2; Caption := '測(cè)試一' ToolTipText := '我的測(cè)試一' Tag := Btn1TagId; /這個(gè)標(biāo)記是區(qū)別不同按鈕的 end; with FBtnTest2 do begin Style := ksoButtonIcon; FaceId:=3; Caption := '測(cè)試二' ToolTipText := '我的測(cè)試二' Tag := Btn2TagId; /這個(gè)標(biāo)記是區(qū)別不同按鈕的 end; 然后重新編譯我們插件,再打開(kāi)WPS文字,我們看到了效果如下:一個(gè)按鈕帶有

38、標(biāo)題,一個(gè)按鈕沒(méi)有標(biāo)題,它們都顯示了一個(gè)圖標(biāo),那我們?cè)鯓硬拍苤烂總€(gè)FaceId對(duì)應(yīng)的是什么圖標(biāo)呢?下面我們就來(lái)了解這個(gè)內(nèi)容。2、 制作FaceId對(duì)照表關(guān)于WPS二次開(kāi)發(fā)講到這里,我們似乎還沒(méi)有涉及到WPS文檔操作的相關(guān)內(nèi)容,下面我們就制作一個(gè)FaceId 與圖標(biāo)的對(duì)照表,以方便我們以后的開(kāi)發(fā)。繼續(xù)打開(kāi)上文例子,我們要實(shí)現(xiàn)的功能是點(diǎn)擊“測(cè)試一”按鈕,WPS將自動(dòng)新建一個(gè)文檔,生成一個(gè)對(duì)照表。我們新建一個(gè)過(guò)程“CreateFaceIconTable”,當(dāng)點(diǎn)擊“測(cè)試一”按鈕時(shí)會(huì)調(diào)用這個(gè)過(guò)程并生成列表。過(guò)程具體實(shí)現(xiàn)如下:procedure TSimpleAddin.CreateFaceIconTa

39、ble; var i:integer; doc:_Document; rng:Range; tmpBtn:_CommandBarButton; begin Doc:=FApp.Documents.Add(EmptyParam,False,0,true); /新建一個(gè)文檔 doc.Activate; rng:=doc.Paragraphs.First.Range; rng.Text:='FaceID與圖標(biāo)對(duì)照表' doc.Paragraphs.First.Alignment:=wpsAlignRowCenter; rng.Font.Size:=16; rng.Font.Bold:

40、=1; doc.Paragraphs.Add(rng); rng:=doc.Paragraphs.Last.Range; rng.Font.Size:=10; rng.Font.Bold:=0; rng.Tables.Add(rng,256,2,EmptyParam ,EmptyParam); rng.Tables.Item(1).Cell(1,1).Range.Text:='FaceID' rng.Tables.Item(1).Cell(1,2).Range.Text:='圖標(biāo)' rng.Tables.Item(1).Rows.Item(1).Range.Fo

41、nt.Bold:=1; /創(chuàng)建一個(gè)臨時(shí)按鈕,它不會(huì)顯示在工具欄上 tmpBtn:=FApp.CommandBars.Item1.Controls.Add(ksoControlButton, 0, 0,1, True) as CommandBarButton; tmpBtn.Style:=ksoButtonIcon; tmpBtn.FaceId:=1; tmpBtn.Visible:=False; for i:=1 to 255 do begin tmpBtn.FaceId:=i; tmpBtn.CopyFace; rng.Tables.Item(1).Cell(I+1,1).Range.Tex

42、t:=inttostr(i); rng.Tables.Item(1).Cell(I+1,2).Range.Paste; end; doc.Save; /保存文檔,會(huì)彈出保存對(duì)話框 tmpBtn:=nil; end; 由于WPS的圖標(biāo)庫(kù)是很大的,所以我們只顯示前255個(gè)圖標(biāo),你如果要顯示更多,可以修改相關(guān)數(shù)值。另外要說(shuō)明的一點(diǎn)是,這個(gè)FaceId只針對(duì)WPS文字,WPS表格和WPS演示中顯示的是不同的圖標(biāo),也就是說(shuō)它們使用的不是同一個(gè)圖標(biāo)庫(kù)。重新編譯我們的插件,打開(kāi)WPS,點(diǎn)擊“測(cè)試一”按鈕,稍等片刻就會(huì)看到如下表格,你可以把它保存以方便以后查詢。3、 怎樣使用自定義圖標(biāo) 既然可以顯示圖標(biāo),那我

43、們能不能使用我們自己的圖標(biāo)呢?答案是肯定的,要使用自定義圖標(biāo),我們就要使用按鈕的Picture屬性,它是一個(gè)IDispatch接口,看來(lái)我們不能直接將我們的圖片賦值給它。要實(shí)現(xiàn)自定義圖標(biāo),我們還需要借助一個(gè)函數(shù)和一個(gè)接口,這個(gè)函數(shù)就是GetOlePicture,這個(gè)接口是IPictureDisp,它們存在于AxCtrls單元,要使用需要先在Uses部分添加它的引用,由于還要使用TPicture類,所以也要引用Graphics單元,它們的聲明如下:procedure GetOlePicture(Picture: TPicture; var OlePicture: IPictureDisp);IP

44、ictureDisp = interface(IDispatch) '7BF80981-BF32-101A-8BBB-00AA00300CAB'end;在創(chuàng)建按鈕的過(guò)程中,我們要聲明一個(gè)TPicture類型的變量和一個(gè)IPictrueDisp類型的接口變量,先用TPicture來(lái)載入圖片,再用GetOlePicture將它轉(zhuǎn)換成IPictureDisp接口,然后就可以直接賦值給按鈕的Picture屬性了。為些我們編寫了如下函數(shù),它可以方便我們直接操作:function GetPicture(const FileName: WideString): IPictureDisp; v

45、ar pic: TPicture; Ipic: IPictureDisp; begin try pic := TPicture.Create; pic.Bitmap.LoadFromFile(Filename); GetOlePicture(pic, Ipic); Result := Ipic; except Result := nil; end; end; Filename是一個(gè)全路徑的bmp位圖文件名,我們可以將圖片放在插件目錄中,然后動(dòng)態(tài)獲取插件路徑并載入圖片。我們隨便找一個(gè)16*16的圖片并命名為“stop.bmp”將它保存到插件目錄中,然后我們用如下語(yǔ)句給按鈕“測(cè)試二”設(shè)定圖標(biāo)為我們

46、的位圖文件。 FbtnTest2.Picture:=GetPicture(ExtractFilePath(GetModuleName(HInstance)+'stop.bmp');重新編譯后我們看到按鈕“測(cè)試二”已經(jīng)變?yōu)槲覀儓D片了,如下圖: 將圖片保存到我們的插件目錄雖然很好,但不利于插件的發(fā)布,最好的方式是將圖片做為資源直接放入我們Dll中,一方面可以防止圖片丟失出錯(cuò),另一方面還可以提高載入速度,下面我們將講解如何打包資源到Dll中并調(diào)用。四、打包圖片資源到dll并調(diào)用打開(kāi)我們的示例插件,點(diǎn)擊“File”“new”,新建一個(gè)“Text”文本文件,輸入如下內(nèi)容:STOP Bit

47、Map stop.bmp然后保存為bmpRes.rc,將它保存到我們的插件目錄,同時(shí)保證stop.bmp也在我們的插件目錄。點(diǎn)擊“Projcet”“Add to project.”,在彈出的打開(kāi)文件對(duì)話框中選擇我們創(chuàng)建的“bmpRes.rc”,將它添加到我們的工程中,這時(shí)SimpleLib.dpr中會(huì)添加一行資源標(biāo)記,如下圖,這說(shuō)明我們添加成功了。以上步驟,我們只是創(chuàng)建了一個(gè)資源腳本,這個(gè)資源腳本添加一個(gè)名為“STOP”的位圖資源到DLL中(注意名稱為大寫),在工程編譯時(shí),編譯器會(huì)編譯“bmpRes.rc”為標(biāo)準(zhǔn)資源文件“bmpRes.res”,然后將它鏈接到我們的dll文件中,我們?cè)诓寮芯涂梢哉{(diào)用了,發(fā)布插件時(shí)也不用再發(fā)布圖片文件了,因?yàn)樗呀?jīng)存在于我們的dll中了。(有關(guān)資源腳本的相關(guān)文檔,請(qǐng)參閱MSDN)關(guān)于調(diào)用資源中的圖片,我們新建了一個(gè)函數(shù),內(nèi)容如下:function GetPictureFromRes(const Name: WideString): IPictureDisp; var pic: TPicture; Ipic: IPictureDisp; b

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論