winapi — Win32 C ++ BitBlt Прозрачность

ОБНОВЛЕНО ПОСМОТРЕТЬ НИЖЕ ЭТОГО ПОЧТЫ
Я пытаюсь использовать одно черно-белое растровое изображение, чтобы наложить фоновое растровое изображение на белом, а мозаичное наложение на черном. У меня проблема с добавлением оверлея.

Это все части

и это мой код BitBlt (), этот код производит # 5.

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground); // #2
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap); // #1
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay); // #4
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);

Я не уверен, что использую тот же самый «hOldBitmp», но, похоже, он делает то же самое в любом случае.

Прозрачная функция blt здесь также не будет достаточной.

Благодарю.

NEW

У меня были проблемы с объединением и растровкой. Я могу немного справиться с DC и растровыми изображениями, но это одна вещь, которую я не могу понять, как это сделать … Создание dcs памяти и dcs для хранения битовой карты, dc для другой битовой карты, а затем bitblt в mem. Я думаю…

Вот мой избыточный код, который у меня есть на данный момент. На самом деле мне нужна помощь с псевдокодом, как объединить растровые изображения … сколько нужно DC и т. Д ..

buffer.getBufferDC () — это основной контроллер домена, который отображается на экране.

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
HDC hdcMem3 = CreateCompatibleDC(hdc);
HDC hdcMem4 = CreateCompatibleDC(hdc);
HBITMAP hbmMem3 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
HBITMAP hbmMem4 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
ReleaseDC(hWnd, hdc);

// Copy the map and clean the hdcMem
HBITMAP hbmOld;
hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
hbmOld = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCAND);
SelectObject(hdcMem2, hbmOld);

hbmOld = (HBITMAP)SelectObject(hdcMem3, bitmap.hbmMapOverlay);
hbmOld = (HBITMAP)SelectObject(hdcMem4, bitmap.hbmMap);
BitBlt(hdcMem3, 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem4, 0, 0, SRCINVERT);

BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem3, 0, 0, SRCPAINT);
//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCPAINT);
//SelectObject(hdcMem, hbmOld);//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);
//SelectObject(hdcMem, hbmOld);

DeleteDC(hdcMem);
DeleteDC(hdcMem2);
DeleteDC(hdcMem3);
DeleteDC(hdcMem4);

1

Решение

Объедините hbmpBackground с hbmMap, используя SRCAND, как вы это делали в 3.

Объедините hbmMapOverlay с инвертированным hbmMap (это должен сделать SRCINVERT).

Объедините эти два результата, используя OR (SRCPAINT)

3

Другие решения

Хотя это Можно быть сделано с BitBltобычно это немного проще в использовании PlgBlt,

Начать с BitBltфоновое растровое изображение к месту назначения. Тогда позвони PlgBlt, передавая это и растровое изображение переднего плана и маску.

1