У меня есть код для получения гигантских значков из файла:
// 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_SCALE|ILD_TRANSPARENT, &hico);
Теперь проблема в том, что если путь не имеет значка 256x256, связанного с ним, я не хочу, чтобы значок возвращался ImageList. (Он любезно возьмет 32x32 и поместит его в значок 256x256, который я не могу использовать).
Итак, есть ли способ узнать, есть ли у значка, который (будет) связан с путем, большой значок для него или действительно будет масштабированный 32x32? Если нет, я просто получу обычный системный значок.
ЗАМЕТКА:
Окончательное решение, вдохновленное Джонатаном ниже:
HBITMAP hbitmapForFile(LPCWSTR path, int w, int h)
{
IShellItemImageFactory *pif;
HBITMAP hbm;
SIZE sz = { w, h };
SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&pif));
pif->GetImage(sz, SIIGBF_RESIZETOFIT, &hbm);
pif->Release();
return hbm;
}
Я взял получившийся HBITMAP
и поместил его в элемент управления STATIC с помощью SS_BITMAP
.
Я понял одну важную вещь: вы не можете использовать IShellItemImageFactory
из HookProc. Известное ограничение Windows; Пришлось PostMessage
к окну и потом им пользоваться.
ILD_SCALE
не означает, что его нужно масштабировать? - person user541686   schedule 18.09.2012LookupIconIdFromDirectoryEx
илиPrivateExtractIcons
. - person Jay   schedule 18.09.2012DrawIcon
вместоDrawIconEx
? - person user541686   schedule 19.09.2012PrivateExtractIcons
— отличная идея, за исключением того, что мне нужно пропустить один шаг: Учитывая c:\docs\user\my.doc, как мне получить c:\pf\microsft\office \winword.exe|iconid где находится значок? … Предложения, где искать? Спасибо! - person MarcWan   schedule 19.09.2012GetIconInfo
, а затем изменить размер растрового изображения вручную с помощьюStretchBlt
(масштабированиеHALFTONE
), а затем преобразовать его обратно в значок и нарисовав его с помощьюDrawIcon
. =P Не уверен, что оно того стоит. - person user541686   schedule 19.09.2012IExtractIcon::GetIconLocation
должен сообщить вам местоположение, но использовать его неудобно. :( Взгляните на ReactOS, может быть... как я обычно это что-то вродеLPITEMIDLIST shidl = ILCreateFromPath(normalizedPath);
, затемSHBindToParent(shidl, IID_IShellFolder, &parent, &shidlChild))
, затемparent->GetUIObjectOf(*this, 1, &shidlChild, IID_IExtractIcon, NULL, &pei)
, а затем я используюIExtractIcon
.YMMV. - person user541686   schedule 19.09.2012ILD_SCALE
и попросите его предоставить вам значок исходного размера, затем используйтеGetIconInfo
, чтобы получить растровое изображение значка, иGetObject
, чтобы получить размер растрового изображения. Это должно сказать вам размер значка. - person user541686   schedule 19.09.2012