提要:在我們的軟件開發中,常常需要在界面上放置很多圖片,這往往會造成可執行文件大小的大幅度增長。本文通過VB組件,將所需要的圖片封裝起來,從而減小可執行文件大小的目的。
關鍵字:資源、資源文件、VB組件、封裝
程序員在開發軟件的時候,常常需要很多圖片來美化程序界面,工具欄,菜單等控件都會用到大量的圖片,按照常規的方法,我們一般通過VB開發環境直接導入需要的圖片,如BMP或圖標文件;這樣做的好處是方便簡單,但也帶來了大幅度增長主執行文件大小的麻煩。另一種方法是通過loadpicture函數動態加載指定目錄下的圖片文件,但把圖片文件和主程序一起發布后很容易被誤刪。那么,有沒有什么方法來防止這些情況的發生呢?
當然有。
資源是指可供我們使用的存儲在計算機內的數據。包括字符串資源、圖標資源、游標資源、位圖資源以及自定義資源(可以是任意類型的文件,如.exe、.doc等類型的文件)。資源文件則是指用來存放各種資源的文件,資源文件源文件的擴展名為.rc,他是一個文本文件,使用任何文本編輯器都可以編輯。通過資源編譯器編譯后的文件擴展名是.res,簡單的說,這個.res文件能把所有指定的資源全部包括進來,更形象一點,就像一個壓縮文件包括很多個文件夾或文件一樣。
VB6.0為我們提供了一個非常好用的工具——資源編輯器。該編輯器不需要我們寫.rc文件而通過一種更直接更友好的可視化操作完成資源的編輯,保存后會自動生成.res文件。
資源文件生成后,我們創建一個ActiveX dll組件,并把該資源文件添加進來。然后,通過相關的函數把資源導出供主程序調用。
下面是整個操作過程。
1、 新建一個ActiveX DLL工程,工程名為:prjPictureRes
2、 依次打開:外接程序->外接程序管理器->VB6.0資源編輯器,雙擊,確定。此時,在工具欄上出現一個資源管理器的按鈕。
3、 點擊“VB資源編輯器”按鈕,出現如下的資源編輯器窗口。
圖1
4、 按圖1所示,添加四個圖標和一個位圖,點擊“保存”,將生成一個擴展名為.res的資源文件,我們將該文件命名為Myres.res。同時,工程資源管理器會出現一個“相關文檔”的節點,如圖2:
圖2
5、 在類模塊class1中,我們寫如下代碼將相應的資源導出。
Public Function LoadRes(resID As Integer, ImgType As Integer) As IPictureDisp
Set LoadRes = LoadResPicture(resID, ImgType)
End Function
其中:參數resID為資源號,ImgType為圖片類型(位圖、圖標或光標),這兩個參數傳入LoadResPicture()函數,下面,對LoadResPicture()簡單講解。
語法:
LoadResPicture(index as integer, format as integer) as IpictureDisp
參數:
index: 必需的。一個整數或字符串,它用來指定資源文件中數據的標識符 (ID) 。ID標識符為 1 的資源保留給應用程序的圖標。
Format: 必需的。一個數值或常數,如下列“設置值”中所描述的,指定返回數據的格式:
常數 值 描述
VbResBitmap 0 位圖資源
vbResIcon 1 圖標資源
vbResCursor 2 光標資源
6、 編譯成prjPictureRes.dll文件。至此,ActiveX DLL文件已經完成。
7、 接下來做一個測試工程,新建一個EXE工程,在窗體上放一個工具欄,用來顯示.DLL文件中的圖標;一個ImageList控件;一個圖像控件(Image),用來顯示.dll文件中的位圖。界面如圖3。
圖3
8、 將剛才完成的prjPictureRes.dll組件通過“工程->引用”的方法加入到工程中。
9、 在窗體的Load事件中寫如下代碼:
Private Sub Form_Load()
Dim objRes As prjPictureRes.Class1
Set objRes = New prjPictureRes.Class1
Dim aImage As ListImage
´設置圖標的高度和寬度
ImageList1.ImageHeight = 24
ImageList1.ImageWidth = 24
´往圖像列表控件中添加圖標(101、102、103、104為資源編號,下同)
Set aImage = ImageList1.ListImages.Add(, , objRes.LoadRes(101, vbResIcon))
Set aImage = ImageList1.ListImages.Add(, , objRes.LoadRes(102, vbResIcon))
Set aImage = ImageList1.ListImages.Add(, , objRes.LoadRes(103, vbResIcon))
Set aImage = ImageList1.ListImages.Add(, , objRes.LoadRes(104, vbResIcon))
´與工具欄關聯
Set Toolbar1.ImageList = ImageList1
´添加工具欄按并設置圖標
Dim aButton As Button
Set aButton = Toolbar1.Buttons.Add(, , "新建", , 1)
aButton.ToolTipText = "新建"
Set aButton = Toolbar1.Buttons.Add(, , "打開", , 2)
aButton.ToolTipText = "打開"
Set aButton = Toolbar1.Buttons.Add(, , "", tbrSeparator)
Set aButton = Toolbar1.Buttons.Add(, , "保存", , 3)
aButton.ToolTipText = "保存"
Set aButton = Toolbar1.Buttons.Add(, , "另存為", , 4)
aButton.ToolTipText = "另存為..."
´設置工具欄其他屬性
Toolbar1.Style = tbrFlat ´以Flat形式顯示
´設置Image1控件屬性
Image1.Stretch = True ´圖片自適應
´將位圖資源加載到Image1控件中(105為資源編號)
Set Image1.Picture = objRes.LoadRes(105, vbResBitmap)
´釋放資源
Set aImage = Nothing
Set aButton = Nothing
Set objRes = Nothing
End Sub
至此,大功告成,一起來欣賞一下我們的最終作品(圖4)。
原文轉自:http://www.anti-gravitydesign.com