Я видел такую информацию из прошлых документов . Я не могу гарантировать, что эта информация точна сейчас.
nIconSize
Указываетжелаемые размеры иконок.Старшее слово - это размеры (как высота, так и ширина, поскольку они всегда одинаковы) маленькой иконки, а младшее слово содержит размеры большой иконки.При нормальных обстоятельствах размер маленького значка будет 16. Большой значок обычно будет 32 или 48, в зависимости от того, в каком режиме просмотра находится Explorer - 32 для режима больших значков, 48 для режима листов.
Похоже, что IExtract IconA:: Extract
может извлекать значки только стандартных размеров.
С другой стороны, обратитесь к старой вещи Раймонда Чена ,
, если вы спроситеIExtractIcon :: Extract для извлечения значка определенного размера, функция может возвращать S_FALSE. Функции ExtractIcon и ExtractIconEx не позволяют указывать пользовательский размер, а LoadImage не работает с индексами значков (только идентификаторы ресурсов).
Поэтому, если вам нужно извлечь значки нестандартных размеров (то есть что-то отличное от «маленьких» и «больших» размеров системы) , то вам нужно будет сделатьбольше работы.
Вызовите функцию SHGetImageList , которая является другой вспомогательной функцией оболочки, но которая извлекает список изображений оболочки, содержащий значки.Это дает вам гораздо больше возможностей для размеров иконок: SHIL_SMALL
(обычно 16x16), SHIL_LARGE
(обычно 32x32), SHIL_EXTRALARGE
(обычно 48x48) и SHIL_JUMBO
(обычно 256x256 - только в Vista и более поздних версиях).Поэтому, если вы попросите SHIL_EXTRALARGE
, вы получите нужные вам иконки 48x48.
Вам все равно понадобится функция SHGetFileInfo , но на этот раз она будетбыть, чтобы получить индекс нужного значка в списке изображений оболочки.Получите это с помощью опции SHGFI_SYSICONINDEX
.
Полностью непроверенный пример кода, никогда не затрагиваемый компилятором:
HICON ExtractExtraLargeIcon(LPCTSTR pszPath)
{
// Determine the index of the desired icon
// in the system image list.
SHGETFILEINFO sfi;
SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);
// Retrieve the system image list.
// (To get 256x256 icons, we use `SHIL_JUMBO`.)
IImageList* piml;
if (SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&piml) == S_OK)
{
HICON hIcon;
if (piml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hIcon) == S_OK)
{
return hIcon;
}
}
// Oops! We failed.
return NULL;
}
Подробнее, пожалуйста, обратитесь:
Разница между ExtractIcon и ExtractAssociatedIcon?Необходимо извлечь значок определенного размера
Извлечь значок высокого разрешения или миниатюру для файла
Обновлено:
Я случайно нашел такой пост , вероятно, указав ширину / высоту, удалив LR_DEFAULTSIZE
.Кроме того, вы должны позвонить DestroyIcon
после DrawIconEx
, иначе вы получите утечку ресурсов.Либо так, либо создайте HICON
в куче, чтобы он создавался только один раз.