如何同时使用三个 HDC
How do I use three HDC's together
我希望能够将内容打印到两个hdcs,例如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);
所有的HDCs和hbitmap都是全局的,并且在WM_DESTROY中被正确地销毁,并且图形对象是GDI+
我需要所有这些hdcs的原因是我需要同时打印东西,一个对象在另一个对象之上。我有一个平铺地图,我在绘制时循环遍历其中的一部分。我需要打印瓷砖,和对象,这可能是在多个瓷砖,但瓷砖必须在对象之下。如果只有一个hdcBuf,我需要循环遍历映射两次。
现在,我的代码只打印hdcBuf
的内容,即tile上的对象。
提前感谢您的帮助:)
BitBlt
用提供的设备上下文覆盖目标设备上下文的内容。(或者更确切地说,是由参数定义的区域内的内容)它不会试图将两种上下文"混合"在一起。因此,在对BitBlt
的第一次调用中,您将hdcBuf
的内容绘制到hdcBuf2
上(破坏其内容),然后将hdcBuf2
绘制到hdc
上(也破坏其内容)。
您需要循环遍历映射两次来完成此操作。记住你的例子也有两个循环——它们就在BitBlt
里面。
要混合两个源文件,需要使用AlphaBlend函数。它的使用非常类似于StretchBlt(与BitBlt相关,但如果您在源和目标中不使用相同的大小,则可以选择调整大小)。你必须传递一个BLENDFUNCTION作为如何混合的参数- constantalpha是最简单的方法。
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 我有三个 getline,但是一旦编译,输入就太多了
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 有没有更好的方法对C++中的三个整数进行排序?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 为什么 getch 在按下函数或箭头键时返回三个值?
- 使用三个数字比较器进行排序
- 我想在C++代码中比较这三个术语
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 我该如何编码,使计算机知道两个名称条目和三个名称条目之间的区别
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 如何通过通用引用或std::forward将这三个c++模板函数合并为一个
- 首先处理第二个和第三个堆与第一个和第二个堆之间的逻辑差异
- 异常处理:如果用户输入不是三个特定字符之一
- 为什么将三个变量与 == 一起比较会计算为 false?
- 重载运算符 new 和运算符 delete 带有三个参数
- 如何同时使用三个 HDC