Растровые методы и прозрачность 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);

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

Спасибо.


person Evan Carslake    schedule 14.02.2014    source источник


Ответы (1)


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

На данный момент я собираюсь предположить, что мы можем начать с того, что эти разделы будут разных цветов. На самом деле не имеет значения, какой цвет мы используем для прозрачной части (части, где должен отображаться фон), если он уникален. Сейчас я предполагаю, что это значение 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);
person Jerry Coffin    schedule 14.02.2014