c++ - 在 opengl 子窗口上渲染一个 qt 覆盖窗口

标签 c++ windows qt opengl dwm

我正在寻找一些关于渲染子窗口的信息,特别是关于 OpenGL 如何与 GDI 互操作。我遇到的问题是我基本上有两个窗口,首先,主窗口是在 qt 中创建的,在 qt 内部,托管了一个利用 OpenGL 渲染器的子窗口。
现在我想做的是在我的 OpenGL 窗口顶部托管一个覆盖,所以我用它来覆盖 OpenGL 窗口。我遇到的问题是,当我使用 OpenGL 进行渲染时,OpenGL 生成的图形似乎掩盖了图形区域,包括并有效地撤消了由 qt 合成的图形。
在下图中的蓝色区域是 qt 叠加层,在那张图片中我使用的是 GDI(BeginPaint/EndPaint),所以窗口似乎可以很好地交互。也就是说,窗口顺序似乎是正确的,客户区域是正确的。当我开始使用 Opengl 渲染时,蓝色区域会被 OpenGL 渲染的任何内容所取代。
我所做的基本上是为了创建叠加层我创建了第二个无框,最上面的 QMainWindow ,一旦平台 HWND 被初始化,我就会重新设置它。基本上我将新的窗口父级更改为我的 OpenGL 窗口的同一个父级。
我相信这会做的是,每个窗口都被单独绘制,桌面合成管理器将进行最终合成,基本上避免了臭名昭著的 airspace Microsoft 在其 WPF 框架中记录的问题。

我想知道的是什么可能导致这些问题?在这一点上,我不明白为什么一旦我用 OpenGL 渲染,qt 叠加的像素就会被遮挡,即使 Windows 层次结构应该说让它们合成。我能做些什么来完成我想要的?
enter image description here

最佳答案

在共享可绘制对象上混合 OpenGL 和 GDI 绘图(还包括没有 CS_OWNDC 窗口类样式标志的兄弟/子窗口)从不被支持。这与 Qt 无关,而只是 OpenGL 和 GDI 如何交互。
但更重要的问题是:你为什么不首先使用 Qt 中内置的 OpenGL 支持?从 Qt-5 开始——如果有的话——使用 OpenGL 来绘制所有东西(所有的 UI 元素)。 Qt-5 使得混合 Qt 的东西和 OpenGL 绘图变得微不足道。

关于c++ - 在 opengl 子窗口上渲染一个 qt 覆盖窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030647/

相关文章:

c# - Visual Studio 2012 中是否有任何 C++ 代码提供程序

windows - 使用procrun启动服务 "Network Service"

python - 将 QmouseEvent 转换为 QGraphicsSceneMouseEvent 以进行拖动移动

html - 如何使用 html 列表格式在 qt 工具提示中缩小缩进?

c++ - 使用 Qt 将 HTML 转换为 PDF

c++ - 为什么我的信号槽比 QThreadPool+new+delete 慢?

c++ - 编辑 EDIT 导致程序崩溃

c++ - 无法将参数 1 从 WCHAR 转换为 const char *

javascript - 如何从 Javascript 打开指定路径的 html 文件对话框?

c++ - 使用具有不同编译器版本的 C++ DLL