Как выбрать глубину цвета значка с помощью LoadImage? - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу загрузить и показать один из значков explorer.exe.

Я использую следующий код (сокращенно):

// resource id definition    

EXP_ICON    = MAKEINTRESOURCE(101);      { Explorer's Icon resource ID      }

// load explorer.exe

ExpInstance := LoadLibraryEx(ExpDirectory,
                             0,
                             LOAD_LIBRARY_AS_IMAGE_RESOURCE);

// load the icon from it

ExpIcon := LoadImage(ExpInstance,
                     MAKEINTRESOURCE(EXP_ICON),
                     IMAGE_ICON,            { load the icon  }
                     32,
                     32,
                     LR_LOADREALSIZE);

Этот код загружает первый найденный значок, который является 16-цветным значком.В группе есть другие значки с большим количеством цветов (256 и 16 миллионов).

Мой вопрос: Можно ли сказать LoadImage(), чтобы загрузить одну из этих иконок (те, которыеиспользовать больше цветов), и если да, то как?

Я пытался изменить EXP_ICON на один из порядковых идентификаторов значков, но если это не идентификатор значков group ,LoadImage() не удается.

У меня нет идей заставить LoadImage() загрузить значок с количеством цветов, которое я хочу.

1 Ответ

0 голосов
/ 11 февраля 2019

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 с определенным цветным битомглубины, и система не должна автоматически определять глубину цвета для загрузки, вам придется загружать ее вручную, используя последовательность, такую ​​как FindResourceLoadResourceLockResourceCreateIconFromResourceEx.См. Также «Иконки» Джона Хорника на MSDN (старая статья, но все еще точная для этого материала) и это сообщение в блоге Рэймонда Чена .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...