河南消防评估单位机构:VB中资源文件的使用方法

来源:百度文库 编辑:中财网 时间:2024/05/08 02:52:05
在几乎所有的Windows应用程序中都拥有资源文件,这些文件定义使用应用程序将要显示很多的用户界面元素,以及提供程序所需要的各种类型数据的存储场所。资源文件在VC应用程序中应用十分广泛,在VB应用中却很少提及它。其实在开发VB应用程序时,一样可以将要用到的字符串、位图、图标和其它类型的数据等做成一个资源文件。因为这样做至少有以下几个优点:(1)提高性能减少内存空间的占用,这是因为字符串、位图、图标和数据可以不必在程序启动或调用窗体时就全部加载,而是根据需要随时从资源文件中加载。(2)将所需要的资源文件中单独存放在一个资源文件中,使用移植程序和更改一些界面显示变得十分简单,不必访问程序的源代码。
  下面就和大家具体谈谈如何在VB中建立和使用资源文件。
  首先,我们先了解一下windows应用程序中一般经常使用的资源:
  位图:位图是用于创建应用程序用户界面的图像。例如,用户可以为工具栏按钮创建一套位图,也可以创建在其它窗口上显示的位图。一般来说,都是在图像编辑器中创建位图,然后再将该位图添加到资源文件中。
  图标:图标是类似于位图的小图像,然而,虽然位图可以具有任意大小的尺寸,但是图标却小得多,通常为16*16像素或32*32像素。图标使用的很多方法与位图一样。然而,图标通常被用作代表最小化应用程序的图象、代表应用程序文档类型的图像和其它类型的应用系统。
  字符串表:就是指文本串的一个表格,通常来说字符串用来显示菜单命令的提示、对话框中和消息框中显示的信息。要访问串表格中的文本串,需引用串的ID,它与定义表格的源文件中的串相联系。
  光标:光标是代表鼠标在屏幕上的位置的图像。尽管windows 系统定义和许多类型的光标,但用户也可以创建自己需要的光标。
  定制资源:定制资源是用户想存储在其应用程序资源文件中的任何类型的数据。这些数据可以是文本文件或二进制文件,用户可以用任何喜欢的方式定制资源。资源文件只是作为存储区域。创建了定制资源,可以避免必须从磁盘文件中加载数据,因为数据随资源文件一起加载。
  对话框:对话框的资源定义包括样式标志(控制对话框外观及行为的值)以及对话框中含控件的大小和位置。
  菜单栏:用户应用程序的菜单栏也可以在资源文件中定义。可以在资源文件中指定命令和命令的ID,以用命令在菜单中的位置。
  加速器:加速器也称为热键。它们是用户快速选取命令时所按下的键,使用热键时,不必在应用程序的菜单中寻找命令。加速器在一个表格中定义,这个表将按键与命令资源的ID联系起来。
  那么在VB开发环境中如何使用这些资源呢?
  1、添加资源文件编辑器,
   启动VB6.0的IDE集成环境,新建一个工种。点选菜单“外接程序”下的“外接程序管理器”,在弹出的对话框的列表框中选择“VB 6资源编辑器”,选择加载并单击“确定“后退出对话框。这样在“工具”菜单栏中就有一项“vb资源编程器”了。打开这个工具就可以进行资源文件的编辑了。
  2、编辑资源文件
  在资源编辑器中编辑资源文件非常简单。它可是编辑我们在上面先提到的位图、图标、光标、字符串及定制资源五种类型的资源,如图1所示:
  在进行编辑时,点击相应的图标就可以添加资源了。
  编辑资源的方法也很容易,以添加图片为例看一看添加位图的方法:点击添加位图按钮,在弹出的对话框中选择一个位图文件,单击“OK”后,位图的添加就完成了,在这里要注意属性按钮,点击它以后,可以选择请语言版本并输入资源的ID号,这个ID号是标识一类资源的唯一编号,必须记住资源的ID号,以使在应用程序中调用。编辑好资源后,关闭资源编辑器,资文件自动加入新建的工种内。另外,也必须将资源文件保存。其它资源的编辑方法也大体上一样。
  3、使用资源文件,在应用程序中调用资源文件与直接使用资源基本上是一致的。对了,在一个工种中只能保存一个资源文件,在使用资源文件之前,请必须保证资源已经加入到资源文件中了。
  调用资源文件中资源的函数有:
  LoadResString 返回一个文本字符串。语法:LoadResString(index) index必需是一个整数,它用来指定资源文件中数据的标识符(即经常提到的ID号),如果ID号为1的资源保留给应用程序图标。
  LoadResPicture 用以从资源 (.res) 文件装载位图、图标或光标。它的语法:
  LoadResPicture(index, format)
  LoadResPicture 函数的语法包含下列部分:
  参数 描述
  index 一个整数或字符串,它用来指定资源文件中数据的标识
   符 (ID) 。ID标识符为 1 的资源保留给应用程序的图标。
  format 必需的。一个数值或常数,如下列“设值"中所描述的,
   指定返回数据的格式。
  用于 format 的设置值有:
   常数 值 描述
  vbResBitmap 位数 0 位图资源
  vbResIcon 图标 1 图标资源
  vbResCursor 2 光标资源
  说明:可以使用 LoadResPicture 函数代替对存储在 Form 或控件的 Picture 属性中的图形的引用。
  LoadResData 返回一个Byte数组,用以从资源 (.res) 文件装载若干可能类型的数据。语法为:
  LoadResData(index, format)
  LoadResData 函数的语法包含下列部分:
  部分 描述
  index 必需的。一个整数或字符串,它用来指定资源文件中数据的标识
   符 (ID)。ID 标识为 1 的资源保留给应用程序的图标。
  Format 必需的。一个数值,它用来按照下列“设置值"中的描述,指定返
   回数据的原始格式。该数值也可以是用户定义资源的字符串名。
  设置值 用于 format 的设置值有:
   设置值 描述
  1 光标资源
  2 位图资源
  3 图标资源
  4 菜单资源
  5 对话框
  6 字符串资源
  7 字体目录资源
  8 字体资源
  9 加速键表
  10 用户定义资源
  12 群组光标
  14 群组图标
  说明:LoadResData 从资源文件装载的数据可以达到 64K。
  最后我们用一个简单的例子来说明这几个函数的用法:
  (1)建立一个窗体,在窗体上放置三个按钮,一个图片框用来显示图片、图标。其属性如图2所示。
  按照前面讲述的方法添加资源文件编辑器并建立工程文件,里面包含一个字符串,位图、图标、光标和一个自定义的资源。
  程序代码如下所示:
  Private Sub cmdLoadData_Click()
  Dim tt As Byte
  End Sub
  Private Sub cmdLoadPicture_Click()
  picTest.Picture = LoadResPicture(101, 1)
  '如何为0表示位图,为2表示光标
  End Sub
  Private Sub cmdLoadstring_Click()
  Dim str As String
  str = LoadResString(101)
  MsgBox str
  End Sub
