【发布时间】:2010-10-06 03:58:27
【问题描述】:
我想在我的 dll 中获取常用文件类型的图标。我正在使用 vc++。我只有文件的文件扩展名和 mime 类型,我想根据这些文件获取文件的图标。
有人可以告诉我该怎么做吗? (vc++中可用的方法需要用户提供需要图标的文件的路径。我无权访问任何此类文件)
谢谢。
【问题讨论】:
标签: c++ winapi visual-c++ icons
我想在我的 dll 中获取常用文件类型的图标。我正在使用 vc++。我只有文件的文件扩展名和 mime 类型,我想根据这些文件获取文件的图标。
有人可以告诉我该怎么做吗? (vc++中可用的方法需要用户提供需要图标的文件的路径。我无权访问任何此类文件)
谢谢。
【问题讨论】:
标签: c++ winapi visual-c++ icons
您可以通过调用 SHGetFileInfo() 和 SHGFI_USEFILEATTRIBUTES 标志从 shell 中获取它们 - 此标志允许例程工作而无需实际存在传入的文件名,因此如果您有文件扩展名,只需弥补一个文件名,附加扩展名,然后传入。
通过结合其他标志,您将能够检索:
SHGFI_ICON|SHGFI_LARGEICON 或 SHGFI_ICON|SHGFI_SMALLICON
SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZE 或 SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
SHGFI_SYSICONINDEX
SHGFI_ICONLOCATION
// Load a System Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON);
// Load a System Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON);
// Load a Shell Large icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SHELLICONSIZE);
// Load a Shell Small icon image
SHGetFileInfo( szFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES
| SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON);
如果要绘制这样的图标,请使用以下内容:
// Draw it at its native size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0, NULL, DI_NORMAL );
// Draw it at the System Large size
DrawIconEx( hDC, nLeft, nTop, hIcon, 0, 0, 0,
NULL, DI_DEFAULTSIZE | DI_NORMAL );
// Draw it at some other size (40x40 in this example)
DrawIconEx( hDC, nLeft, nTop, hIcon, 40, 40, 0, NULL, DI_NORMAL );
图标句柄和文件系统路径可以从SHFILEINFO结构中获取:
typedef struct _SHFILEINFOA
{
HICON hIcon; // out: icon
int iIcon; // out: icon index
DWORD dwAttributes; // out: SFGAO_ flags
CHAR szDisplayName[MAX_PATH]; // out: display name (or path)
CHAR szTypeName[80]; // out: type name
} SHFILEINFOA;
请记住,您必须在完成后通过将hIcon 传递给DestroyIcon() 来释放获得的图标。
【讨论】:
从注册表中识别图标信息、关联的文件类型和处理文件的程序并从文件中提取图标。 http://www.codeproject.com/KB/shell/iconextract.aspx
【讨论】: