Использование AlphaBlend() и FillRect()

Итак, я использую AlphaBlend() для копирования прямоугольника из одного HBITMAP в другой.

Это работает, но есть проблема. Всякий раз, когда я использую функцию FillRect(), альфа-значения в HBITMAP сбрасываются до 0. Каждый раз.

Поэтому я должен GetDIBits(), сбросить альфа обратно на 255, а затем SetDIBits() после каждого вызова функций Win32 API, таких как FillRect().

Итак, есть ли способ создать HBRUSH или иначе сказать FillRect() не трогать значения альфа-канала в HBITMAP, на который он будет рисовать?

1 ответ

Решение

За исключением AlphaBlend... BitBlt - единственная другая функция GDI, которая каким-либо образом сохранит альфа-канал.

Ваши варианты в основном поэтому:

  1. Переключитесь на использование DIBSections. Это не решит основную проблему GISI apis, перекрывающей альфа-канал, но в качестве DIBSection вы можете избежать дорогостоящего преобразования DDB -> DIB -> DDB, необходимого для исправления альфа-канала. DIBSections дают вам доступ как к HBITMAP, так и к разделу памяти, где хранятся биты битовых карт.

  2. Используйте API рисования с поддержкой альфа- канала, например GdiPlus, вместо GDI.

Другие вопросы по тегам