--------------------------------------------------------

下面详细说明资源文件的使用方法

LoadResData 返回一个Byte数组,用以从资源 (.res) 文件装载若干可能类型的数据。语法为:
  LoadResData(index, format)
  LoadResData 函数的语法包含下列部分:
  部分 描述
  index 必需的。一个整数或字符串,它用来指定资源文件中数据的标识
   符 (ID)。ID 标识为 1 的资源保留给应用程序的图标。
  Format 必需的。一个数值,它用来按照下列“设置值"中的描述,指定返
   回数据的原始格式。该数值也可以是用户定义资源的字符串名。
  设置值 用于 format 的设置值有:
   设置值 描述
  1 光标资源
  2 位图资源
  3 图标资源
  4 菜单资源
  5 对话框
  6 字符串资源
  7 字体目录资源
  8 字体资源
  9 加速键表
  10 用户定义资源
  12 群组光标
  14 群组图标

VB 中资源文件的使用技巧
一、开发中英(简、繁)双版本
  现在比较流行的软件都会有中文版、英文版、繁体版等等多个版本,并可以根据系统的语言自动显示相适应的版本,那么这个功能在 VB 是如何实现得呢的:
1、 首先通过 API 函数GetSystemDefaultLCID 判断系统的语言
Option Explicit
Dim lang As String
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Sub Form_Load()
Dim LocaleID As Long
LocaleID = GetSystemDefaultLCID
Select Case LocaleID
Case &H404
MsgBox "当前系统为:中文繁体", , "语言"
Case &H804
MsgBox "当前系统为:中文简体", , "语言"
lang = "1"
Case &H409
MsgBox "当前系统为:英文", , "语言"
lang = "2"
End Select
End Sub

