los*_*sit 11 c++ winapi icons visual-c++
我想在我的dll中获取常见文件类型的图标.我正在使用vc ++.我只有文件的文件扩展名和mime类型,我希望根据该类型获取文件的图标.
有人可以告诉我如何做到这一点?(vc ++中提供的方法需要用户提供需要图标的文件的路径.我无权访问任何此类文件)
谢谢.
new*_*gre 20
你可以通过调用从外壳让他们SHGetFileInfo()与一起SHGFI_USEFILEATTRIBUTES标志-此标志使得例程,而不需要在实际存在通过文件名的工作,所以如果你有一个文件扩展名只是做了一个文件名,追加扩展,并通它在.
通过组合其他标志,您将能够检索:
SHGFI_ICON|SHGFI_LARGEICON或SHGFI_ICON|SHGFI_SMALLICONSHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZE或SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZESHGFI_SYSICONINDEXSHGFI_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);
Run Code Online (Sandbox Code Playgroud)
如果要绘制这样的图标,请使用以下内容:
// 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 );
Run Code Online (Sandbox Code Playgroud)
可以从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;
Run Code Online (Sandbox Code Playgroud)
请记住,你必须通过释放所获得的图标hIcon到DestroyIcon()你用它做了.