我如何一起使用三个HDC

时间:2012-12-28 19:41:06

标签: c++ winapi

我希望能够将内容打印到两个hdc,比如hdcBufhdcBuf2。然后,我想BitBlt hdcBufhdcBuf2,然后BitBlt hdcBuf2hdc,这是客户端窗口。这是我现在的代码:

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的内容,即瓷砖上的对象 在此先感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

BitBlt使用提供的设备上下文覆盖目标设备上下文的内容。 (或者更确切地说,参数定义的区域内的内容)它不会尝试将两个上下文“混合”在一起。因此,在您第一次致电BitBlt时,您会在hdcBuf上绘制内容hdcBuf2(销毁其内容),然后在hdcBuf2上绘制hdc(也摧毁其内容)。

您需要两次遍历地图才能执行此操作。请记住,您的示例也有两个循环 - 它们位于BitBlt内。

答案 1 :(得分:0)

要将两个来源混合在一起,您需要AlphaBlend功能。它的使用方式与StretchBlt非常相似(与BitBlt相关,但如果在源和目标中不使用相同的大小,则可以选择调整大小)。你必须传递一个BLENDFUNCTION参数如何混合 - constantalpha是最简单的方法。