我正在寻找一些关于渲染子窗口的信息,特别是关于 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 层次结构应该说让它们合成。我能做些什么来完成我想要的?
最佳答案
在共享可绘制对象上混合 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/