我想在我的dll中获取常见文件类型的图标.我正在使用vc ++.我只有文件的文件扩展名和mime类型,我希望根据该类型获取文件的图标.
有人可以告诉我如何做到这一点?(vc ++中提供的方法需要用户提供需要图标的文件的路径.我无权访问任何此类文件)
谢谢.
你可以通过调用从外壳让他们SHGetFileInfo()
与一起SHGFI_USEFILEATTRIBUTES
标志-此标志使得例程,而不需要在实际存在通过文件名的工作,所以如果你有一个文件扩展名只是做了一个文件名,追加扩展,并通它在.
通过组合其他标志,您将能够检索:
由系统配置确定的大图标或小图标:SHGFI_ICON|SHGFI_LARGEICON
或SHGFI_ICON|SHGFI_SMALLICON
由shell配置确定的大图标或小图标:SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SHELLICONSIZE
或SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE
shell图像列表中图标的索引以及相应的图像列表: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()
你用它做了.