用Delphi開發(fā)WpsOffice插件一二_第1頁
用Delphi開發(fā)WpsOffice插件一二_第2頁
用Delphi開發(fā)WpsOffice插件一二_第3頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、用 Delphi 開發(fā) Wps Office 插件(一)一、開發(fā)前的準備工作本文的開發(fā)環(huán)境是基于delphi 7.0 和WPS OFFICE 2009個人版。開發(fā)前要先做好以下準備工作。先導入相關(guān)的COM庫。打開 delphi ,點擊菜單"Project"-"lmport Type Library.",在彈出的對話框中選擇相應的類型庫(如下圖)。XKport Type LibraryImpoirt Type Librarykde coeapi 1.0 Type Ub冋y (Version 1.0)aKi"口占oft Add-In DEgqnEf

2、 yarwicin 1 .Clkmucodm 9一口 Tuue Lihraw (Vejgicin 9-IHKngsoftET 2.0 Object Library (Version 20Kingsoft Office 1.0 Obiect Library (Version 1.0)Kingsoft WPP 2.0 Object Library (Version 1.0)Kingsoft WPS 2.0 Obiect Lbrarv (Version 2.0 krnTpfovl.U IvpeLitxarv jVerwnl.UJvI vii ns rrn ti D:Ptogram FilesKing

3、saftWPS Office Personal'kofficeEksaddndi.dClass names:TIDTExtensWAdd.RemovePolette page|Aciiv5<Unit dir narne:Search path:| D: Pfogram FilesB orlandD elphi7l mports.|$(DELPHIMmports;®(DELPHI)rDEI_PHI)LInstall. Create Unii巨 Geneiale Component WrapperCancelHelp以上五個類型庫都要導入,由于每次只能導入一個,所以要分五次

4、導入。Kingsoft Add-In Designer”是 Add-In 插件 COM接 口對象。Kin gsoft Office 1.0 Object LibraryKin gsoft WPS 2.0 Object LibraryKin gsoft ET 2.0 Object LibraryKin gsoft WPP 2.0 Object Library”是 Wps Office 公用對象庫 COM接 口。”是WP敦字的COM接 口?!笔荳PS表格的COM接 口?!笔荳PS寅示的COM接 口。二、創(chuàng)建插件框架創(chuàng)建插件COM對象WPSOffice的插件由一個實現(xiàn)了特定接口的DLL 一個XML配

5、置文件以及插件本身需要的其他文件組成。WPSDffice 插件DLL實際上是一個實現(xiàn)了 _IDTExtensibility2接口的COM組件,這個接口就在我們剛才導入的"Kingsoft Add-In Designer ”對象中。我們只用創(chuàng)建一個COM寸象來實現(xiàn)這個接口,就可以繼續(xù)我們的開發(fā)了。打開 delphi 7.0, 新建一個"ActiveX Library ”,保存為"SimpleLib.dpr再新建一個 “ Automation Object ”,CoClass Name輸入我們要創(chuàng)建的類名 "SimpleAddin ”,然后點擊OK按鈕。把彈

6、出的類型庫編輯器關(guān)閉,將unit1保存為"untSimple.pas ”,此時單元代碼如下:unit untSimple;$WARN SYMBOL_PLATFORM OFF in terface usesComObj, ActiveX, SimpleLib_TLB, StdVcl;typeTSimpleAddin = class (TAutoObject, ISimpleAddin) protecteden d;impleme ntati onuses ComServ;in itializati onTAutoObjectFactory.Create(ComServer,TSimpl

7、eAddi n,Class_SimpleAddi n,ciMultiI nsta nee, tmApartme nt);en d.這是我們創(chuàng)建的com對象源碼,它目前還沒有實現(xiàn)相關(guān)的接口。下面我們要添加要使用的單兀和要實現(xiàn)我接口。將光標定位到uses區(qū)段,在后面添加三個單元的引用,分別是“AddlnDesignerObjects_TLB ”、“ KSO_TLB、“WPS_TL”,然后添加接口的實現(xiàn)。TSimpleAddin = class (TAutoObject,ISimpleAddin,_IDTExtensibility,IComma ndBarButto nEven ts)protect

8、ed實現(xiàn) _IDTExtensibility2procedure On Add In sUpdate( var custom: PSafeArray); safecall ;procedure On Beg in Shutdow n( var custom: PSafeArray); safecall ;procedure OnConnection( const app: IDispatch;Conn ectMode: ext_C onn ectMode;const Add InIn st: IDispatch;var custom: PSafeArray);safecall ;procedu

9、re On Disc onnection( RemoveMode: ext_Disc onn ectMode;var custom: PSafeArray);safecall ;procedure OnStartupComplete( var custom: PSafeArray); safecall ;實現(xiàn) ICommandBarButtonEventsprocedure Click( const Ctrl: CommandBarButton;varCan celDefault:WordBool);stdcall ;en d;由于我們要響應工具欄按鈕的單擊事件,所以同時添加了IComma n

10、dBarButto nEve nts接口的實現(xiàn)?,F(xiàn)在應該說一個插件的框架已經(jīng)完成了,具體實現(xiàn)怎樣的功能,就看我們自己的實現(xiàn)了。三、實現(xiàn)我們的功能由于是一個示例插件,所以我們要實現(xiàn)的功能很簡單,就是在標準工具欄上添加兩個 按鈕,點擊不同的按鈕彈出不同的信息。在具體實現(xiàn)之前,我們先了解一下插件接口_IDTExte nsibility2,它的聲明如下:DTExte nsibility2 =in terface(IDispatch)'B65AD801-ABAF-11D0-BB8B-00A0C90F2744'procedure OnConnection( const Applicatio

11、n: IDispatch;ConnectMode:ext_ConnectMode;const AddInlnst: IDispatch;var custom: PSafeArray);safecall ;procedure On Disc onnection( RemoveMode: ext_Disc onn ectMode;var custom: PSafeArray);safecall ;procedure On Add In sUpdate( var custom: PSafeArray); safecall ;procedure OnStartupComplete( var custo

12、m: PSafeArray); safecall ;procedure On Beg in Shutdow n( var custom: PSafeArray); safecall ;en d;插件安裝時,WPSOffice 會將插件 DLL注冊(DllRegisterServer )到系統(tǒng)中。WPSDffice 啟動時,將通過插件平臺(管理插件的模塊)加載插件。插件平臺通過COM方式創(chuàng)建一個DTExte nsibility2對象,然后調(diào)用_IDTExte nsibility2. On Co nn ectio n。插件可以在OnConn ection中做一些初始化操作,如添加菜單項、工具欄按鈕

13、等。On Co nn ection之后,On StartupComplete 將被調(diào)用,至此插件加載完成。WPS關(guān)閉時,插件平臺先后調(diào)用On Begi nShutdow n和 On Disco nn ectio n 。目前, WPS Office插件平臺不會調(diào)用插件的DTExtensibility2.OnAddInsUpdate方法。插件實現(xiàn)一個空的 OnAddInsUpdate 就可以了,即直接返回S_OK應避免在其中編寫其他代碼,以免將來引起兼容問題。下面是對五個方 法的詳述(來自 KingSoft官方文檔,翻譯成了delphi 版):1.1. _IDTExte nsibility2. O

14、n Co nn ectio nprocedure OnConnection( const Application: IDispatch;Conn ectMode:ext_C onn ectMode;const AddInlnst: IDispatch;var custom: PSafeArray); safecall ;OnConnection方法一共帶有 4個參數(shù)。第一個參數(shù) Application是宿主程序?qū)ο?;第二個參數(shù)是ext_ConnectMode類型的枚舉值;第三個和第四個參數(shù)目前沒有使用,插件實現(xiàn)OnConnection時必須忽略這兩個參數(shù)。ext_ConnectMode定義了

15、4個常量值,如下所示。typeext_C onn ectMode = TOleE num;con stext_cm_AfterStartup = $00000000;ext_cm_Startup = $00000001;ext_cm_External = $00000002;ext_cm_Comma ndLi ne = $00000003;其中,ext_cm_Startup 和ext_cm_AfterStartup是插件平臺加載COM插件時傳入OnConnection 的。ext_cm_External 禾口 ext_cm_CommandLine 目前沒有用至U。a. ext_cm_Start

16、upWPS啟動時,插件平臺會立即加載COM插件,調(diào)用 On Co nn ectio n(Applicati on,ext_cm_Startup)。b. ext_cm_AfterStartup用于安裝插件過程。安裝插件時,WPS Office 插件平臺會加載插件,并調(diào)用 On Co nn ectio n(Applicatio n,ext_cm_AfterStartup),此時插件要做兩件事情,即安裝后的初始化以及加載初始化。如果插件安裝以后不需要進一步的配置等初始化工作,那么對這個插件而言,不需要區(qū)分 ext_cm_AfterStartup 和 ext_cm_Startup。一般情況下,插件會在

17、OnConnection中添加菜單項或者工具欄按鈕等功能入口。在WPSOffice 添加的菜單項或者工具欄按鈕,分為“臨時”和“持久”兩種類型。顧名思義,帶 有“臨時”屬性的菜單項或工具欄按鈕,在WPSOffice重新啟動以后就不存在了;帶有“持久”屬性的菜單項或工具欄按鈕,在WPS Office重新啟動以后,仍然存在。插件添加菜單項和工具欄按鈕時,推薦使用“臨時”的菜單項和工具欄按鈕,在宿主程序關(guān)閉時,插件也不要調(diào)用API刪除菜單或工具欄按鈕。插件添加菜單項或工具欄按鈕時,建議先檢查這些菜單或按鈕是否已經(jīng)存在,以免重復添加。1.2. _IDTExte nsibility2. On Start

18、upComplete插件平臺加載插件過程中,會先后調(diào)用On Co nn ection和On StartupComplete。如果插件需要在插件啟動以后(OnConn ecti on執(zhí)行完之后)做一些事情,可以將這些工作放到On StartupComplete中執(zhí)行。大多數(shù)情況下,插件可以實現(xiàn)一個空的On StartupComplete 即可。1.3. _IDTExte nsibility2. On Begi nShutdow nWPSOffice關(guān)閉過程中,插件平臺會調(diào)用OnBeginShutdown,通知插件做清理工作,如保存配置、終止未完成的工作、釋放系統(tǒng)資源等。On Begi nShut

19、dow n在On Disco nn ection 之前被調(diào)用。1.4. _IDTExte nsibility2. On Disco nn ectio nOn Disco nn ecti on 和On Co nn ecti on相對應,插件在 On Co nn ection中添加菜單或工具欄 命令、注冊事件通知,On Disconnection則注銷事件通知。procedure On Disc onn ecti on (RemoveMode: ext_Disc onn ectMode;var custom: PSafeArray); safecall ;On Disco nn ecti on 帶

20、RemoveMode和 custom兩個參數(shù)。其中custom參數(shù)目前沒有用到, 插件忽略這個參數(shù)即可;第一個參數(shù)RemoveMode是 ext_DisconnectMode類型的枚舉值,女口 下所示:typeext_Disc onn ectMode = TOleE num;con stext_dm_HostShutdow n = $00000000;ext_dm_UserClosed = $00000001;目前只用到了ext_dm_HostShutdown。 WPS Office關(guān)閉時,插件平臺會調(diào)用插件的DTExte nsibility2. On Disco nn ectio n(ext

21、_dm_HostShutdow n,custum)方法。前面推薦插 件使用“臨時”的菜單和工具欄按鈕。使用“臨時”菜單和按鈕時,插件在處理 ext_dm_HostShutdown過程中不需要刪除菜單、按鈕等項目。了解了以上內(nèi)容,下面開始我們的實現(xiàn),先創(chuàng)建以下類成員變量:FApp : _Application; /我們的 WPS文字接口對象FBt nTest1, FBt nTest2 : _Comma ndBarButt on; /工具欄按鈕對象FConnection1, FConnection2 : In teger;再添加兩個全局常量con stBt n1Tagld = 'Bt n1

22、:Bt n2Tagld = 'Bt n2:我們要靠它們來辨別是哪個按鈕被點擊了。我們要關(guān)心的具體實現(xiàn)在以下三個函數(shù)中,其它函數(shù)我們可以不管:procedure TSimpleAddin.Click(const Ctrl: CommandBarButton;var Ca ncelDefault: WordBool);varTagId: WideString;調(diào)用 messagebox函數(shù)要引用 Windows單元。beginTagId := Ctrl.Tag;if TagId = Btn1TagldthenMessageBox( 0,'您點擊了按鈕一。,'提示,MB_OK

23、 + MB_ICONINFORMATION) else if TagId = Btn2TagIdthenMessageBox( 0,'您點擊了按鈕一。,'提示,MB_OK + MB_ICONINFORMATION) elseAssert( false ,'錯誤的參數(shù)');en d;procedure TSimpleAddin.OnConnection(const app: IDispatch;Conn ectMode: ext_C onn ectMode;const AddI nln st: IDispatch;var custom: PSafeArray);v

