使用ImageList 控件

ImageList 控件包含了一个图像的集合,这些图像可以被其它 Windows 公共控件使用,特别是 ListView、TreeView、TabStrip 和 Toolbar 控件。例如,在 Toolbar 控件的按钮上显示的所有图像都可以用 ImageList 控件存储。

如果某个控件将 Picture 对象分配给它的 Picture 属性,那么这样的控件就可以和 ImageList 控件一起使用,例如 PictureBox、Image 和 CommandButton 控件。

将 ImageList 控件作为一个单一的存储库可以节约开发的时间,因为这样可以使编写的代码引用单一和一致的图像目录。不用再编写代码加载位图或图标(使用 LoadPicture 函数),现在只需要充填一次 ImageList,分配需要的 Key 值,并编写使用 Key 或 Index 属性的代码来引用图像。

控件可以使用 ListImage 对象集合中的位图(.bmp)、光标(.cur)、图标(.ico)、JPEG(.jpg) 或 GIF(.gif) 文件。可以在设计时或运行时添加或删除图像。ListImage 对象具有标准的集合对象属性:Key 和 Index。它还具有标准的方法,例如 Add、Remove 和 Clear。

详细信息Visual Basic 程序员指南》中的“利用对象遍程”提供了关于使用对象和集合的介绍信息。

最后,控件提供了 Overlay、Draw 和 ExtractIcon 方法,利用这些方法可以创建组合的图像、在具有 hDC 属性的对象(如 Form 和 Printer 对象)上画图,以及用存储在控件中的位图创建图标。

可能的用途

管理 ListImage 对象和 ListImages 集合

ImageList 控件包含了 ListImage 对象的 ListImages 集合,每个对象都可以通过它的 Index 或 Key 属性值来引用。可以在设计时或运行时向控件中添加或删除图像。

在设计时添加 ListImage 对象

要在设计时添加图像,可以使用 ImageList 控件的“属性页”对话框。

要要在设计时添加 ListImage 对象,请按照以下步骤执行:

  1. 在 ImageList 控件上单击右键并单击“属性”。

  2. 单击“图像”选项卡,显示ImageList 控件的“属性页”,如下所示。

ImageList 控件的“属性页”对话框

  1. 单击“插入图片”显示“选择图片”对话框。

  2. 使用对话框查找位图或图标文件,并单击“打开”。

    注意 可以选择多个位图或图标文件。

  3. 单击“”框并输入一个字符串,为 Key 属性设置一个唯一的属性值。

  4. 可选的。单击“选项卡”框并输入一个字符串,为Tag 属性设置属性值。Tag属性不必唯一。

  5. 重复第3步到第6步,直到在控件中充填了全部想要的图像。

在运行时添加 ListImage 对象

要在运行时添加图像,可以结合 LoadPicture 函数一起使用 ListImages 集合的 Add 方法。下面的示例发生在窗体的 Load 事件中;名为“imlImages”的 ImageList 控件和一个位图一起被加载:

Private Sub Form_Load()
   ' 如果路径是正确的,那么 open.bmp 
   ' 图片将被添加到 ListImages
   ' 集合中。为 Key 属性分配的属性
   ' 值是“打开”
   imlImages.ListImages. _
   Add ,"open", LoadPicture("c:\bitmaps\open.bmp")
End Sub

给 ListImage 对象分配唯一的 Key 属性值,这样可以使创建的代码更具有可读性。在为属性设置图像时可以使用它的 Key 值而不是它的 Index 值。这样,将图像赋给属性的代码看上去就会是下面这样:

'  TreeView 控件的 Node 对象赋一个图像。
' 图像的唯一 key 是“打开”。
TreeView1.Nodes.Add , , ,"Folder1","open"

决定图像的大小

可以向 ImageList 控件中插入任意大小的图像。但是,由第二个控件显示的图像大小将依赖于这样一个因素:第二个该控件是不是绑定到 ImageList 控件上的 Windows 公用控件。

如果 ImageList 控件绑定到了另一个 Windows 公用控件上,那么就可以向控件中添加不同尺寸的图像,但是在相关的 Windows 公用控件中显示的图像尺寸将受到第一个添加到 ImageList 中的图像大小的限制。例如,如果向 ImageList 控件中添加了尺寸为16乘16像素的图像,然后将 ImageList 绑定到 TreeView 控件上(用 Node 对象显示),那么所有存储在 ImageList 控件中的图像都将以16乘16像素的尺寸显示,不管它们实际上要大得多还是小得多。

另一方面,如果使用 Picture 对象显示图像,那么存储在 ImageList 控件中的图像都会以它们原来的尺寸显示,不管多大或多小。

注意 和 Image 控件一起使用 ImageList 控件中的图像是一种例外情况。将 Image 控件中的 Stretch 属性设为 True 会使图像的尺寸改变为控件的大小。

在设计时,可以在 ImageList 控件的“属性页”对话框的“通用”选项卡中选择一定的数值,指定控件中图像高度和宽度的像素数。可以选择预定的大小,也可以单击“自定义”并在“高度”和“宽度”框中输入想要的尺寸值来设置图像的大小。只有当 ImageList 中不包含图像时才能这么做。在控件中包含了图像后,试图改变图像的尺寸将导致错误。

创建组合图像的方法

可以使用 ImageList 控件来创建组合图像(图片对象),这个组合图像是由两个图像通过使用 Overlay 方法结合 MaskColor 属性合成的。例如,如果有一个“international no”图像(一个圆中间有一个对角斜杠),那么可以把这个图像放在其它的图像上面,如下所示:

Overlay 方法的语法需要两个参数。第一个参数指定了下面的图像;第二个参数指定了覆盖在第一个图像上的图像。两个参数都可以是 ListImage 对象的 Index 或 Key 属性。

这样,象下面这样编写代码就能够实现上面的效果:

' 组合图像在名为“picOver”的 
' PictureBox控件中出现。雪茄 
' 图像的 Index 值为2; no”符 
' 号的索引值为1ImageList1.MaskColor = vbGreen
Set picOver.Picture = ImageList1.Overlay(2, 1)

也可以使用图像的 Key 属性,代码象下面这样:

' 假设第一个图像的 Key 值是"smokes",第二个图像
' Key 值是"no"Set picOver.Picture = ImageList1.Overlay("smokes","no")

上面这个代码的例子同时也说明了 MaskColor 属性是如何工作的。简单地说,MaskColor 属性指定了当一个图像覆盖在另一个上面时哪一种颜色将变成透明的。“no”图像有一个绿色的背景。这样,在代码指定 MaskColor 为 vbGreen (内部常量)时,图像中的绿色会在组合图像中变成透明的。