Я недавно задал вопрос по этому поводу и понял ответ, но не смог перевести его в код. После еще одного дня возни с вещами и исправления утечек. Я буквально не могу за свою жизнь понять это, хотя.
Это немного отличается, все, что мне нужно сделать, это получить фоновое растровое изображение под растровым изображением карты.
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 для сохранения результатов растровых операций. Я не могу обернуть голову вокруг этого, любая помощь будет отличной.
Благодарю.
Вероятно, самая трудная часть этого — прямоугольник в середине. Другие белые области в маске — это места, через которые должен показываться фон, но внутри этого прямоугольника у вас есть белый, где фон должен не показать до конца.
На данный момент, я собираюсь предположить, что мы можем начать с того, что эти секции имеют разные цвета. Это не имеет значения какие цвет, который мы используем для прозрачной части (той части, где должен отображаться фон), пока она уникальна. Сейчас я предполагаю, что это значение 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);
Других решений пока нет …