LoadImage
предназначен для автоматической загрузки значка с наиболее подходящей глубиной цвета, которая соответствует размеру, который вы запрашиваете.Под «наиболее подходящим» я подразумеваю тот, который наилучшим образом соответствует вашим текущим настройкам дисплея.Это почти всегда именно то, что вы хотите, так что функция является одной из тех, которые «просто работает».Скажите ему, какой размер (размеры в пикселях) вы хотите, и он обрабатывает все остальное.Невозможно определить, какую глубину цвета в битах вы хотите использовать.
Если значок такого размера отсутствует, он увеличивается до меньшего.Поскольку это не идеально, последние версии Windows предлагают LoadIconWithScaleDown
API , который в точности соответствует тому, что написано на банке.Это дает лучшие результаты.См. ответ Дэвида Хеффернана здесь для примера использования.
В любом случае.Ваша проблема здесь не связана с функцией LoadImage
.Проблема заключается в флаге LR_LOADREALSIZE
, который вы передаете в функцию.Я не могу найти определение этой константы в заголовочных файлах Windows SDK, но похоже, что она определяется библиотеками Delphi или C ++ Builder.Определение выглядит примерно так:
LR_LOADREALSIZE = $80;
или
#define LR_LOADREALSIZE (Byte)(128)
Это константа с шестнадцатеричным значением 0x80.Проблема в том, что когда вы смотрите документацию для функции LoadImage
, вы видите, что шестнадцатеричное значение 0x80 равно * на самом деле константа LR_VGACOLOR
:
LR_VGACOLOR
0x00000080
Использует истинные цвета VGA.
Описание здесь немного косо - вы должнызнать, что такое "настоящие цвета VGA".Первоначально VGA представлял собой 16-цветную систему отображения, и это то, что здесь подразумевается.Итак, вы получаете 16-цветную версию иконки, потому что вы специально ее запрашиваете.Удалите флаг LR_LOADREALSIZE
(который на самом деле является флагом LR_VGACOLOR
), и все будет работать правильно.Просто передайте 0
в качестве флага (или LR_DEFAULTCOLOR
, который определен как 0).
Примечание: вы не должны жестко кодировать пиксельные размеры, как 32. Вместо этого вы должны вызывать *Функция 1044 * с флагами SM_CXICON
и SM_CYICON
.Это даст вам реальный размер «нормальных» значков в системе.«Обычно», эти значки имеют размер 32x32 пикселей, но это не гарантируется, особенно в нынешнюю эпоху дисплеев с высоким разрешением.Они могут быть еще больше.Если вам нужны маленькие значки (обычно 16x16), используйте вместо них SM_CXSMICON
и SM_CYSMICON
.
В редком случае, когда вы действительно хотите загрузить значок из файла ресурса или ICO с определенным цветным битомглубины, и система не должна автоматически определять глубину цвета для загрузки, вам придется загружать ее вручную, используя последовательность, такую как FindResource
→ LoadResource
→ LockResource
→ CreateIconFromResourceEx
.См. Также «Иконки» Джона Хорника на MSDN (старая статья, но все еще точная для этого материала) и это сообщение в блоге Рэймонда Чена .