在应用程序的设计中,我们常常会用到大量的图标、光标和位图资源,如果把它们都作为文件单独存放在硬盘则势必会造成管理上的混乱,甚至应用程序效率的降低,尤其是工具条和TreeView等控件使用的图标和在设计RPG游戏时主角在地图上行走姿态的图片等更是有必要进行集中存放,尽管在Visual
Basic中有很多方法可以做到这一点(比如放到资源文件*.RC中),但ImageList控件无疑是其中一种较为可行的实现途径。
作为Comctl32.ocx文件中的一个ActiveX部件,在使用前要先对该文件进行注册,对于VB的专业版和企业版可以在部件对话框中直接找到该控件,而某些版本可能需要用浏览的方式找到该文件再进行选择。将该控件添加到工具箱并拖放到窗体之后即可为它添加图片对象,实现的途径一是在属性对话框中,按Custom按钮(中文版为“自定义”)并在弹出的对话框中添加图片,另一种则是在代码中利用Add方法来完成:
Object.Add(index,key,picture)
其中Object为ImageList集合中的ListImages对象,index为索引,KEY为标识图标的唯一字符串(即不允许重复),后面二者均为可选参数,Picture为必须指定的待加入图片,例:
Set imgX=ImageList1.ListImages.Add(,Load
Picture_(“C:/Windows/setup.bmp”))
这里要注意的是ImageList控件要求图片的大小相等,否则会对图片强行裁剪,对于在设计阶段就加入图片的情况该控件会以第一次加入的图片大小为准,而对于在运行期间则以代码指定的宽度属性ImageWidth和高度属性ImageHeight为准,也就是说,这两个属性是只写一次属性。把图片加入到ImageList集合中后就可以进行应用了,最常见的是我们把它和Tree
View、TabStrip、ListView和ToolBar等控件相关联,例:
ImageList1.ListImages.Add(,LoadPicture(“new.ico”))
ImageList1.ListImages.Add(,“A”,LoadPicture(“Open,ico”))
TreeView.ImageList=ImageList1 '关联
TreeView.Nodes(3).Image=1 '通过索引引用图片
TreeView.Nodes(5).Image=“A” '通过Key引用图片
这样,我们就可以把TreeView控件中的3节点和5节点的图标分别指定为new.ico和open.ico了,同样的道理,我们还可以为ToolBar等控件建立这种关联:
Set btnX=ToolBar1.Buttons.Add
ToolBar1.ImageList=ImageList1
Set btnX=ToolBar1.Buttons.ADD(,“A”)
运行程序我们可以看到工具条上新添加的前一个按钮是空白的而后一个显示Open.ico图标。
当然,ImageList控件的用途并非仅仅局限于和这几种控件相关联,正如前面提到的,我们可以把RPG游戏主角的各种姿态放入到控件中以进行切换,设主角在集合中几种姿态对应的Key标识分别为“Left”、“Right”、“UP”、“Down”,下面是切换主角姿态的代码:
With ImageList1
.ListImage(“Left”).Draw Picture1.hDC,x,y,imlTransparent
.ListImage(“Right”).Draw Picture1.hDC,imlTransparent
.ListImage(“Up”).Draw Picture1.hDC,imlTransparent
.ListImage(“Down”).Draw Picture1.hDC,imlTransparent
End With
这里使用了一个Draw方法,它将ImageList集合中指定图像绘制到目标设备环境中,其中第一个参数指定目标设备环境(比如例中的Ricture1.hDC,也可为Form1.hDC),第二、三个参数指定在目标设备环境中的起始绘制座标,默认为0,0(左上角),第四个参数指定绘图模式:
常量 值 描述
imlNormal 0 正常的覆盖操作,类似于
Paint Picture的缺省操作
imlFransParent 1 透明,对MaskColor指定的
颜色不予绘制
imlSelected 2 使用系统高亮度颜色抖动
图像
imlFocus 3 绘制抖动图像并剥掉高度
颜色
需要注意的是其中的imlTransparent常量必须在指定UseMaskColor和MaskColor属性时方为有效:
ImageList1.UseMaskColor=True
ImageList1.MaskColor=VbRed
这样,我们就指定了红色作为图片的背景色,当遇到红色时将不予绘制而保存背景。
另外,我们还可以利用Overlay方法从两个图片对象中产生新的图片:
ImageList1.MaskColor=VbBlue
ImageList1.UseMaskColor=True
Set Picture1.Picture=ImageList1.Overlay(1,“A”)
这样,我们就能得到集合中第一个图片和Key为“A”的图片的叠加图像,同时“A”图片的蓝色部分不予绘制,下面是利用ExtractIcon方法创建图标或光标的代码例子:
Set PicA=ImageList1.ListImage(“A”).ExtractIcon
With Form1
.MouseIcon=PicA
.MousePointer=VbCustom
End With
最后还想说明一点的是文中的代码均不能直接独立运行,但限于篇幅我们不可能将所有的代码一一列上,正所谓“授之以鱼莫如授之以渔”,知道实现的方法则已足矣,另外就是ImageList控件还有一个hImageList属性可引用该控件的句柄,其用法很简单,在此不再赘述。
http://www.360doc.com/content/09/0609/09/19147_3824243.shtml