




版權(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"-"Import Type Library.",在彈出的對話框中選擇相應(yīng)的類型庫(如下圖)。以上五個類型庫都要導入,由于每次只能導入一個,所以要分五次導入。“Kingsoft Add-In Designer”是Add-In插件COM接口對象?!癒ingsoft Office 1.0 Object Librar
2、y”是Wps Office 公用對象庫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 對象WPS Office的插件由一個實現(xiàn)了特定接口的DLL、一個XML配置文件以及插件本身需要的其他文件組成。WPS Office 插件DLL實際上是一個實現(xiàn)了_IDTExtensibility2接口的COM組件,這個接口就在我們剛才導入的“K
3、ingsoft 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按鈕。把彈出的類型庫編輯器關(guān)閉,將unit1保存為“untSimple.pas”,此時單元代碼如下: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對象源碼,它目前還沒有實現(xiàn)相關(guān)的接口。下面我們要添加要使用的單元和要實現(xiàn)我接口。將光標
5、定位到uses區(qū)段,在后面添加三個單元的引用,分別是“AddInDesignerObjects_TLB”、“KSO_TLB”、“WPS_TLB”,然后添加接口的實現(xiàn)。 TSimpleAddin = class(TAutoObject, ISimpleAddin, _IDTExtensibility, ICommandBarButtonEvents) protected 實現(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; 實現(xiàn)ICommandBarButtonEvents procedure Click(const Ctrl: CommandBarButton; var CancelDefault:WordBool); stdcall; end; 由于我們要響應(yīng)工具欄按鈕的單擊事件,所以同時添加了ICommandBarButtonEvents接口的實現(xiàn)。現(xiàn)在應(yīng)該說一個插件的框架已經(jīng)完成了,具體實現(xiàn)怎樣的功能,就看我們自己的實現(xiàn)了。3、 實現(xiàn)我們的功能 由于是一個示例插件,所以我們要實現(xiàn)的功能很簡單,就是在標準工具欄上添加兩個按鈕,點擊不同的按鈕彈出不同的信息。在具體實
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; 插件安裝時,WPS Office會將插件DLL注冊(DllRegisterServe
10、r)到系統(tǒng)中。WPS Office啟動時,將通過插件平臺(管理插件的模塊)加載插件。插件平臺通過COM方式創(chuàng)建一個_IDTExtensibility2對象,然后調(diào)用_IDTExtensibility2.OnConnection。插件可以在OnConnection中做一些初始化操作,如添加菜單項、工具欄按鈕等。OnConnection之后,OnStartupComplete將被調(diào)用,至此插件加載完成。WPS關(guān)閉時,插件平臺先后調(diào)用OnBeginShutdown和OnDisconnection。目前,WPS Office插件平臺不會調(diào)用插件的_IDTExtensibility2.OnAddInsU
11、pdate方法。插件實現(xiàn)一個空的OnAddInsUpdate就可以了,即直接返回S_OK,應(yīng)避免在其中編寫其他代碼,以免將來引起兼容問題。下面是對五個方法的詳述(來自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個參數(shù)。第一個參數(shù)Application是宿主程序?qū)ο?;第二個參數(shù)是ext_ConnectMode類型的枚舉值;第三個和第四個參數(shù)目前沒有使用,插件實現(xiàn)OnConnection時必須忽略這兩個參數(shù)。ext_ConnectMode定義了4個常量值,如下所示。 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是插件平臺加載COM插件時傳入OnConnection的。ext_cm_External和ext_cm_CommandLine目前沒有用到。a. ext_cm_StartupWPS啟動時,插件平臺會立即加載COM插件,調(diào)用OnConnection(Application, ext_cm_Startup)。b. ext_cm_AfterStartup用于安裝插件過程。安裝插件時,WPS Office插件平臺會加載插件,并調(diào)用OnConnection(Application, ext_cm_AfterStartup),此時插件
14、要做兩件事情,即安裝后的初始化以及加載初始化。如果插件安裝以后不需要進一步的配置等初始化工作,那么對這個插件而言,不需要區(qū)分ext_cm_AfterStartup和ext_cm_Startup。一般情況下,插件會在OnConnection中添加菜單項或者工具欄按鈕等功能入口。在WPS Office添加的菜單項或者工具欄按鈕,分為“臨時”和“持久”兩種類型。顧名思義,帶有“臨時”屬性的菜單項或工具欄按鈕,在WPS Office重新啟動以后就不存在了;帶有“持久”屬性的菜單項或工具欄按鈕,在WPS Office重新啟動以后,仍然存在。插件添加菜單項和工具欄按鈕時,推薦使用“臨時”的菜單項和工具欄按
15、鈕,在宿主程序關(guān)閉時,插件也不要調(diào)用API刪除菜單或工具欄按鈕。插件添加菜單項或工具欄按鈕時,建議先檢查這些菜單或按鈕是否已經(jīng)存在,以免重復添加。1.2. _IDTExtensibility2.OnStartupComplete插件平臺加載插件過程中,會先后調(diào)用OnConnection和OnStartupComplete。如果插件需要在插件啟動以后(OnConnection執(zhí)行完之后)做一些事情,可以將這些工作放到OnStartupComplete中執(zhí)行。大多數(shù)情況下,插件可以實現(xiàn)一個空的OnStartupComplete即可。1.3. _IDTExtensibility2.OnBeginSh
16、utdownWPS Office關(guān)閉過程中,插件平臺會調(diào)用OnBeginShutdown,通知插件做清理工作,如保存配置、終止未完成的工作、釋放系統(tǒng)資源等。OnBeginShutdown在OnDisconnection之前被調(diào)用。1.4. _IDTExtensibility2.OnDisconnectionOnDisconnection和OnConnection相對應(yīng),插件在OnConnection中添加菜單或工具欄命令、注冊事件通知,OnDisconnection則注銷事件通知。 procedure OnDisconnection(RemoveMode: ext_DisconnectMode
17、; var custom: PSafeArray); safecall; OnDisconnection帶RemoveMode和custom兩個參數(shù)。其中custom參數(shù)目前沒有用到,插件忽略這個參數(shù)即可;第一個參數(shù)RemoveMode是ext_DisconnectMode類型的枚舉值,如下所示: type ext_DisconnectMode = TOleEnum; const ext_dm_HostShutdown = $00000000; ext_dm_UserClosed = $00000001; 目前只用到了ext_dm_HostShutdown。WPS Office關(guān)閉時,插件平臺
18、會調(diào)用插件的_IDTExtensibility2.OnDisconnection(ext_dm_HostShutdown, custum) 方法。前面推薦插件使用“臨時”的菜單和工具欄按鈕。使用“臨時”菜單和按鈕時,插件在處理ext_dm_HostShutdown過程中不需要刪除菜單、按鈕等項目。 了解了以上內(nèi)容,下面開始我們的實現(xiàn),先創(chuàng)建以下類成員變量: FApp : _Application; /我們的WPS文字接口對象 FBtnTest1, FBtnTest2 : _CommandBarButton; /工具欄按鈕對象FConnection1, FConnection2 : Intege
19、r;再添加兩個全局常量const Btn1TagId = 'Btn1' Btn2TagId = 'Btn2'我們要靠它們來辨別是哪個按鈕被點擊了。我們要關(guān)心的具體實現(xiàn)在以下三個函數(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, '您點擊了按鈕一。', '提示', MB_OK + MB_ICONINFORMATION) else if TagId = Btn2TagId then MessageBox(0, '您點擊了按鈕一。', '提示', MB_OK + MB_ICONINFORMATION) else Assert(false, '錯誤的參數(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; 獲取標準工具欄接口 ToolBar := FApp.CommandBars.Item'Standard' as CommandBar; 向標準工具欄對象添加按鈕一 FBtnTest1 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar
22、.Controls.Count+1, True) as _CommandBarButton; 設(shè)置按鈕一屬性 with FBtnTest1 do begin Style := ksoButtonCaption; ToolTipText := '我的測試一' Caption := '測試一' Tag := Btn1TagId; 這個標記是區(qū)別不同按鈕的 end; 將按鈕事件連接到我們實現(xiàn)的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest1, IID_ICommandBarButtonEvents, self
23、, FConnection1); 向插件工具欄對象添加按鈕二 FBtnTest2 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar.Controls.Count+1, True) as _CommandBarButton; 設(shè)置按鈕一屬性 with FBtnTest2 do begin Style := ksoButtonCaption; ToolTipText := '我的測試二' Caption := '測試二' Tag := Btn2TagId; 這個標記是區(qū)別不同按鈕的 end; 將按鈕事件連
24、接到我們實現(xiàn)的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest2, IID_ICommandBarButtonEvents, self, FConnection2); end; Procedure TSimpleAddin.OnDisconnection(RemoveMode:ext_DisconnectMode;var custom: PSafeArray); begin 先斷開事件連接。 InterfaceDisconnect( FBtnTest1, DIID_CommandBarButtonEvents, FConnection1
25、); InterfaceDisconnect( FBtnTest2, DIID_CommandBarButtonEvents, FConnection2); 釋放FApp接口引用。 FApp := nil; end; 代碼編寫至此,我們的DLL文件算是完成了,編譯后就生成了“SimpleLib.dll”,它只實現(xiàn)了簡單的功能,就是在標準工具欄上添加兩個按鈕,點擊不同按鈕會彈出不同的信息框。要把它安裝到我們的WPS Office 2009中,還要編寫一個配置文件,下面我們進行插件配置文件的編寫。四、編寫插件配置文件并安裝WPS Office插件的配置文件是一個符合一定命名規(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插件支持的語言版本,如1033、2052等?!?”表示支持所有語言。假如WpsAddonDemo.dll插件支持WPS Office的所有模塊,支持
27、簡體中文,那么它的配置文件名稱為“WpsAddonDemo”。如果插件需要針對WPS Office的不同模塊編寫不同的配置文件,那么可以按照以上規(guī)則編寫多個配置文件。插件平臺優(yōu)先使用精確匹配的插件配置文件,以WpsAddonDemo插件為例,WPS文字啟動時,插件平臺先查找名為“WpsAddonDemo”的配置文件,若找不到則繼續(xù)查找名為“WpsAddonDemo”的配置文件,如果都找不到,則說明該插件不支持WPS文字。<?xml version="1.0" encoding="utf-8"?><!- id:插件DLL的CLSID。 v
28、ersion:插件的版本號,形式的版本號。將顯示在插件平臺對話框中。 type:必須是comaddin。 author:作者名字。將顯示在插件平臺對話框中。 name:插件名稱。將顯示在插件平臺對話框中。 desc:插件簡介。將顯示在插件平臺對話框中。 image:插件圖標文件(32 X 32),將顯示在WPS插件平臺對話框中。 homepage:插件主頁網(wǎng)址。將在插件平臺對話框中顯示一個主頁按鈕。 help:幫助頁面的網(wǎng)址。將在插件平臺對話框中顯示一個問號按鈕。 loadimm:必須是“1”。 updateitv:檢查更新的時間間隔,默認為7天。-><ksoplug
29、in version="1"><propertyid="70D748C8-974D-44C0-8115-9072478A6009" version="234" type="comaddin" name="插件示例" author="WPS"desc="WPS Office 插件簡介" image="icon.jpg" homepage="help=""loadimm="1
30、"updateitv="7" /></ksoplugin>圖(1) 插件屬性示例插件配置文件中至少要包含id、version、type、name四項數(shù)據(jù)。a. id插件id是插件COM組件的CLSID,WPS Office插件平臺將根據(jù)id加載插件,獲取_IDTExtensibility2接口。b. verion插件版本號使用Windows風格的命名方式,即主版本號子版本號修正版本號構(gòu)建,如“”。插件版本號會顯示在插件平臺對話框中。c. typetype必須為comaddin,說明插件DLL是一個COM組件。d. name在插件平臺對話框中看到的
31、插件名稱。e. loadimm WPS啟動時是否立即加載插件,必須為“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="測試插件" desc="這是一個示例插件,用于演示delphi開發(fā)的WPS插件。" homepage=" help=" loadimm="1" updateitv="2" /></ksoplugin>將XML文件保存到與DLL文件相同的目錄中,打開WPS,點擊插件平臺,選擇“安裝本地插件”,定位到我們的插件目錄,選定“”文件打開就可以了,成功安裝后,我們會在插件平臺和標準工具欄上看到如下變化:點擊不同的按鈕會彈出不同的信息框,這說
33、明我們的插件開發(fā)成功了。(本系列文章在百度空間首發(fā),轉(zhuǎn)載請注明出處。)用Delphi開發(fā)Wps Office 插件(二)在上文中,我們已經(jīng)開發(fā)了一個簡單的WPS插件,它只是在標準工具欄中添加了兩個按鈕,而且這兩個按鈕似乎與其它的標準按鈕不一樣,它沒有按鈕圖標,只顯示了按鈕標題,那我們能不能也讓這個按鈕也和其它按鈕一樣呢?答案是肯定的,這一節(jié)我們就來研究一下怎樣讓按鈕顯示圖標。1、 相關(guān)接口及聲明我們添加的按鈕實際上是一個_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)容,只留下了我們需要的這三個屬性是我們本節(jié)的關(guān)鍵,讓按鈕顯示圖標就要看它們了,Style是一個KsoButtonStyle類型,它的聲明
35、如下:type KsoButtonStyle = TOleEnum; const ksoButtonAutomatic = $00000000; ksoButtonIcon = $00000001; /只顯示圖標 ksoButtonCaption = $00000002; /只顯示標題 ksoButtonIconAndCaption = $00000003; /顯示圖標和標題 ksoButtonIconAndWrapCaption = $00000007; ksoButtonIconAndCaptionBelow = $0000000B; ksoButtonWrapCaption = $000
36、0000E; ksoButtonIconAndWrapCaptionBelow = $0000000F; 我們只關(guān)心我們注釋的三個,其它的不用關(guān)注,因為我在測試時發(fā)現(xiàn)設(shè)為其它值并沒有什么特殊的效果。要想讓按鈕顯示按鈕,要先把按鈕的Style設(shè)置為ksoButtonIcon或ksoButtonIconAndCaption,然后再將FaceID設(shè)為一個整數(shù),它對應(yīng)的是WPS公共圖標庫的圖標索引,具體每個數(shù)字對應(yīng)哪個圖標,我們隨后會具體介紹。繼續(xù)打開上文中的示例代碼,我們設(shè)置添加的兩個按鈕屬性如下: with FBtnTest1 do begin Style := ksoButtonIconAndC
37、aption; FaceId:=2; Caption := '測試一' ToolTipText := '我的測試一' Tag := Btn1TagId; /這個標記是區(qū)別不同按鈕的 end; with FBtnTest2 do begin Style := ksoButtonIcon; FaceId:=3; Caption := '測試二' ToolTipText := '我的測試二' Tag := Btn2TagId; /這個標記是區(qū)別不同按鈕的 end; 然后重新編譯我們插件,再打開WPS文字,我們看到了效果如下:一個按鈕帶有
38、標題,一個按鈕沒有標題,它們都顯示了一個圖標,那我們怎樣才能知道每個FaceId對應(yīng)的是什么圖標呢?下面我們就來了解這個內(nèi)容。2、 制作FaceId對照表關(guān)于WPS二次開發(fā)講到這里,我們似乎還沒有涉及到WPS文檔操作的相關(guān)內(nèi)容,下面我們就制作一個FaceId 與圖標的對照表,以方便我們以后的開發(fā)。繼續(xù)打開上文例子,我們要實現(xiàn)的功能是點擊“測試一”按鈕,WPS將自動新建一個文檔,生成一個對照表。我們新建一個過程“CreateFaceIconTable”,當點擊“測試一”按鈕時會調(diào)用這個過程并生成列表。過程具體實現(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); /新建一個文檔 doc.Activate; rng:=doc.Paragraphs.First.Range; rng.Text:='FaceID與圖標對照表' 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:='圖標' rng.Tables.Item(1).Rows.Item(1).Range.Fo
41、nt.Bold:=1; /創(chuàng)建一個臨時按鈕,它不會顯示在工具欄上 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; /保存文檔,會彈出保存對話框 tmpBtn:=nil; end; 由于WPS的圖標庫是很大的,所以我們只顯示前255個圖標,你如果要顯示更多,可以修改相關(guān)數(shù)值。另外要說明的一點是,這個FaceId只針對WPS文字,WPS表格和WPS演示中顯示的是不同的圖標,也就是說它們使用的不是同一個圖標庫。重新編譯我們的插件,打開WPS,點擊“測試一”按鈕,稍等片刻就會看到如下表格,你可以把它保存以方便以后查詢。3、 怎樣使用自定義圖標 既然可以顯示圖標,那我
43、們能不能使用我們自己的圖標呢?答案是肯定的,要使用自定義圖標,我們就要使用按鈕的Picture屬性,它是一個IDispatch接口,看來我們不能直接將我們的圖片賦值給它。要實現(xiàn)自定義圖標,我們還需要借助一個函數(shù)和一個接口,這個函數(shù)就是GetOlePicture,這個接口是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)建按鈕的過程中,我們要聲明一個TPicture類型的變量和一個IPictrueDisp類型的接口變量,先用TPicture來載入圖片,再用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是一個全路徑的bmp位圖文件名,我們可以將圖片放在插件目錄中,然后動態(tài)獲取插件路徑并載入圖片。我們隨便找一個16*16的圖片并命名為“stop.bmp”將它保存到插件目錄中,然后我們用如下語句給按鈕“測試二”設(shè)定圖標為我們
46、的位圖文件。 FbtnTest2.Picture:=GetPicture(ExtractFilePath(GetModuleName(HInstance)+'stop.bmp');重新編譯后我們看到按鈕“測試二”已經(jīng)變?yōu)槲覀儓D片了,如下圖: 將圖片保存到我們的插件目錄雖然很好,但不利于插件的發(fā)布,最好的方式是將圖片做為資源直接放入我們Dll中,一方面可以防止圖片丟失出錯,另一方面還可以提高載入速度,下面我們將講解如何打包資源到Dll中并調(diào)用。四、打包圖片資源到dll并調(diào)用打開我們的示例插件,點擊“File”“new”,新建一個“Text”文本文件,輸入如下內(nèi)容:STOP Bit
47、Map stop.bmp然后保存為bmpRes.rc,將它保存到我們的插件目錄,同時保證stop.bmp也在我們的插件目錄。點擊“Projcet”“Add to project.”,在彈出的打開文件對話框中選擇我們創(chuàng)建的“bmpRes.rc”,將它添加到我們的工程中,這時SimpleLib.dpr中會添加一行資源標記,如下圖,這說明我們添加成功了。以上步驟,我們只是創(chuàng)建了一個資源腳本,這個資源腳本添加一個名為“STOP”的位圖資源到DLL中(注意名稱為大寫),在工程編譯時,編譯器會編譯“bmpRes.rc”為標準資源文件“bmpRes.res”,然后將它鏈接到我們的dll文件中,我們在插件中就可以調(diào)用了,發(fā)布插件時也不用再發(fā)布圖片文件了,因為它已經(jīng)存在于我們的dll中了。(有關(guān)資源腳本的相關(guān)文檔,請參閱MSDN)關(guān)于調(diào)用資源中的圖片,我們新建了一個函數(shù),內(nèi)容如下:function GetPictureFromRes(const Name: WideString): IPictureDisp; var pic: TPicture; Ipic: IPictureDisp; 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國外貿(mào)服裝行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國在線總有機碳分析儀(TOC)行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國圓形防火閥行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國醫(yī)藥軟包裝行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 財務(wù)部門財務(wù)預算執(zhí)行與監(jiān)督合同
- 智能倉儲設(shè)施建設(shè)與運營服務(wù)合同
- 物流倉儲代理記賬服務(wù)及供應(yīng)鏈管理合作協(xié)議
- 昌平區(qū)城市道路照明設(shè)施維護管理委托協(xié)議
- 上海松江區(qū)天馬山學校招聘教師考試真題2024
- 車輛產(chǎn)權(quán)變更及保險理賠條款合同
- 供應(yīng)商審核自查表+自評回復模版BYD
- 交通事故賠償法律知識講座
- 浙教版 人教版 培智生活語文四年級下冊 部分教案
- ISO 8573-6 2003(en)壓縮空氣 第6部分:氣態(tài)污染物含量測量方法
- 2023江蘇省射陽中等專業(yè)學校工作人員招聘考試真題
- 《機器人學導論》課程教學大綱
- 貴州省遵義市播州區(qū)2022-2023學年三年級下學期期末數(shù)學試卷
- DB44-T 1792-2015 自然保護區(qū)維管束植物多樣性調(diào)查與監(jiān)測技術(shù)規(guī)范
- 生活中的化學知識課件
- 初中體育-武術(shù)十步拳教學課件設(shè)計
- 小學音樂聽課記錄六篇
評論
0/150
提交評論