用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

解决方案 »

  1.   

    以下是C语句,你自己转成DELPHI。总之就是用SHGetFileInfo()API函数
    SHFILEINFO info;
            
    if (!SHGetFileInfo("*.bmp",0,&info,sizeof(info),SHGFI_LARGEICON|SHGFI_ICON|SHGFI_USEFILEATTRIBUTES))
    {//得到大图标
    MessageBox("Failed.");
    return;
    }
      

  2.   

    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;