Mar*_*Wan 10 c++ windows winapi
我正在尝试在Windows中获得高分辨率图标或缩略图,给出该文件的完整路径.并不需要成为一个缩略图-一个漂亮的图标将是巨大的.我不在乎它是一个HICON
还是一个HBITMAP
:我将把它放在一个GDI +对象中并将其渲染到一个设备上下文中.
我已经尝试使用SHGetFileInfo
(与标志的各种变化),但从来没有得到超过32×32〜图标回来了,这可怕扩展到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.
Run Code Online (Sandbox Code Playgroud)
SHGetFileInfo
""
当我打电话时返回SHGFI_ICONLOCATION
(这似乎是该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 !!!
Run Code Online (Sandbox Code Playgroud)
我实际上运行了Microsoft Thumbnail Providers Sample,发现它遇到了同样的问题BindToInterface
.
那么,关于我还能尝试什么的任何建议?我只想要一些或多或少代表这个文件的图片,例如,至少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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3507 次 |
最近记录: |