我正在尝试在 Windows 中获取高分辨率图标或缩略图,并给出该文件的完整路径。 不需要是缩略图——一个好看的图标会很棒。我不关心它是 HICON
还是 HBITMAP
:我将把它放在 GDI+ 对象中并将其呈现到设备上下文中。
我尝试过使用 SHGetFileInfo
(标志有各种变体),但得到的图标最多只有 ~32x32,它可怕地缩放到我需要的 128 像素左右。
if (!SHGetFileInfoW(path, 0, &fi, sizeof(fi),
SHGFI_ICON | SHGFI_ICONLARGE | SHGFI_TYPENAME))
return GetLastError();
// fi.hIcon is a valid icon here, but it's horrible quality with
// a black mask on it. I want higher quality, and dare I dream of
// alpha channel? Mask is acceptable, i suppose.
当我使用 SHGFI_ICONLOCATION
调用时,SHGetFileInfo
返回 ""
(这似乎是该 API 的一个已知问题)。
我也尝试过使用 SHCreateItemFromParsingName
名称来获取 IThumbnailProvider
,但是 BindToHandler
总是返回 E_NOTIMPL
对于 BHID_ThumbnailHandler
...
IShellItem *psi;
hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
IThumbnailProvider *pThumbProvider;
hr = psi->BindToHandler(NULL, BHID_ThumbnailHandler,
IID_PPV_ARGS(&pThumbProvider));
if (SUCCEEDED(hr))
{
// never get here because hr == E_NOTIMPL !!!
我实际上运行了 Microsoft Thumbnail Providers Sample并发现它遇到与 BindToInterface
相同的问题。
那么,还有什么我可以尝试的建议吗?我只想要一些图片-y 或多或少代表这个文件,比如说,至少 100px 大小——任何比 32x32 更好的东西...
最佳答案
如果您的目标是 Vista 和更高版本,您可以从巨型图像列表中获得一个 256x256 的图标。如果你需要针对 XP,你至少可以使用超大图像列表,它是 48x48(比 32x32 大一点)。
#include <commoncontrols.h>
#include <shellapi.h>
HICON GetHighResolutionIcon(LPTSTR pszPath)
{
// Get the image list index of the icon
SHFILEINFO sfi;
if (!SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX)) return NULL;
// Get the jumbo image list
IImageList *piml;
if (FAILED(SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml))) return NULL;
// Extract an icon
HICON hico;
piml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hico);
// Clean up
piml->Release();
// Return the icon
return hico;
}
关于c++ - 提取文件的高分辨率图标或缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11839588/