Blt (), чтобы создать эффект слоя. Не работает. Я использую неправильную логическую функцию или что-то? - PullRequest
3 голосов
/ 08 июня 2009

У меня есть одно окно, к которому обращаются различные объекты для создания многослойного эффекта (представьте себе экранное изображение, на котором один объект рисует компас, другой рисует линии сетки, другой - показания альтиметра и т. Д.). Таким образом, каждый объект имеет растровое изображение черной памяти, к которому он обращается. Когда я вызываю эту функцию Draw объектов, растровое изображение памяти скрывается в окне приложения. Сначала растровые изображения памяти чёрные, и объект рисует на них. Черный - прозрачный цвет, поэтому он замаскирован. Результатом является эффект наложения.

Итак, я использовал OR как свою логическую функцию в функции blt (), и она сработала. Но я заметил, что если предыдущий слой закрашен белым, то слой, который рисует поверх него, выглядит так, как будто он находится под предыдущим слоем. Белый (иш) цвета являются единственными, где этот эффект происходит. Все остальные цвета окрашены правильно (то есть слой выглядит так, как будто он нарисован поверх предыдущего и т. Д.). Кто-нибудь видел это явление?

Ответы [ 4 ]

2 голосов
/ 09 июня 2009

Вы используете не ту функцию для этого. Использование BitBlt с логическим ИЛИ будет работать, если пиксель, который вы пытаетесь перезаписать, окажется черным, но если вы объедините два ненулевых цвета с ИЛИ, вы получите странные результаты. Попробуйте использовать TransparentBlt вместо этого. Эта функция позволяет явно указать, какой цвет должен быть прозрачным.

1 голос
/ 08 июня 2009

Прошло некоторое время с тех пор, как я использовал GDI, но я предполагаю, что вы говорите о функции BitBlt, верно? Что именно вы делаете вместе? Насколько я помню, BitBlt просто берет исходный и целевой HDC, прямоугольники и некоторые флаги.

ИЛИ используете ли вы битовые карты для достижения эффекта наложения? Это не сработает, поскольку оператор OR является ассоциативным и коммутативным. Другими словами,

a | b == b | a

и

(a | b) | c == a | (b | c)

, что означает, что порядок, в котором вы или вещи, не влияет на результат. Вам просто нужно перетаскивать каждое растровое изображение по одному, чтобы получить эффект наложения.

Если это не поможет, я извиняюсь, возможно, я полностью неверно истолковал ваш вопрос, так как это было несколько лет назад, когда я даже смотрел на GDI.

0 голосов
/ 10 июня 2009

Для того, чтобы сделать это, требуется два блика: один для маскировки частей растрового изображения назначения (с использованием пиксельного И), а второй - для пиксельного ИЛИ цветов от наложения к месту назначения.

Сделайте это вручную, вам нужно сделать монохромную маску из наложенного растрового изображения, с белым в прозрачных частях и черным в непрозрачных частях. И маску с назначением, затем ИЛИ данные о цвете из вашего исходного наложения.

screen AND mask OR overlay

И если это для полноэкранного режима, вы можете захотеть сделать композицию в закадровом растровом изображении, чтобы избежать мерцания.

Предложение Питера Рудермана использовать TransparentBlt, вероятно, является хорошим, хотя сам я никогда не пробовал.

0 голосов
/ 10 июня 2009

Зачем беспокоиться о BitBlt и ИЛИ? Просто используйте AlphaBlend (), который дает вам целый байт прозрачности.

...