如上比如 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;
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
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;
{-----------------------------------------------------------------------------
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 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)
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;
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
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;
{-----------------------------------------------------------------------------
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 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)
AFile写不存在文件名应该也没问题
上边的可以,如果我想得到目录的图标该怎样写呢,我的目录也是虚拟的,在盘中不存在
如mydir 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)
#5
学习
#6
关注
#7
ding
#8
帮顶.