Использует ли HDC альфа-канал?

Есть ли способ определить, использует ли 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 четвертые байты всегда равны 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.

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


person Crend King    schedule 25.02.2010    source источник


Ответы (1)


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

person Crend King    schedule 30.05.2010