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 }
public
{ 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.Caption,fmCreate);
FStream.Write(i,sizeof(integer));
FStream.Free;
ListView1.Items.Item.ImageIndex:=GetFileIconIndex('c:/'+ListView1.Items.Caption);
deletefile('c:/'+ListView1.Items.Caption);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
myImageList.Free;
end;
end.
F5运行之后,程序就会根据ListItem中的Item中的名称提取windows中不同文件关联的图标。
以上程序在Delphi5.0+windows2000测试通过