2、然后程序就可以加载保存在资源文件(这里我们就是使用的这种方法)、注册表、INI 文件、文本文件或其他文件中的各类字符串,以达到达到实现多种语言的目的。
  ⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
  ⑵在 VB 资源编辑器窗口中,点击“编辑字符串表格”输入如下资料:
  标识号 中文(中国)
  101 例子
  102 中文
  103 英文
  201 Ensample
  202 Chinese
  203 English
  ⑶保存资源文件,写如下代码:(自定义装载字符的函数 LoadString)
Sub LoadString()
Me.Caption = LoadResString(Int(lang & "01"))
Command1(0).Caption = LoadResString(Int(lang & "02"))
Command1(1).Caption = LoadResString(Int(lang & "03"))
End Sub

  ⑷怎么样一个简单的中英双版本的程序就做出来了,如果把 lang 的值设置为 1,则显示中文,如果把 lang 的值设置为 2,则显示英文。
ps:更简单实用的方法是:把不同语言文字放在同一个标识号ID对应的不同字符串表格中即可。VB 会自动实现多种语言转换!

二、 直接播放EXE文件中的声音文件
  使用资源文件,可以直接在在EXE文件中播放声音文件(WAV文件),使程序显得更加专业。
  ⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
  ⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加任意的 WAV 文件,再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:
  类型: "WAVE"
  标识号: 102
  语言: 中文(中国)
  ⑶保存资源文件,写如下代码:
Option Explicit
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function sndPlaySoundFromMemory Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
Public Const SND_ASYNC = &H1&
Public Const SND_MEMORY = &H4&
Private Sub Command5_Click() 注释:播放 WAV 文件
Dim bArr() As Byte
bArr = LoadResData(102, "WAVE")
sndPlaySoundFromMemory bArr(0), SND_ASYNC Or SND_MEMORY
End Sub

  ⑷按 F5 运行本程序,点击 Command 按钮,就可以听到你选定的 WAV 文件的声音了。
三、 直接调用各类图标、光标图片
  在一个程序中,我们可能需要调用多个图标、光标、图片文件,一般来说我们主要是使用 ImageList 控件,不过其时使用资源文件是最好的方法(可以少使用一个控件呀)。
  ⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
  ⑵在 VB 资源编辑器窗口中,点击“添加光标”,“添加图标”,“添加位图”,装载所需要的文件。
  ⑶程序代码如下:
Me.Icon = LoadResPicture(101, vbResIcon) 注释:加载图标
Picture1.Picture = LoadResPicture(101, vbResBitmap) 注释:加载位图
Command1.MouseIcon = LoadResPicture(101, vbResCursor) 注释:加载光标

 

 

---------------------------------

---- 一. 资源在软件设计中的作用

---- 在Windows中,一个资源代表一个Windows对象的数据块,每个可执行文件都包含一个资源表,其中列出了该文件中的资源。应用程序中使用的资源通常可分为两大类:二进制资源和字符串资源;字符串资源指在应用程序的用户界面中出现的所有文本,其中包括菜单、对话框以及提示、警告和错误提示信息;二进制资源包括:图标、位图、光标文件、声音、图象及视频等以二进制格式存放的资源。

---- 应用程序中引入资源文件的最初动机是为使应用程序更容易国际化;把应用程序分成两个概念模块:代码模块和数据模块,如下所示:

数据模块+代码模块=产品
用户接口部件+应用程序部件=本地化产品

---- 数据模块包含所有用户界面的字符串资源而不包含代码,相反,代码模块只包含可运行于所有区域的应用程序代码。因而在开发不同语言版本的应用程序时,本地化小组只须把精力花在资源文件上,这样做有以下优点:

