提要:在我们的软件开发中,常常需要在界面上放置很多图片,这往往会造成可执行文件大小的大幅度增长。本文通过 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 :
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 )。