Как объединить два HICON в один - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть один HICON, который я хочу использовать в качестве наложения на другой HICON, чтобы создать результат HICON. Результат HICON будет затем использоваться в элементе управления «рисование владельца» (примечание: он не использует списки изображений). Значок наложения имеет цвет прозрачности RGB (0, 255, 0).

Как мне поступить в Native C ++ (я нашел только источники, показывающие, как это сделать с помощью управляемого кода).

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Я в целом согласен с ответом Петерчена, с некоторыми примечаниями:

  1. Нет причин работать с DIB (если вы не синтезируете изображение напрямую, изменяя его биты, а не рисуете с использованием функций GDI).
  2. Вы должны иметь в виду, что GetIconInfo на самом деле создает копии растровых изображений ic not в вашем процессе. Вы несете ответственность за их удаление, когда они больше не нужны.
  3. Если вы не собираетесь передать полученный HICON либо стандартному элементу управления, либо другому процессу - создавать его просто не нужно. Вместо этого лучше работать с растровым изображением (и, возможно, с маской).

Важно понимать разницу между значком и растровым изображением.

  • Растровое изображение - это объект GDI. Это действует в вашем процессе.
  • Значок - это объект User, и его область действия не ограничивается вашим процессом. Он включает растровое изображение и, необязательно, маску.

Существует несколько типов значков:

  1. Самый простой, состоящий из одного растрового изображения, которое рисуется как есть.
  2. Битовая карта + маска, маска помечает сплошные / прозрачные пиксели
  3. 32-битное растровое изображение с альфа-каналом
  4. Монохромное растровое изображение + маска. Битовая карта + маска определяют так называемую операцию AND-XOR (которая выполняется на целевой поверхности).

Чтобы после получения содержимого значка (по GetIconInfo) вы обнаружили фактический тип значка, поскольку каждый из этих параметров требует различной обработки.

1 голос
/ 20 ноября 2010

(1) Наложение значков

Во многих местах Windows API поддерживаются наложенные значки (например, ListView и TreeView с помощью ImageList , также в оболочке )

(2) Как говорит Ганс
Самый прямой путь - это

  • создать DC памяти на растровом изображении
  • Нарисуйте две иконки друг над другом
  • создать значок из растрового изображения

(3), если вы настаиваете

Если вы настаиваете на том, чтобы делать это вручную (хотя я не вижу причин для этого):

  • GetIconInfo, чтобы получить базовые растровые изображения. Обратите внимание, что черно-белые иконки нуждаются в особой обработке
  • GetObject получить БИТМАЗ для HBITMAP. если вы также не настаиваете на обработке различных растровых форматов, вам следует объединить их в разделы DIB.
  • Твоя магия
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...