Winapi — Win32 C ++ BitBlt Растровые методы и прозрачность

Я недавно задал вопрос по этому поводу и понял ответ, но не смог перевести его в код. После еще одного дня возни с вещами и исправления утечек. Я буквально не могу за свою жизнь понять это, хотя.

Это немного отличается, все, что мне нужно сделать, это получить фоновое растровое изображение под растровым изображением карты.Что я имею

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);

HBITMAP hbmOld2 = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCPAINT);

SelectObject(hdcMem2, hbmOld2);

Моя проблема заключается в комбинировании … создания памяти dcs для сохранения результатов растровых операций. Я не могу обернуть голову вокруг этого, любая помощь будет отличной.

Благодарю.

3

Решение

Вероятно, самая трудная часть этого — прямоугольник в середине. Другие белые области в маске — это места, через которые должен показываться фон, но внутри этого прямоугольника у вас есть белый, где фон должен не показать до конца.

На данный момент, я собираюсь предположить, что мы можем начать с того, что эти секции имеют разные цвета. Это не имеет значения какие цвет, который мы используем для прозрачной части (той части, где должен отображаться фон), пока она уникальна. Сейчас я предполагаю, что это значение RGB для 254, 254, 254 — код не примет его за чистый белый (255, 255, 255), но обычно не различимый визуально.

При этом работа становится довольно простой: мы можем использовать TransparentBlt для обработки прозрачности, поэтому вы перетаскиваете свой фон в место назначения с помощью BitBlt, а затем перетаскиваете свою маску в это место назначения, используя TransparentBlt. Немного упрощая (оставляя без внимания параметры, которые нас пока не волнуют), код выглядит примерно так:

HDC mask, background, combined;

mask =       CreateCompatibleDC(screen);
background = CreateCompatibleDC(screen);
combined =   CreateCompatibleDC(screen);

HBITMAP mask_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_MASK));
HBITMAP back_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_BKGND));
HBITMAP result = CreateCompatibleBitmap(screen);

mask_original = Selectobject(mask, mask_bmp);
back_original = SelectObject(background, back_bmp);
combined_original = SelectObject(combined, result);

BitBlt(background, result, SRCCOPY);
TransparentBlt(mask, result, RGB(254, 254, 254));

BitBlt(result, screen, SRCCOPY);

SelectObject(mask, mask_original);
SelectObject(background, back_original);
SelectObject(combined, combined_original);

DeleteDC(mask);
DeleteDC(background);
DeleteDC(combined):
DeleteObject(result);
4

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

Других решений пока нет …