ОБНОВЛЕНО ПОСМОТРЕТЬ НИЖЕ ЭТОГО ПОЧТЫ
Я пытаюсь использовать одно черно-белое растровое изображение, чтобы наложить фоновое растровое изображение на белом, а мозаичное наложение на черном. У меня проблема с добавлением оверлея.
и это мой код 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);
Объедините hbmpBackground с hbmMap, используя SRCAND, как вы это делали в 3.
Объедините hbmMapOverlay с инвертированным hbmMap (это должен сделать SRCINVERT).
Объедините эти два результата, используя OR (SRCPAINT)
Хотя это Можно быть сделано с BitBlt
обычно это немного проще в использовании PlgBlt
,
Начать с BitBlt
фоновое растровое изображение к месту назначения. Тогда позвони PlgBlt
, передавая это и растровое изображение переднего плана и маску.