2014-02-14 2 views
3

Недавно я задал вопрос об этом и понял ответ, но не смог перевести его в код. После другого дня возиться с вещами и исправить утечки. Я буквально не могу, потому что жизнь меня это понимает.Win32 C++ BitBlt Растровые методы и прозрачность

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

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); 

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

Спасибо.

ответ

4

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

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

Таким образом, работа становится довольно простой: мы можем использовать TransparentBlt для обработки прозрачности, чтобы вы blit ваш фон в пункт назначения с помощью BitBlt, а затем blit маску в этом месте с помощью 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^