用listview显示相关文件图标Windows中对各种不同的文件以不同的图标显示出来,是Windwos操作系统的一大特色,并显得越来越重要,漂亮的图标也为各应用程序增添了不少的特色,如果能在我们自己编制的程序中根据文件的扩展名显示不同的图标,我想是很多编程爱好者非常感兴趣的东西。笔者用Delphi编写了一程序,能在ListItem中根据ListItem的文件名称(不管文件存不存在)的扩展名,获取与文件关联的图标。希望能给予各位参考。打开Delphi新建一工程project1,在表单form1中添加listItem,任意在ListItem中添加Item,比如:file.doc,file.xls,file.zip,file.rar等。
源程序如下: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
源程序如下: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
SHFILEINFO info;
if (!SHGetFileInfo("*.bmp",0,&info,sizeof(info),SHGFI_LARGEICON|SHGFI_ICON|SHGFI_USEFILEATTRIBUTES))
{//得到大图标
MessageBox("Failed.");
return;
}
{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;