BitBlt + UpdateLayeredWindow и CreateDIBSection с глубиной цвета 16-битного рабочего стола

У меня есть приложение с прозрачным фоном в клиентской области, которое нарисовано черным, потому что окно не слоистое. В каждом из его сообщений WM_PAINT я делаю BitBlt для DC памяти, после чего я использую DC памяти с UpdateLayeredWindow для многослойного окна холста.

настройка памяти-DC:

HDC hdcMemory = CreateCompatibleDC(NULL);
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader,
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0);
SelectObject(hdcMemory, bmpMemory);

В WM_PAINT я использую функцию BitBlt, чтобы скопировать информацию DC о клиентской области приложений в DC памяти. После этого я делаю UpdateLayeredWindow с DC памяти для многоуровневого DC окна холста (это CWnd). Так что это в режиме реального времени, и результат: у меня есть нормальное окно приложения и многоуровневое окно, кроме того, с неправильной формой и прозрачностью на пиксель.

Все отлично работает в 32-битной глубине цвета рабочего стола! Если я переключаюсь на 16-битный режим, окно многослойного холста портится. Чертеж выглядит плохо, и все окно работает по клику.

Кажется, это из-за отсутствия информации об альфа-канале.

Поэтому я так много гуглил для решения. Я обнаружил, что в этой ситуации я должен создать память-DC с

HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

вместо CreateCompatibleDC(NULL). Потому что совместимый DC даст мне 16-битный DC.

Рисовать лучше с CreateDC. Но все окно по-прежнему можно нажимать, а прозрачность в многослойном окне отображается черным цветом.

Так что я думаю, что проблема с BitBlt или BitmapInfoHeader из CreateDIBSection.

  1. Я не знаю, использовать ли BitmapInfoHeader.biBitCount = 32 или BitmapInfoHeader.biBitCount = 16 бит. Думаю, что это 32. А как насчет biCompression -> BI_RGB или BI_BITFIELDS?

  2. Как добавить информацию об альфа-канале в DC-память после BitBlt(..., SRCCOPY) 16-разрядного DC в DC-память, чтобы он работал с UpdateLayeredWindow? (возможно: предварительно умножить каналы rgb на альфа-канал?) Не знаю, как это сделать.


Я немного приблизился к проблеме глубины цвета 16-битного рабочего стола.

HDC hdcMemory = CreateCompatibleDC(NULL);

Выше, кажется, работает. Но результат, который выдает моя функция UpdateLayeredWindow, выглядит грязно.

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

Я сделал тест: я открыл Windows Paint.exe, сделал поверхность шириной и высотой окон и закрасил ее черным цветом.

Затем я положил его под свое многослойное окно (с отсутствующим черным цветом), снова взял многослойное окно в качестве подделанного окна, и да, мое многослойное окно выглядит нормально в сочетании со светящимися черными пикселями Paint.exe.

Итак, у меня истек срок действия BitBlt, и это снова параметр растровой операции. Но не повезло.

Как я могу смешать черный цвет с BitBlt в моем DC до рисования с UpdateLayeredWindow?

1 ответ

Посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa453651.aspx Я убежден, что это проблема с растровой операцией.

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