知道文件的扩展名,怎么从系统中确定它的图标!(10分)

  • 主题发起人 易名烦
  • 开始时间

易名烦

Unregistered / Unconfirmed
GUEST, unregistred user!
知道文件的扩展名,怎么从系统中确定它的图标!
 
用GetIconInfo这个API可得到文件和文件的图标。看看这个API的帮助就清楚了。
 
根据文件的路径获得图标。
function TForm1.GetIconIndex(mPath: string): Integer;
var
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
SHGetFileInfo(PChar(mPath), 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX);
Result := vSHFileInfo.iIcon;
end;

获得系统的图标到ImageList中
function TForm1.GetSystemImageList(mImageList: TImageList): Boolean;
var
mHandle: THandle;
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
mHandle := SHGetFileInfo('', 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
Result := mHandle <> 0;
mImageList.Handle := mHandle;
mImageList.ShareImages := True;
end;
 
呵呵,确是SHGetFileInfo,一时写错了。该打。
 
谢谢两位。
但是我只知道文件的扩展名,它在本机上并不存在。
 
自己UPUP!
 
没有该类扩展名的文件存在? 那么怎么提取图标。
 
既然没有,哪么就默认的WIN的徽标啊!
就象在文件夹选项哪里一样,注册了的文件格式都在哪里,有对应的图标,如果没有的话,
哪么文件的图标就是一个系统默认图标!
 
你可以试试上面写的 “获得系统的图标到ImageList中” 试试看,这是获得[:)]系统[:)]的图标的
 
那你就自己写一个不存在的文件作为 SHGetFileInfo(PChar(mPath), 0, vSHFileInfo,
SizeOf(vSHFileInfo), SHGFI_SYSICONINDEX)中mPath参数吧;
比如,可取得.ymf为扩展名的文件的系统默认图标,就用:
SHGetFileInfo(‘c:/xxx.ymf', 0, vSHFileInfo,
SizeOf(vSHFileInfo), SHGFI_SYSICONINDEX);就行了.
调用SHGetFileInfo函数取得图标好象不需要文件真实存在
 
不存在的文件也可能用这个函数。
 
老师,我用了,找出五个图标,少了点哈![:(]
 
错了!错了!!
文件要存在才行,如下就行了:
procedure TForm1.Button1Click(Sender: TObject);
var
SHFI:TSHFileInfo;
sTmp: tstrings;
begin
sTmp:=tstringlist.create;
try
sTmp.SaveToFile(Edit1.text);
SHGetFileInfo(PChar(edit1.text),0,SHFI,SizeOf(SHFI),SHGFI_ICON or SHGFI_TYPENAME);
Image1.Picture.Icon.Handle:=SHFI.hIcon;
DeleteFile(edit1.text);
finally
sTmp.free;
end;
end;
 
我的一个函数代码,不用真实的文件存在,我一直在用
//得到一个文件的图标索引

function GetIconIndex(const AFile: string; Attrs: DWORD): integer;
//Attrs可以为表示文件或路径FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_DIRECTORY
var
SFI: TSHFileInfo;
begin
SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
Result := SFI.iIcon;
end;
 
多人接受答案了。
 
顶部