24、arToolBar: Comma ndBar;begin獲取WP接口引用FApp := app as _Applicati on;獲取標準工具欄接口 向標準工具欄對象添加按鈕一0, 0,FBt nTest1:=Toolbar.Co ntrols.Add(ksoC on trolButto n,設(shè)置按鈕一屬性with FBtnTest1dobeginStyle := ksoButt on Capti on;ToolTipText :='我的測試一'Caption :='測試一;Tag := Btn ITagld;這個標記是區(qū)別不同按鈕的en d;將按鈕事件連接到我們實現(xiàn)的

25、IComma ndBarButt on Eve nts接口上In terfaceC onn ect(FBt nTestl,IID_IComma ndBarButto nEve nts,self,FConnection 1);向插件工具欄對象添加按鈕二FBt nTest2:=Toolbar.Co ntrols.Add(ksoCo ntrolButto n,0,0,設(shè)置按鈕一屬性with FBtnTest2dobeginStyle := ksoButt on Capti on;ToolTipText :='我的測試二'Caption :='測試二;Tag := Btn 2T

26、agId;這個標記是區(qū)別不同按鈕的en d;將按鈕事件連接到我們實現(xiàn)的IComma ndBarButt on Eve nts接口上In terfaceC onn ect(FBt nTest2,IID_IComma ndBarButto nEve nts,self,FCo nn ectio n2);en d;Procedure TSimpleAddin.0nDisconnection(RemoveMode:ext_Disc onn ectMode; var custom: PSafeArray);begin先斷開事件連接。In terfaceDisc onn ect(FBt nTest1, DI

27、ID_Comma ndBarButto nEven ts, FCo nn ectio n1);In terfaceDisc onn ect(FBt nTest2, DIID_Comma ndBarButto nEven ts, FCo nn ectio n2);釋放FApp接口引用。FApp := nil ;en d;代碼編寫至此,我們的DLL文件算是完成了,編譯后就生成了“ SimpleLib.dll ”,它只實現(xiàn)了簡單的功能,就是在標準工具欄上添加兩個按鈕,點擊不同按鈕會彈出不同的信息框。要把它安裝到我們的 WPSOffice 2009中,還要編寫一個配置文件,下面我們進行插件配置 文件的

28、編寫。四、編寫插件配置文件并安裝WPS Office插件的配置文件是一個符合一定命名規(guī)則的XML文件。插件配置文件必須和插件DLL放在相同的文件夾中。插件配置文件的文件名必須遵循“ addo n-n ame.app-name.la ng.xml"這樣的格式。a. addo n-n ame插件模塊的名稱,必須和插件模塊的文件名完全一致。如WpsAddonDemo.dll插件,addon-name為"WpsAddonDen”b. app-n ame插件支持的 WPS模塊,包括: wps、et、wpp kso,其中kso表示支持 WPSOfice 的所有模塊。c. la ng插件

29、支持的語言版本,如1033、2052等?!?0”表示支持所有語言。假如 WpsAddonDemo.dll插件支持 WPSOffice的所有模塊,支持簡體中文,那么它的配 置文件名稱為"”。如果插件需要針對 WPS Office的不同模塊編寫不同的配置文件,那么可以按照以上規(guī) 則編寫多個配置文件。插件平臺優(yōu)先使用精確匹配的插件配置文件,以WpsAddo nDem插件為例,WPS文字啟動時,插件平臺先查找名為""的配置文件,若找不到則繼續(xù)查找名為"”的配置文件,如果都找不到,貝U說明該插件不支持 WP敦字。<?xml versio n="1.

30、0" en codi ng="utf-8"?><!-id:插件 DLL 的 CLSID。version:插件的版本號,形式的版本號。將顯示在插件平臺對話框中。type: 必須是 comaddin。author:作者名字。將顯示在插件平臺對話框中。n ame:插件名稱。將顯示在插件平臺對話框中。desc:插件簡介。將顯示在插件平臺對話框中。image:插件圖標文件(32 X 32 ),將顯示在 WPS插件平臺對話框中。homepage :插件主頁網(wǎng)址。將在插件平臺對話框中顯示一個主頁按鈕。help:幫助頁面的網(wǎng)址。將在插件平臺對話框中顯示一個問號按鈕。l

31、oadimm:必須是"1 ”。updateitv:檢查更新的時間間隔,默認為 7天。->vksoplug in versio n="1"><propertyid="70D748C8-974D-44C0-8115-9072478A6009"type="comaddi n"name='插件示例” author="WPS"desc="WPS Office 插件簡介” image="icon .jpg" homepage=" n/addo ns&q

32、uot; help=" n"loadimm="1"updateitv="7" /></ ksoplugin >圖(1)插件屬性示例插件配置文件中至少要包含id、version、type、name四項數(shù)據(jù)。a. id插件id是插件COM!件的CLSID, WPSOffice插件平臺將根據(jù)id加載插件,獲取 _IDTExte nsibility2接口。b. veri on插件版本號使用Windows風格的命名方式,即主版本號子版本號修正版本號構(gòu)建,如“ ”。插件版本號會顯示在插件平臺對話框中。c. typetype必須為

33、comaddin,說明插件 DLL是一個COM!件。d. n ame在插件平臺對話框中看到的插件名稱。e. loadimmWPS啟動時是否立即加載插件,必須為“1 ”,表示立即加載插件。我們的插件配置文件名為“”,內(nèi)容如下:<?xml version ="1.0" encoding ="UTF-8" ?><ksoplugi n vers ion ="1" ><propertyid ="31257FD7-797F-4D21-A919-6A8F333A077F"type ='com

34、addi n"author ="yuli nsoft"name='測試插件"desc='這是一個示例插件,用于演示 delphi開發(fā)的WP插件。help =' n/addo ns/"loadimm="1"updateitv ="2"/></ksoplugi n>將XML文件保存到與DLL文件相同的目錄中,打開 WPS點擊插件平臺,選擇“安裝本地插 件”定位到我們的插件目錄,選定“ "文件打開就可以了,成功 安裝后,我們會在插件平臺和標準工具欄上看到如下變

35、化:珂口址)幫助入反饋®品匾Ji善肘4 丫100器p測試一測試二-言臺呈亙圖癢F插件乎臺插件列表料薦插件安裝本地插件插件圖片打印機1-0-00將WFS文檔以團片格式按頁輸出這是我們添加的兩 個按鈕作者:YulinSoft這是我們的插表格應用祥式擁有諸塞配色方案 >一鍵美化你的表格°功能導航:任務窗格凍格樣式 作者:kincxoft點擊不同的按鈕會彈出不同的信息框,這說明我們的插件開發(fā)成功了。 (本系列文章在百度空間首發(fā),轉(zhuǎn)載請注明出處。)用 Delphi 開發(fā) Wps Office 插件(二)在上文中,我們已經(jīng)開發(fā)了一個簡單的 WPS插件,它只是在標準工具欄中添加了兩

36、個按 鈕,而且這兩個按鈕似乎與其它的標準按鈕不一樣,晁豈 ii Uu擁t 100 % y測試一測試二它沒有按鈕圖標,只顯示了按鈕標題, 那我們能不能也讓這個按鈕也和其它按鈕一樣呢?答 案是肯定的,這一節(jié)我們就來研究一下怎樣讓按鈕顯示圖標。一、相關(guān)接口及聲明我們添加的按鈕實際上是一個_CommandBarButton接口,它的聲明如下:_Comma ndBarButt on = in terface (Comma ndBarC on trol)'00023C90-FFFE-0000-C000-000000111146'property Style: KsoButto nStyle

37、read Get_Stylewrite Set_Style;property FaceId: SYSINT read Get_Faceld write Set_Faceld;property Picture: IDispatchread Get_Picturewrite Set_Picture;en d; 省略了其它內(nèi)容,只留下了我們需要的2這三個屬性是我們本節(jié)的關(guān)鍵,讓按鈕顯示圖標就要看它們了,Style是一個KsoButto nStyle 類型,匕的聲明如下:typeKsoButt on Style = TOleE num;constksoButt on Automatic =$00000

38、000 ;ksoButtonlcon =$00000001; / 只顯示圖標ksoButt on Caption =$00000002 ; / 只顯示標題ksoButtonlconAndCaption =$00000003 ; / 顯示圖標和標題ksoButtonlconAndWrapCaption =$00000007 ;ksoButto nlconAn dCaptio nBelow =$0000000B;ksoButtonWrapCaption =| $0000000E ; |ksoButto nlconAn dWrapCaptio nBelow =$0000000F;我們只關(guān)心我們注釋的

39、三個,其它的不用關(guān)注,因為我在測試時發(fā)現(xiàn)設(shè)為其它值并沒有 什么特殊的效果。要想讓按鈕顯示按鈕,要先把按鈕的Style設(shè)置為ksoButtonlcon 或ksoButtonlconAndCaption,然后再將FacelD設(shè)為一個整數(shù),它對應的是 WPS公共圖標庫的圖標索引,具體每個數(shù)字對應哪個圖標,我們隨后會具體介紹。繼續(xù)打開上文中的示例代碼,我們設(shè)置添加的兩個按鈕屬性如下:withFBt nTest1dobeginStyle := ksoButt onlconAn dCapti on;Faceld:=2;Caption :='測試一'ToolTipText :='我的

40、測試一'Tag := BtnITagld;/這個標記是區(qū)別不同按鈕的end;with FBt nTest2dobeginStyle := ksoButt onlcon;Faceld:=3;Caption :='測試二'ToolTipText :=J'我的測試二;Tag := Btn2TagId;/這個標記是區(qū)別不同按鈕的|"|end;然后重新編譯我們插件,再打開WPS文字,我們看到了效果如下:Q "測試一一個按鈕帶有標題,一個按鈕沒有標題, 它們都顯示了一個圖標,那我們怎樣才能知道每個FaceId對應的是什么圖標呢?下面我們就來了解這個內(nèi)容。

41、二、制作FaceId對照表關(guān)于WPST次開發(fā)講到這里,我們似乎還沒有涉及到WPS文檔操作的相關(guān)內(nèi)容,下面我們就制作一個FaceId與圖標的對照表,以方便我們以后的開發(fā)。繼續(xù)打開上文例子,我們要實現(xiàn)的功能是點擊“測試一”按鈕,WPS將自動新建一個文檔,生成一個對照表。我們新建一個過程" CreateFaceIconTable ”,當點擊“測試一”按鈕 時會調(diào)用這個過程并生成列表。過程具體實現(xiàn)如下:procedure TSimpleAdd in .CreateFacelc on Table;vari:i nteger;doc:_Docume nt;rn g:Ra nge;tmpBt n:

42、_Comma ndBarButt on;/新建一個文檔beginDoc:=FApp.Docume nts.Add(EmptyParam,False,O,true); doc.Activate;rng.Text:= 'FaceID 與圖標對照表'Il_lrn g.Fo nt.Bold:=1;""|rn g.F on t.Size:=10;rn g.F on t.Bold:=0;.Cell(1,1).Ra nge.Text:='FacelD'.Cell(1,2).Range.Text:='圖標'.Rows.ltem.Ra nge.

43、Fo nt.Bold:=1;/創(chuàng)建一個臨時按鈕,它不會顯示在工具欄上tmpBt n:=FApp.Comma ndBars.ltem1.Co ntrols.Add(ksoCo ntrolButto n, 0, 0,1, True)asComma ndBarButt on;tmpBt n.Style:=ksoButt onlcon;tmpBt n.FaceId:=1;tmpBt n. Visible:=False;for i:=1 to 255 dobegintmpBt n.Faceld:=i;'_ItmpBt n. CopyFace;end;doc.Save; /保存文檔,會彈出保存對話

44、框tmpBtn:= nil ;end;由于WPS的圖標庫是很大的,所以我們只顯示前255個圖標,你如果要顯示更多,可以修改相關(guān)數(shù)值。另外要說明的一點是,這個Faceld只針對 WPS文字,WPS表格和 WPS寅示中顯示的是不同的圖標,也就是說它們使用的不是同一個圖標庫。重新編譯我們的插件,打開WPS點擊“測試一”按鈕,稍等片刻就會看到如下表格,你可以把它保存以方便以后查詢。FacelD與圖標對照表FacelD圖標1&2血J4週56三、怎樣使用自定義圖標既然可以顯示圖標,那我們能不能使用我們自己的圖標呢?答案是肯定的,要使用自 定義圖標,我們就要使用按鈕的Picture屬性,它是一個ID

45、ispatch 接口,看來我們不能直接將我們的圖片賦值給它。要實現(xiàn)自定義圖標,我們還需要借助一個函數(shù)和一個接口,這個函數(shù)就是GetOlePicture ,這個接口是IPictureDisp ,它們存在于 AxCtrls 單元,要使用需要先在 Uses 部分添加它的引用,由于還要使用 TPicture類,所以也要引用 Graphics單元,它們的聲明如下:procedure GetOlePicture(Picture: TPicture;var OlePicture: IPictureDisp);IPictureDisp =in terface (IDispatch)'7BF80981-

46、BF32-101A-8BBB-00AA00300CAB'en d;在創(chuàng)建按鈕的過程中,我們要聲明一個TPicture類型的變量和一個IPictrueDisp 類型的接 口變量,先用 TPicture 來載入圖片,再用 GetOlePicture 將它轉(zhuǎn)換成IPictureDisp 接口, 然后就可以直接賦值給按鈕的Picture屬性了。為些我們編寫了如下函數(shù),它可以方便我們直接操作:fun cti onGetPicture( con st FileName: WideStri ng): IPictureDisp;var pic: TPicture;Ipic: IPictureDisp;

47、begintrypic := TPicture.Create;GetOlePicture(pic, Ipic);Result := Ipic;exceptResult := nil ;end;end;File name是一個全路徑的bmp位圖文件名,我們可以將圖片放在插件目錄中,然后動態(tài)獲取插件路徑并載入圖片。我們隨便找一個16*16的圖片并命名為“stop.bmp ”將它保存 到插件目錄中,然后我們用如下語句給按鈕“測試二”設(shè)定圖標為我們的位圖文件。Fbt nTest2.Picture:=GetPicture(ExtractFilePath(GetModuleName(HI nsta nce

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

49、ojcet ”一“ Add to project. ” ,在彈出的打開文件對話框中選擇我 們創(chuàng)建的“bmpRes.rc ",將它添加到我們的工程中,這時SimpleLib.dpr中會添加一行資源標記,如下圖,這說明我們添加成功了?!癝TOP的位圖以上步驟,我們只是創(chuàng)建了一個資源腳本,這個資源腳本添加一個名為資源到DLL中(注意名稱為大寫),在工程編譯時,編譯器會編譯"bmpRes.rc ”為標準資源 文件“ bmpRes.res ” ,然后將它鏈接到我們的 dll文件中,我們在插件中就可以調(diào)用了,發(fā) 布插件時也不用再發(fā)布圖片文件了,因為它已經(jīng)存在于我們的dll中了。+ 匚J(有關(guān)資源腳本的相關(guān)文檔,請參閱MSDNSimpleLibuntSimple b

溫馨提示

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

評論

0/150

提交評論