我希望能够将内容打印到两个hdc,比如hdcBuf
和hdcBuf2
。然后,我想BitBlt
hdcBuf
到hdcBuf2
,然后BitBlt
hdcBuf2
到hdc
,这是客户端窗口。这是我现在的代码:
hdc = GetDC(hWnd);
hdcBuf2 = CreateCompatibleDC(hdc);
hbmBackBM2 = CreateCompatibleBitmap(hdc, client.right, client.bottom);
hbmOldBackBM2 = (HBITMAP)SelectObject(hdcBuf2, hbmBackBM2);
hdcBuf = CreateCompatibleDC(hdcBuf2);
hbmBackBM = CreateCompatibleBitmap(hdcBuf2, client.right, client.bottom);
hbmOldBackBM = (HBITMAP)SelectObject(hdcBuf, hbmBackBM);
Graphics g(hdcBuf);
Graphics g2(hdcBuf2);
//drawing stuff with both g and g2
BitBlt(hdcBuf2,0,0,client.right,client.bottom,hdcBuf,0,0,SRCCOPY);
BitBlt(hdc,0,0,client.right,client.bottom,hdcBuf2,0,0,SRCCOPY);
所有HDC和HBITMAP都是全局的,并在WM_DESTROY中正确销毁,而Graphics对象是GDI +
我需要所有这些hdcs的原因是我需要同时打印一个物体而另一个物体。我有一个平铺的地图,在绘图时我会遍历其中的一部分。我需要打印瓷砖和可能在多个瓷砖上的对象,但瓷砖必须位于对象下面。只需一个hdcBuf,我就需要在地图上循环两次才能完成此操作。
现在,我的代码只打印了hdcBuf
的内容,即瓷砖上的对象
在此先感谢您的帮助:)
答案 0 :(得分:0)
BitBlt
使用提供的设备上下文覆盖目标设备上下文的内容。 (或者更确切地说,参数定义的区域内的内容)它不会尝试将两个上下文“混合”在一起。因此,在您第一次致电BitBlt
时,您会在hdcBuf
上绘制内容hdcBuf2
(销毁其内容),然后在hdcBuf2
上绘制hdc
(也摧毁其内容)。
您需要两次遍历地图才能执行此操作。请记住,您的示例也有两个循环 - 它们位于BitBlt
内。
答案 1 :(得分:0)
要将两个来源混合在一起,您需要AlphaBlend功能。它的使用方式与StretchBlt非常相似(与BitBlt相关,但如果在源和目标中不使用相同的大小,则可以选择调整大小)。你必须传递一个BLENDFUNCTION参数如何混合 - constantalpha是最简单的方法。