如何同时使用三个 HDC

Posted

技术标签:

【中文标题】如何同时使用三个 HDC【英文标题】:How do I use three HDC's together 【发布时间】:2012-12-28 19:41:06 【问题描述】:

我希望能够将内容打印到两个 hdcs,例如 hdcBufhdcBuf2。然后我想BitBlthdcBufhdcBuf2,然后BitBlthdcBuf2hdc,这是客户端窗口。这是我现在拥有的代码:

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

【问题讨论】:

【参考方案1】:

BitBlt 用提供的设备上下文覆盖目标设备上下文的内容。 (或者更确切地说,由参数定义的区域内的内容)它不会尝试将两个上下文“混合”在一起。所以在你第一次调用BitBlt 时,你在hdcBuf2 上绘制hdcBuf 的内容(破坏它的内容),然后你在hdc 上绘制hdcBuf2(也破坏它的内容)。

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何同时使用三个 HDC的主要内容,如果未能解决你的问题,请参考以下文章

请问,如何使用python实现用打印机打印一段文字,且有排版?

如何获取桌面壁纸的hdc,注意是壁纸,不包括图标,我其实是想做windows动态壁纸的程序

有大招,智慧办公新技术将亮相华为开发者大会HDC

OpenHarmony命令行工具hdc_std使用总结

如何使用GDI绘制半透明矩形

OpenHarmony hdc_std无反应的解决办法