---- 高效:由于代码是相同的,因而在开发新的国际化应用程序只须创建新的资源文件,这样可以顺利地开发不同语言版本的应用程序;安全:无论在内部或利用外部公司本地化程序,都可以不用修改代码,这样做可以减少化在国际版测试上的精力;更好的本地化:由于所有的字符串资源都在一个文件中,因此可以提高本地化工作的效率并防止遗漏。

---- 要将应用程序使用的资源从应用程序中分离出来组成数据模块,可以用资源编译器将这些对象合并到一个资源文件里;利用资源文件组织资源,允许你很容易将大量的图形位图和图标文件直接包含在你的项目中,在对他们进行访问时单独加载,能改进加载时间,避免资源在调用窗口时全部加载而加快程序代码执行效率;除此外,还可以增加空间,这是因为字符串、位图、图标和数据可以不必在调用窗口或模块时就全部加载,而是按照需要从资源文件中加载。

---- 二. 资源在资源定义文件的组织与定义

---- 字符串资源和二进制资源的定义语法分别如下:

---- 1. 字符串资源

---- 在资源定义文件里,字符串资源是包含在一个字符串表中的,定义语法格式:

STRINGTABLE   [load_option] [mem_option]
begin
String ID  string
.
.
.
end

---- 参数说明

---- -----load_option 指出资源被装栽的方式:preload(程序执行时立即装载);load on call(资源在被调用时装载,默认方式)。

---- -----mem_option 指定资源被载入内存后是否可以移动和卸载。有三个参数可选:Fixed (指定资源存放在一个固定的内存区域中),Moveable(资源在系统有必要压缩内存时可以被移动),Discardable(资源在不再使用时被卸载);

---- -----StringID 指定一个整数作为识别资源的资源号;

---- -----String 字符串资源,它必须包含再两个双引号之内,而且长度不超过255个字节,一个字符串资源在资源定义文件里只能放在一行之中。

---- 资源编译器编译资源时,是按标签号来分类的,每16个字符串为一段,标签号高12位相同的将被划分为同一段,在装载资源文件时是以段来栽入和卸载的。

---- 资源定义例子:

# define  IDS_HELLO         1
#define   IDS_GOODBYE      2
STRINGTABLE
Begin
IDS_HELLO , “Hello”
IDS_GOODBYE, “goodbye”
End

---- 2.二进制资源

---- 二进制资源是不包含在资源定义文件里的。资源定义文件只包含了一个指向包含该资源的文件的指针,这些指针在资源定义文件里被称为单行声明。

---- 定义语法: nameID keyword [load_option] [mem_option] filename

---- 参数说明:

---- ------nameID 指定一个名字或整数来标识该资源。这个标识号在同类的资源里是唯一的,而在图标类资源中,标识号0是保留号,0号图标资源是应用程序图标。因而,图标类资源的标识号只能从1开始;

---- -----keyword 二进制资源的类别,可以设为以下参数之一:Bitmap (位图文件)、cursor(光标文件)、iocn(图标文件)、sound(声音文件)、video(视频文件);

---- -----load_option 该参数功能与字符串资源对应定义参数相同

---- -----mem_option 该参数功能与字符串资源对应定义参数相同

---- -----fileName 包含资源的文件名,文件名格式采用 MS-DOS的文件名格式,而且必须是全路径文件名,可以用双引号括起来也可以不括起来。

---- 例: 12 Bitmap Picture “c:\disk.map”

---- 3. 资源文件的编译

---- 用资源文件编译器把资源定义文件编译成标准的Windows资源文件后,该资源文件就可以加载到应用项目中被应用程序调用,编译后的文件是标准的资源文件,可由 Microsoft c++和其它大部分的Windows 开发工具使用。编译资源定义文件可以用资源编译器 RC.EXE。

---- 格式:RC/R [option] definition_file source_file

---- ---/R 该参数指定资源文件仅被编译而不连接到可执行文件

---- ---option 此参数为/?则列出资源编译器RC.EXE 的命令行参数;为/fo Name 则指定编译后扩展名为 .RES 的资源文件名;

---- ---definition file 指定被编译的资源定义文件

---- 例: RC /R /fo test.res test.rc