function TCacheViewXMain.AddIcon(sfLocal,sExt:string):integer;
{AddIcon函数根据sfLocal指定的文件名,将与文件象对应的图标添加到ImageList1
中,并将相应的索引添加到slIcon中
sfLocal 本地文件名,须要获得与该文件相关联的图标局柄}
var
sfi:TSHFileInfo;
i:Integer;
begin
//获得文件的扩展名
i:= slIcon.IndexOf(sExt);
if i>-1 then
Result:=i
else
begin
{获得与sfLocal相关联的文件信息,返回
值保存在sfi中,sfi中的hIcon是文件的关联图标局柄}
SHGetFileInfo(PChar(sExt),FILE_ATTRIBUTE_NORMAL,
sfi, Sizeof(sfi),
(SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON ));
{调用ImageList_AddIcon函数将sfi.hIcon添加到图标列表控件ImageList1中}
i:=ImageList_AddIcon(ImageList1.Handle,sfi.hIcon);
//函数调用成功返回值i为图标在imagelist1中的索引,将slIcon中与索引相同的
//string的值设定为sfLocal的扩展名
if i>-1 then
slIcon.Strings[i]:=sExt;
Result:=i;
end;
end;
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls,ShellAPI,ImgList;
type TForm1 = class(TForm)
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private { Private declarations } p
ublic { Public declarations }
myImageList:TImageList;
end;var Form1: TForm1;
ShFileInfo: TSHFILEINFO;
implementation{$R *.DFM}//获取图标编号
function GetFileIconIndex(FileName:string):integer;
begin
ShGetFileInfo(Pchar(FileName), 0, SHFileInfo,SizeOf( SHFileInfo), SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_SMALLICON); Result:=SHFileInfo.iIcon;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
FStream:TFileStream;
i:integer;
begin
MyImageList:=TImageList.CreateSize(32,32);
myImageList.ShareImages:=True;
myImageList.Handle:=ShGetFileInfo('',0,SHFileInfo, SizeOf(SHFileInfo),SHGFI_LARGEICON or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
ListView1.SmallImages:=myImageList; ListView1.LargeImages:=myImageList; for i:=0 to ListView1.Items.Count-1 do
begin
FStream:=TFileStream.Create('c:\'+ListView1.Items[i].Caption,fmCreate);
FStream.Write(i,sizeof(integer)); FStream.Free;
ListView1.Items.Item[i].ImageIndex:=GetFileIconIndex('c:\'+ListView1.Items[i].Caption);
deletefile('c:\'+ListView1.Items[i].Caption);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
myImageList.Free;
end;
end