版權(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"-"lmport Type Library.",在彈出的對(duì)話框中選擇相應(yīng)的類型庫(kù)(如下圖)。XKport Type LibraryImpoirt Type Librarykde coeapi 1.0 Type Ub冋y (Version 1.0)aKi"口占o(jì)ft 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以上五個(gè)類型庫(kù)都要導(dǎo)入,由于每次只能導(dǎo)入一個(gè),所以要分五次
4、導(dǎo)入。Kingsoft Add-In Designer”是 Add-In 插件 COM接 口對(duì)象。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 公用對(duì)象庫(kù) COM接 口。”是WP敦字的COM接 口?!笔荳PS表格的COM接 口?!笔荳PS寅示的COM接 口。二、創(chuàng)建插件框架創(chuàng)建插件COM對(duì)象WPSOffice的插件由一個(gè)實(shí)現(xiàn)了特定接口的DLL 一個(gè)XML配
5、置文件以及插件本身需要的其他文件組成。WPSDffice 插件DLL實(shí)際上是一個(gè)實(shí)現(xiàn)了 _IDTExtensibility2接口的COM組件,這個(gè)接口就在我們剛才導(dǎo)入的"Kingsoft Add-In Designer ”對(duì)象中。我們只用創(chuàng)建一個(gè)COM寸象來(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按鈕。把彈
6、出的類型庫(kù)編輯器關(guān)閉,將unit1保存為"untSimple.pas ”,此時(shí)單元代碼如下: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對(duì)象源碼,它目前還沒(méi)有實(shí)現(xiàn)相關(guān)的接口。下面我們要添加要使用的單兀和要實(shí)現(xiàn)我接口。將光標(biāo)定位到uses區(qū)段,在后面添加三個(gè)單元的引用,分別是“AddlnDesignerObjects_TLB ”、“ KSO_TLB、“WPS_TL”,然后添加接口的實(shí)現(xiàn)。TSimpleAddin = class (TAutoObject,ISimpleAddin,_IDTExtensibility,IComma ndBarButto nEven ts)protect
8、ed實(shí)現(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 ;實(shí)現(xiàn) ICommandBarButtonEventsprocedure Click( const Ctrl: CommandBarButton;varCan celDefault:WordBool);stdcall ;en d;由于我們要響應(yīng)工具欄按鈕的單擊事件,所以同時(shí)添加了IComma n
10、dBarButto nEve nts接口的實(shí)現(xiàn)?,F(xiàn)在應(yīng)該說(shuō)一個(gè)插件的框架已經(jīng)完成了,具體實(shí)現(xiàn)怎樣的功能,就看我們自己的實(shí)現(xiàn)了。三、實(shí)現(xiàn)我們的功能由于是一個(gè)示例插件,所以我們要實(shí)現(xiàn)的功能很簡(jiǎn)單,就是在標(biāo)準(zhǔn)工具欄上添加兩個(gè) 按鈕,點(diǎn)擊不同的按鈕彈出不同的信息。在具體實(shí)現(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;插件安裝時(shí),WPSOffice 會(huì)將插件 DLL注冊(cè)(DllRegisterServer )到系統(tǒng)中。WPSDffice 啟動(dòng)時(shí),將通過(guò)插件平臺(tái)(管理插件的模塊)加載插件。插件平臺(tái)通過(guò)COM方式創(chuàng)建一個(gè)DTExte nsibility2對(duì)象,然后調(diào)用_IDTExte nsibility2. On Co nn ectio n。插件可以在OnConn ection中做一些初始化操作,如添加菜單項(xiàng)、工具欄按鈕
13、等。On Co nn ection之后,On StartupComplete 將被調(diào)用,至此插件加載完成。WPS關(guān)閉時(shí),插件平臺(tái)先后調(diào)用On Begi nShutdow n和 On Disco nn ectio n 。目前, WPS Office插件平臺(tái)不會(huì)調(diào)用插件的DTExtensibility2.OnAddInsUpdate方法。插件實(shí)現(xiàn)一個(gè)空的 OnAddInsUpdate 就可以了,即直接返回S_OK應(yīng)避免在其中編寫(xiě)其他代碼,以免將來(lái)引起兼容問(wèn)題。下面是對(duì)五個(gè)方 法的詳述(來(lái)自 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個(gè)參數(shù)。第一個(gè)參數(shù) Application是宿主程序?qū)ο螅坏诙€(gè)參數(shù)是ext_ConnectMode類型的枚舉值;第三個(gè)和第四個(gè)參數(shù)目前沒(méi)有使用,插件實(shí)現(xiàn)OnConnection時(shí)必須忽略這兩個(gè)參數(shù)。ext_ConnectMode定義了
15、4個(gè)常量值,如下所示。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是插件平臺(tái)加載COM插件時(shí)傳入OnConnection 的。ext_cm_External 禾口 ext_cm_CommandLine 目前沒(méi)有用至U。a. ext_cm_Start
16、upWPS啟動(dòng)時(shí),插件平臺(tái)會(huì)立即加載COM插件,調(diào)用 On Co nn ectio n(Applicati on,ext_cm_Startup)。b. ext_cm_AfterStartup用于安裝插件過(guò)程。安裝插件時(shí),WPS Office 插件平臺(tái)會(huì)加載插件,并調(diào)用 On Co nn ectio n(Applicatio n,ext_cm_AfterStartup),此時(shí)插件要做兩件事情,即安裝后的初始化以及加載初始化。如果插件安裝以后不需要進(jìn)一步的配置等初始化工作,那么對(duì)這個(gè)插件而言,不需要區(qū)分 ext_cm_AfterStartup 和 ext_cm_Startup。一般情況下,插件會(huì)在
17、OnConnection中添加菜單項(xiàng)或者工具欄按鈕等功能入口。在WPSOffice 添加的菜單項(xiàng)或者工具欄按鈕,分為“臨時(shí)”和“持久”兩種類型。顧名思義,帶 有“臨時(shí)”屬性的菜單項(xiàng)或工具欄按鈕,在WPSOffice重新啟動(dòng)以后就不存在了;帶有“持久”屬性的菜單項(xiàng)或工具欄按鈕,在WPS Office重新啟動(dòng)以后,仍然存在。插件添加菜單項(xiàng)和工具欄按鈕時(shí),推薦使用“臨時(shí)”的菜單項(xiàng)和工具欄按鈕,在宿主程序關(guān)閉時(shí),插件也不要調(diào)用API刪除菜單或工具欄按鈕。插件添加菜單項(xiàng)或工具欄按鈕時(shí),建議先檢查這些菜單或按鈕是否已經(jīng)存在,以免重復(fù)添加。1.2. _IDTExte nsibility2. On Start
18、upComplete插件平臺(tái)加載插件過(guò)程中,會(huì)先后調(diào)用On Co nn ection和On StartupComplete。如果插件需要在插件啟動(dòng)以后(OnConn ecti on執(zhí)行完之后)做一些事情,可以將這些工作放到On StartupComplete中執(zhí)行。大多數(shù)情況下,插件可以實(shí)現(xiàn)一個(gè)空的On StartupComplete 即可。1.3. _IDTExte nsibility2. On Begi nShutdow nWPSOffice關(guān)閉過(guò)程中,插件平臺(tái)會(huì)調(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相對(duì)應(yīng),插件在 On Co nn ection中添加菜單或工具欄 命令、注冊(cè)事件通知,On Disconnection則注銷(xiāo)事件通知。procedure On Disc onn ecti on (RemoveMode: ext_Disc onn ectMode;var custom: PSafeArray); safecall ;On Disco nn ecti on 帶
20、RemoveMode和 custom兩個(gè)參數(shù)。其中custom參數(shù)目前沒(méi)有用到, 插件忽略這個(gè)參數(shù)即可;第一個(gè)參數(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)閉時(shí),插件平臺(tái)會(huì)調(diào)用插件的DTExte nsibility2. On Disco nn ectio n(ext
21、_dm_HostShutdow n,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ì)象FBt nTest1, FBt nTest2 : _Comma ndBarButt on; /工具欄按鈕對(duì)象FConnection1, FConnection2 : In teger;再添加兩個(gè)全局常量con stBt n1Tagld = 'Bt n1
22、:Bt n2Tagld = 'Bt n2:我們要靠它們來(lái)辨別是哪個(gè)按鈕被點(diǎn)擊了。我們要關(guān)心的具體實(shí)現(xiàn)在以下三個(gè)函數(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,'您點(diǎn)擊了按鈕一。,'提示,MB_OK
23、 + MB_ICONINFORMATION) else if TagId = Btn2TagIdthenMessageBox( 0,'您點(diǎn)擊了按鈕一。,'提示,MB_OK + MB_ICONINFORMATION) elseAssert( false ,'錯(cuò)誤的參數(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;獲取標(biāo)準(zhǔn)工具欄接口 向標(biāo)準(zhǔn)工具欄對(duì)象添加按鈕一0, 0,FBt nTest1:=Toolbar.Co ntrols.Add(ksoC on trolButto n,設(shè)置按鈕一屬性with FBtnTest1dobeginStyle := ksoButt on Capti on;ToolTipText :='我的測(cè)試一'Caption :='測(cè)試一;Tag := Btn ITagld;這個(gè)標(biāo)記是區(qū)別不同按鈕的en d;將按鈕事件連接到我們實(shí)現(xiàn)的
25、IComma ndBarButt on Eve nts接口上In terfaceC onn ect(FBt nTestl,IID_IComma ndBarButto nEve nts,self,FConnection 1);向插件工具欄對(duì)象添加按鈕二FBt nTest2:=Toolbar.Co ntrols.Add(ksoCo ntrolButto n,0,0,設(shè)置按鈕一屬性with FBtnTest2dobeginStyle := ksoButt on Capti on;ToolTipText :='我的測(cè)試二'Caption :='測(cè)試二;Tag := Btn 2T
26、agId;這個(gè)標(biāo)記是區(qū)別不同按鈕的en d;將按鈕事件連接到我們實(shí)現(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先斷開(kāi)事件連接。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;代碼編寫(xiě)至此,我們的DLL文件算是完成了,編譯后就生成了“ SimpleLib.dll ”,它只實(shí)現(xiàn)了簡(jiǎn)單的功能,就是在標(biāo)準(zhǔn)工具欄上添加兩個(gè)按鈕,點(diǎn)擊不同按鈕會(huì)彈出不同的信息框。要把它安裝到我們的 WPSOffice 2009中,還要編寫(xiě)一個(gè)配置文件,下面我們進(jìn)行插件配置 文件的
28、編寫(xiě)。四、編寫(xiě)插件配置文件并安裝WPS Office插件的配置文件是一個(gè)符合一定命名規(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、支持的語(yǔ)言版本,如1033、2052等?!?0”表示支持所有語(yǔ)言。假如 WpsAddonDemo.dll插件支持 WPSOffice的所有模塊,支持簡(jiǎn)體中文,那么它的配 置文件名稱為"”。如果插件需要針對(duì) WPS Office的不同模塊編寫(xiě)不同的配置文件,那么可以按照以上規(guī) 則編寫(xiě)多個(gè)配置文件。插件平臺(tái)優(yōu)先使用精確匹配的插件配置文件,以WpsAddo nDem插件為例,WPS文字啟動(dòng)時(shí),插件平臺(tái)先查找名為""的配置文件,若找不到則繼續(xù)查找名為"”的配置文件,如果都找不到,貝U說(shuō)明該插件不支持 WP敦字。<?xml versio n="1.
30、0" en codi ng="utf-8"?><!-id:插件 DLL 的 CLSID。version:插件的版本號(hào),形式的版本號(hào)。將顯示在插件平臺(tái)對(duì)話框中。type: 必須是 comaddin。author:作者名字。將顯示在插件平臺(tái)對(duì)話框中。n ame:插件名稱。將顯示在插件平臺(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)按鈕。l
31、oadimm:必須是"1 ”。updateitv:檢查更新的時(shí)間間隔,默認(rèn)為 7天。->vksoplug in versio n="1"><propertyid="70D748C8-974D-44C0-8115-9072478A6009"type="comaddi n"name='插件示例” author="WPS"desc="WPS Office 插件簡(jiǎn)介” image="icon .jpg" homepage=" n/addo ns&q
32、uot; help=" n"loadimm="1"updateitv="7" /></ ksoplugin >圖(1)插件屬性示例插件配置文件中至少要包含id、version、type、name四項(xiàng)數(shù)據(jù)。a. id插件id是插件COM!件的CLSID, WPSOffice插件平臺(tái)將根據(jù)id加載插件,獲取 _IDTExte nsibility2接口。b. veri on插件版本號(hào)使用Windows風(fēng)格的命名方式,即主版本號(hào)子版本號(hào)修正版本號(hào)構(gòu)建,如“ ”。插件版本號(hào)會(huì)顯示在插件平臺(tái)對(duì)話框中。c. typetype必須為
33、comaddin,說(shuō)明插件 DLL是一個(gè)COM!件。d. n ame在插件平臺(tái)對(duì)話框中看到的插件名稱。e. loadimmWPS啟動(dòng)時(shí)是否立即加載插件,必須為“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='測(cè)試插件"desc='這是一個(gè)示例插件,用于演示 delphi開(kāi)發(fā)的WP插件。help =' n/addo ns/"loadimm="1"updateitv ="2"/></ksoplugi n>將XML文件保存到與DLL文件相同的目錄中,打開(kāi) WPS點(diǎn)擊插件平臺(tái),選擇“安裝本地插 件”定位到我們的插件目錄,選定“ "文件打開(kāi)就可以了,成功 安裝后,我們會(huì)在插件平臺(tái)和標(biāo)準(zhǔn)工具欄上看到如下變
35、化:珂口址)幫助入反饋®品匾Ji善肘4 丫100器p測(cè)試一測(cè)試二-言臺(tái)呈亙圖癢F插件乎臺(tái)插件列表料薦插件安裝本地插件插件圖片打印機(jī)1-0-00將WFS文檔以團(tuán)片格式按頁(yè)輸出這是我們添加的兩 個(gè)按鈕作者:YulinSoft這是我們的插表格應(yīng)用祥式擁有諸塞配色方案 >一鍵美化你的表格°功能導(dǎo)航:任務(wù)窗格凍格樣式 作者:kincxoft點(diǎn)擊不同的按鈕會(huì)彈出不同的信息框,這說(shuō)明我們的插件開(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)工具欄中添加了兩
36、個(gè)按 鈕,而且這兩個(gè)按鈕似乎與其它的標(biāo)準(zhǔn)按鈕不一樣,晁豈 ii Uu擁t 100 % y測(cè)試一測(cè)試二它沒(méi)有按鈕圖標(biāo),只顯示了按鈕標(biāo)題, 那我們能不能也讓這個(gè)按鈕也和其它按鈕一樣呢?答 案是肯定的,這一節(jié)我們就來(lái)研究一下怎樣讓按鈕顯示圖標(biāo)。一、相關(guān)接口及聲明我們添加的按鈕實(shí)際上是一個(gè)_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這三個(gè)屬性是我們本節(jié)的關(guān)鍵,讓按鈕顯示圖標(biāo)就要看它們了,Style是一個(gè)KsoButto nStyle 類型,匕的聲明如下:typeKsoButt on Style = TOleE num;constksoButt on Automatic =$00000
38、000 ;ksoButtonlcon =$00000001; / 只顯示圖標(biāo)ksoButt on Caption =$00000002 ; / 只顯示標(biāo)題ksoButtonlconAndCaption =$00000003 ; / 顯示圖標(biāo)和標(biāo)題ksoButtonlconAndWrapCaption =$00000007 ;ksoButto nlconAn dCaptio nBelow =$0000000B;ksoButtonWrapCaption =| $0000000E ; |ksoButto nlconAn dWrapCaptio nBelow =$0000000F;我們只關(guān)心我們注釋的
39、三個(gè),其它的不用關(guān)注,因?yàn)槲以跍y(cè)試時(shí)發(fā)現(xiàn)設(shè)為其它值并沒(méi)有 什么特殊的效果。要想讓按鈕顯示按鈕,要先把按鈕的Style設(shè)置為ksoButtonlcon 或ksoButtonlconAndCaption,然后再將FacelD設(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è)按鈕屬性如下:withFBt nTest1dobeginStyle := ksoButt onlconAn dCapti on;Faceld:=2;Caption :='測(cè)試一'ToolTipText :='我的
40、測(cè)試一'Tag := BtnITagld;/這個(gè)標(biāo)記是區(qū)別不同按鈕的end;with FBt nTest2dobeginStyle := ksoButt onlcon;Faceld:=3;Caption :='測(cè)試二'ToolTipText :=J'我的測(cè)試二;Tag := Btn2TagId;/這個(gè)標(biāo)記是區(qū)別不同按鈕的|"|end;然后重新編譯我們插件,再打開(kāi)WPS文字,我們看到了效果如下:Q "測(cè)試一一個(gè)按鈕帶有標(biāo)題,一個(gè)按鈕沒(méi)有標(biāo)題, 它們都顯示了一個(gè)圖標(biāo),那我們?cè)鯓硬拍苤烂總€(gè)FaceId對(duì)應(yīng)的是什么圖標(biāo)呢?下面我們就來(lái)了解這個(gè)內(nèi)容。
41、二、制作FaceId對(duì)照表關(guān)于WPST次開(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 TSimpleAdd in .CreateFacelc on Table;vari:i nteger;doc:_Docume nt;rn g:Ra nge;tmpBt n:
42、_Comma ndBarButt on;/新建一個(gè)文檔beginDoc:=FApp.Docume nts.Add(EmptyParam,False,O,true); doc.Activate;rng.Text:= 'FaceID 與圖標(biāo)對(duì)照表'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:='圖標(biāo)'.Rows.ltem.Ra nge.
43、Fo nt.Bold:=1;/創(chuàng)建一個(gè)臨時(shí)按鈕,它不會(huì)顯示在工具欄上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; /保存文檔,會(huì)彈出保存對(duì)話
44、框tmpBtn:= nil ;end;由于WPS的圖標(biāo)庫(kù)是很大的,所以我們只顯示前255個(gè)圖標(biāo),你如果要顯示更多,可以修改相關(guān)數(shù)值。另外要說(shuō)明的一點(diǎn)是,這個(gè)Faceld只針對(duì) WPS文字,WPS表格和 WPS寅示中顯示的是不同的圖標(biāo),也就是說(shuō)它們使用的不是同一個(gè)圖標(biāo)庫(kù)。重新編譯我們的插件,打開(kāi)WPS點(diǎn)擊“測(cè)試一”按鈕,稍等片刻就會(huì)看到如下表格,你可以把它保存以方便以后查詢。FacelD與圖標(biāo)對(duì)照表FacelD圖標(biāo)1&2血J4週56三、怎樣使用自定義圖標(biāo)既然可以顯示圖標(biāo),那我們能不能使用我們自己的圖標(biāo)呢?答案是肯定的,要使用自 定義圖標(biāo),我們就要使用按鈕的Picture屬性,它是一個(gè)ID
45、ispatch 接口,看來(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);IPictureDisp =in terface (IDispatch)'7BF80981-
46、BF32-101A-8BBB-00AA00300CAB'en d;在創(chuàng)建按鈕的過(guò)程中,我們要聲明一個(gè)TPicture類型的變量和一個(gè)IPictrueDisp 類型的接 口變量,先用 TPicture 來(lái)載入圖片,再用 GetOlePicture 將它轉(zhuǎn)換成IPictureDisp 接口, 然后就可以直接賦值給按鈕的Picture屬性了。為些我們編寫(xiě)了如下函數(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是一個(gè)全路徑的bmp位圖文件名,我們可以將圖片放在插件目錄中,然后動(dòng)態(tài)獲取插件路徑并載入圖片。我們隨便找一個(gè)16*16的圖片并命名為“stop.bmp ”將它保存 到插件目錄中,然后我們用如下語(yǔ)句給按鈕“測(cè)試二”設(shè)定圖標(biāo)為我們的位圖文件。Fbt nTest2.Picture:=GetPicture(ExtractFilePath(GetModuleName(HI nsta nce
48、)+'stop.b mp');重新編譯后我們看到按鈕“測(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 BitMap stop.bmp然后保存為bmpRes.rc,將它保存到我們的插件目錄,同時(shí)保證stop.bmp也在我們的插件目錄。點(diǎn)擊“ Pr
49、ojcet ”一“ Add to project. ” ,在彈出的打開(kāi)文件對(duì)話框中選擇我 們創(chuàng)建的“bmpRes.rc ",將它添加到我們的工程中,這時(shí)SimpleLib.dpr中會(huì)添加一行資源標(biāo)記,如下圖,這說(shuō)明我們添加成功了?!癝TOP的位圖以上步驟,我們只是創(chuàng)建了一個(gè)資源腳本,這個(gè)資源腳本添加一個(gè)名為資源到DLL中(注意名稱為大寫(xiě)),在工程編譯時(shí),編譯器會(huì)編譯"bmpRes.rc ”為標(biāo)準(zhǔn)資源 文件“ bmpRes.res ” ,然后將它鏈接到我們的 dll文件中,我們?cè)诓寮芯涂梢哉{(diào)用了,發(fā) 布插件時(shí)也不用再發(fā)布圖片文件了,因?yàn)樗呀?jīng)存在于我們的dll中了。+ 匚J(有關(guān)資源腳本的相關(guān)文檔,請(qǐng)參閱MSDNSimpleLibuntSimple 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人類的起源和發(fā)展課件2
- 印刷業(yè)科技創(chuàng)新與成果轉(zhuǎn)化考核試卷
- 二零二五年度藝術(shù)品交易居間代理合同樣本3篇
- 2025年創(chuàng)業(yè)創(chuàng)新貸款協(xié)議
- 2025年合作知名作者的高需求小說(shuō)電子書(shū)協(xié)議
- 2025年分銷(xiāo)協(xié)議范例樣本
- 2025年倉(cāng)儲(chǔ)環(huán)保協(xié)議
- 二零二五年度戶外庭院木門(mén)供應(yīng)與安裝服務(wù)合同4篇
- 2025年獎(jiǎng)學(xué)金學(xué)費(fèi)贈(zèng)與合同
- 金牌月嫂2025年度服務(wù)合同3篇
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測(cè) (一)化學(xué)試題(含答案)
- 人教版【初中數(shù)學(xué)】知識(shí)點(diǎn)總結(jié)-全面+九年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案
- 2024年全國(guó)體育單招英語(yǔ)考卷和答案
- 食品安全管理制度可打印【7】
- 2024年九年級(jí)語(yǔ)文中考名著閱讀《儒林外史》考前練附答案
- 抖音麗人行業(yè)短視頻直播項(xiàng)目運(yùn)營(yíng)策劃方案
- 2024年江蘇揚(yáng)州市邗城文化旅游發(fā)展有限公司招聘筆試參考題庫(kù)含答案解析
- 小學(xué)六年級(jí)數(shù)學(xué)100道題解分?jǐn)?shù)方程
- 社區(qū)獲得性肺炎護(hù)理查房?jī)?nèi)科
- 淺談提高中學(xué)生歷史學(xué)習(xí)興趣的策略
- 項(xiàng)目管理實(shí)施規(guī)劃-無(wú)錫萬(wàn)象城
評(píng)論
0/150
提交評(píng)論