胡小文
---- 有一张光盘提供了5000多个256色的各种各样的图标的压缩文件,解压后按动物、人物、
计算机、网络等门类分类放置在一个个图标库(icon library)文件(后缀为ICL),使用起来相当不方便。我利用Delphi3.0开发了一个这样的程序,它可以浏览这些图标库所有图标并且把自己所需要的图标以Icon的文件格式保存起来,支持直接从文件夹图标库文件到
程序的拖放,自动建立ICL文件的关联,以后你只要双击ICL文件就可以打开。具体实现过程如下。
---- 一、 文件夹图标库文件到
程序拖放的实现
---- 要使得一个程序可以支持从文件夹的直接拖放,在程序初始化时运行Windows Api函数:dragacceptFiles(handle,true); 其中handle是接受文件拖放的窗口句柄,true表示为接受,false表示拒绝接受。一旦你设置为接受后,程序运行时如果有文件拖放到该窗口,系统将把消息WM_DROPFiles发送到你的程序。
程序中必须对该消息做出处理,可用的Windows Api函数是DragQueryFile和DragFinish,其中DragQueryFile是获取拖放过来的文件名,DragFinish是告诉系统该拖放操作完成。这两个函数和WM_DropFiles消息的详细
资料请查阅Windows Api手册。
---- 二、ICL文件关联建立的实现
---- windows文件关联的建立实际是对
注册表进行一些操作。在HKEY_CLASSES_ROOT中建立一系列的键和设置相关的键值。具体步骤如下:
---- 1、 在HKEY_CLASSES_ROOT中建立".ICL"键,并且默认的键值设置为"ICL_Auto_File";
---- 2、 在HKEY_CLASSES_ROOT中建立"ICL_Auto_File"键,并且默认的键值设置为"图标库关联文件
程序";
---- 3、 在HKEY_CLASSES_ROOT中"ICL_Auto_File"键下设立三级子键:shell-->open--->command;
---- 4、 为command这级子键默认的键值设置为:"< 程序名称 >" 1%。其中程序名包含
程序的绝对路径。
----三、图标库图标的获得
---- 在windows API中有许多获取图标的函数,但能从图标库ICL文件中获取图标的函数是ExtractIconEx,它的格式和参数如下:
Uint ExtractIconExA(lpszFile: PAnsiChar;
nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON;
nIcons: UINT);
lpszFile:图标库的文件名;
Niconindex: 要读取的图标在图标库中的次序(从0开始编号);
PhiconLarge、Phiconsmall:如果读取成功时图标的句柄值;
Nicons:要读取的图标个数,通常设置为1
该函数返回的值如果是0的话表示读取失败。
要枚举一个图标库中的所有图标只要利用以上函数从读取序号0图标、
序号1图标.直到函数返回值为0
---- 四、图标库图标的显示
---- 图标库的图标显示的方法有很多,在Delphi中提供了列表框,用户通过自己绘制列表项来列表实现项非文字显示。方法是:
---- 1、 把列表框的风格(Style)设置为用户自己绘制lbOwnerDrawVariable模式;
---- 2、 重载OnDrawItem和OnMeasureItem事件,OnMeasureItem事件计算列表项显示所需要的方框尺寸高度,OnDrawItem绘制列表项。两个事件都有Index参数,它是对应列表框的列表项次序(从0开始编号)。本人是把图标库图标序号做为列表框的列表项,也就是列表框中的列表项是一组序号。然后通过序号来进行图标的显示处理工作。
---- 五、图标库图标的保存
---- 把图标库中喜欢的图标保存下来,只要利用Ticon类的方法SaveToFile。本人在
程序中设置了Tpopupmenu控件popupmenu1和TsaveDialog控件Savedialog1,把Listbox1的popupmenu属性设置为Popupmenu1,这样当在Listbox1控件右击时弹出Popupmenu1菜单,选择SaveAs菜单项后就可以保存到用户指定的一个文件中。
---- 六、
程序清单及说明
unit iconlibreadsource;
interface
uses
Windows, Messa