2

更新看这篇文章的底部 我正在做的是尝试使用一个黑白位图,在白色上放置背景位图,在黑色上放置瓷砖覆盖。我遇到的问题是添加叠加层。

这是所有的部分

这是我的 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 功能在这里也不能完全满足。

谢谢。

新的

我在组合和栅格化方面遇到了麻烦。我可以在一定程度上处理 DC 和位图,但这是我不知道该怎么做的一件事……创建内存 dcs,以及 dcs 来保存位图,dc 用于另一个位图,然后 bitblt 到内存。我认为...

这是我目前拥有的冗余代码。真的我需要伪代码的帮助,如何组合位图......需要多少个 DC,等等。

buffer.getBufferDC() 是屏幕上显示的主 DC。

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

2 回答 2

4

使用 SRCAND 将 hbmpBackground 与 hbmMap 结合起来,就像您在 3 中所做的那样。

将 hbmMapOverlay 与倒置的 hbmMap 结合使用(SRCINVERT 应该这样做)。

使用 OR (SRCPAINT) 合并这两个结果

于 2014-02-09T22:20:10.990 回答
1

虽然这可以用 来完成BitBlt,但它通常更容易使用PlgBlt

首先BitBlt将背景位图添加到目的地。然后调用PlgBlt,将前景位图和掩码都传递给它。

于 2014-02-10T03:17:07.843 回答