怎样根据文件的扩展名,找到系统中该类型文件默认的显示图标(文件在硬盘中并不存在)

时间:2022-08-27 23:25:58
怎样根据文件的扩展名,找到系统中该类型文件默认的显示图标
如上比如 test.jpg文件,我想得到其在资源管理器中显示的图标.
应该怎样做. 
因为我自己用了一个listview,里面有虚拟的文件列表(文件在硬盘中不存在),想根据文件扩展名在listview中显示出他在本机系统中的默认图标.
高分请教.

8 个解决方案

#1


调用SHGetFileInfo函数,假设sExt是你的文件名。

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;

#2


你可以参考下这两篇文章:

http://www.netgocn.com/UseIcon.htm
http://hubdog.csdn.net/Recommend/rcFolder.htm

#3


我最近做了一个跟你的要求类似的东西, 以下是相关的部分代码.

{-----------------------------------------------------------------------------
  Procedure: GetFileIcon
  Purpose:   Get File Icon
  Arguments: const Filename:String; SmallIcon:Boolean
  Result:    HICON
  Author:    Cyclone
  Date:      2005-3-11 13:08:57

-----------------------------------------------------------------------------}
function GetFileIcon(const Filename:String; SmallIcon:Boolean):HICON;
var
  info: TSHFILEINFO;
  Flag: Integer;
begin
  if SmallIcon then
    Flag := (SHGFI_SMALLICON or SHGFI_ICON)
  else
    Flag := (SHGFI_LARGEICON or SHGFI_ICON);
  SHGetFileInfo(Pchar(Filename), 0, info, Sizeof(info), Flag);
  Result := info.hIcon;
end;

{-----------------------------------------------------------------------------
  Procedure: TfmMain.GetIconIndex
  Purpose:   Get Icon Index
  Arguments: const FileType: String
  Result:    Integer
  Author:    Cyclone
  Date:      2005-3-3 22:57:05

-----------------------------------------------------------------------------}
function TfmMain.GetIconIndex(const FileType: String): Integer;
var
  i: Integer;
  TempFileName: String;
begin
  for i := 0 to Length(IconComparisonTable) - 1 do
  begin
    if UpperCase(IconComparisonTable[i]) = UpperCase(FileType) then
    begin
      Result := i;
      Exit;
    end;
  end;
  TempFileName := ChangeFileExt(GetSystemTempFileName(GetSystemTempPath, 'Cyc', 10), FileType);
  FileClose(FileCreate(TempFileName));
  try
    FileIcon.Handle := GetFileIcon(TempFileName, False);
    imgLargeDocuments.AddIcon(FileIcon);
    FileIcon.Handle := GetFileIcon(TempFileName, True);
    i := imgSmallDocuments.AddIcon(FileIcon);
    SetLength(IconComparisonTable, i + 1);
    IconComparisonTable[i] := UpperCase(FileType);
    Result := i;
  finally
    DeleteFile(TempFileName);
  end;
end;

#4


谢谢上边的朋友
AFile写不存在文件名应该也没问题
上边的可以,如果我想得到目录的图标该怎样写呢,我的目录也是虚拟的,在盘中不存在
如mydir 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)

#5


学习

#6


关注

#7


ding

#8


帮顶.

#1


调用SHGetFileInfo函数,假设sExt是你的文件名。

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;

#2


你可以参考下这两篇文章:

http://www.netgocn.com/UseIcon.htm
http://hubdog.csdn.net/Recommend/rcFolder.htm

#3


我最近做了一个跟你的要求类似的东西, 以下是相关的部分代码.

{-----------------------------------------------------------------------------
  Procedure: GetFileIcon
  Purpose:   Get File Icon
  Arguments: const Filename:String; SmallIcon:Boolean
  Result:    HICON
  Author:    Cyclone
  Date:      2005-3-11 13:08:57

-----------------------------------------------------------------------------}
function GetFileIcon(const Filename:String; SmallIcon:Boolean):HICON;
var
  info: TSHFILEINFO;
  Flag: Integer;
begin
  if SmallIcon then
    Flag := (SHGFI_SMALLICON or SHGFI_ICON)
  else
    Flag := (SHGFI_LARGEICON or SHGFI_ICON);
  SHGetFileInfo(Pchar(Filename), 0, info, Sizeof(info), Flag);
  Result := info.hIcon;
end;

{-----------------------------------------------------------------------------
  Procedure: TfmMain.GetIconIndex
  Purpose:   Get Icon Index
  Arguments: const FileType: String
  Result:    Integer
  Author:    Cyclone
  Date:      2005-3-3 22:57:05

-----------------------------------------------------------------------------}
function TfmMain.GetIconIndex(const FileType: String): Integer;
var
  i: Integer;
  TempFileName: String;
begin
  for i := 0 to Length(IconComparisonTable) - 1 do
  begin
    if UpperCase(IconComparisonTable[i]) = UpperCase(FileType) then
    begin
      Result := i;
      Exit;
    end;
  end;
  TempFileName := ChangeFileExt(GetSystemTempFileName(GetSystemTempPath, 'Cyc', 10), FileType);
  FileClose(FileCreate(TempFileName));
  try
    FileIcon.Handle := GetFileIcon(TempFileName, False);
    imgLargeDocuments.AddIcon(FileIcon);
    FileIcon.Handle := GetFileIcon(TempFileName, True);
    i := imgSmallDocuments.AddIcon(FileIcon);
    SetLength(IconComparisonTable, i + 1);
    IconComparisonTable[i] := UpperCase(FileType);
    Result := i;
  finally
    DeleteFile(TempFileName);
  end;
end;

#4


谢谢上边的朋友
AFile写不存在文件名应该也没问题
上边的可以,如果我想得到目录的图标该怎样写呢,我的目录也是虚拟的,在盘中不存在
如mydir 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)

#5


学习

#6


关注

#7


ding

#8


帮顶.