-----------------------
// FAQ整理:ccrun(老妖)
// 2005.11.30
-----------------------
请教:知道文件扩展名,如何获得在系统中该文件类型的图标?
---------------------------------------------------------------
1. 用SHGetFileInfo函数:
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(sfi));
DWORD Index = SHGetFileInfo("c://boot.ini",
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_ICON);
if (sfi.hIcon != NULL)
{
Image1->Picture->Icon->Handle = sfi.hIcon;
}
2. 查注册表:
比如查找.ini文件的图标:
HKEY_CLASSES_ROOT/inifile/DefaultIcon
%SystemRoot%/System32/shell32.dll,-151
3. 用ExtractAssociatedIcon函数:
HICON GetIconByExt(AnsiString FileExt)
{
bool Exists;
WORD wIndex;
HICON hIcon;
AnsiString file;
file = AnsiString("C://test.") + FileExt;
Exists = FileExists(file);
if(!Exists)
FileClose(FileCreate(file));
hIcon = ExtractAssociatedIcon((HINSTANCE)HInstance, file.c_str(), &wIndex);
if(!Exists)
DeleteFile(file);
return hIcon;
}
SHGetFileInfo、ExtractAssociatedIcon等函数好象不能返回不存在的文件的图标. (如果根据不同的扩展名创建一个假文件, 获取图标后又删除, 未免太不专业了吧)能不能根据扩展名取得相关图标? 或其它方式?请专家指点该如何去做到?
回答:
SHGetFileInfo可以按文件类型取图标,如:
SHFILEINFO sfi;
HIMAGELIST hil;
ZeroMemory(&sfi,sizeof(sfi));
hil = SHGetFileInfo(".zip",
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(sfi),
SHGFI_USEFILEATTRIBUTES|SHGFI_ICON);
取得本身程序所在目录
ExtractFilePath(Application->ExeName) 先用GetModuleFileName()获得程序的全路径,再用AfxGetApp()->m_pszExeName获得程序名