HDC использует альфа-канал? - PullRequest
2 голосов
/ 25 февраля 2010

Есть ли способ определить, использует ли HDC альфа-канал? Я читаю Вопрос 333559 и Вопрос 685684 , но их вопросы касаются BITMAP. Очевидно, у некоторых HDC есть альфа-канал (хотя они могут не использовать его. Назовите это «Тип 1»), в то время как другие не имеют («Тип 2»). Я знаю это, делая следующее:

Учитывая HDC,

  1. Создайте совместимый DC и создайте раздел DIB. Выберите созданный HBITMAP в совместимом DC.

  2. BitBlt источник HDC к совместимому DC. Теперь рассмотрим биты раздела DIB. Для HDC типа 2 после каждых 3 байтов всегда есть байт 0 (например, 255 255 255 0); для типа 1 эти байты обычно равны 255 (например, 250 240, 230 255). Чтобы избежать ложных срабатываний, я записываю биты на все 0x80 перед вызовами.

  3. Используйте GetDIBits непосредственно на исходном HDC, укажите HBITMAP как GetCurrentObject (hdc, OBJ_BITMAP). Для обоих типов HDC 4-е байты всегда равны 0.

  4. Измените растровое изображение DC, вызвав ExtTextOut. Для типа 2 ExtTextOut всегда устанавливает 4-ые байты равными 0. Для типа 1 ExtTextOut всегда оставляет их нетронутыми.

Я также заметил, что исходный HDC, создаваемый API-интерфейсами (CreateCompatibleDC (), BeginPaint () ...), всегда имеет тип 2. HDC типа 1 взяты из стандартных элементов управления (например, текста меню). Даже HDC I CreateCompatibleDC из типа 1 становится типом 2.

Итак, с одной стороны, я разочарован тем, что Microsoft не предоставляет равную информацию разработчикам (другой пример может быть, что вы не можете знать направление HBITMAP после его создания), с другой стороны, я все еще интересно, есть ли способ отличить эти HDC.

Спасибо за помощь.

1 Ответ

0 голосов
/ 30 мая 2010

Я просто имитирую поведение GDI, и теперь все работает нормально.

...