在 Windows 桌面应用程序中的 OpenGL 窗口上显示 WPF 控件

Posted

技术标签:

【中文标题】在 Windows 桌面应用程序中的 OpenGL 窗口上显示 WPF 控件【英文标题】:Display WPF controls over OpenGL window in Windows desktop application 【发布时间】:2015-05-22 13:39:02 【问题描述】:

我们正在开发具有全屏 OpenGL 图形的 Windows 桌面应用程序。现在我们想在 OpenGL 上显示一堆控件(箭头、按钮等)。事实证明,这样做非常困难。

大部分教程建议使用 WindowsFormsHost 进行 OpenGL 渲染,我们这样做了:http://www.codeproject.com/Articles/23736/Creating-OpenGL-Windows-in-WPF

不幸的是,现在我们无法在 WindowsFormsHost 上绘制 WPF 控件,互联网上也有很多关于此的讨论:WindowsFormsHost is always the most top from WPF element Render WPF control on top of WindowsFormsHost

有一些技巧可以解决这个问题,但它们看起来都很脏。 有没有一种正确的方法可以直接在 WPF 中绘制 OpenGL 而不会弄乱 Windows 窗体? (我只是不知道为什么你不能直接在 WPF 中使用它)。

简而言之:在 WPF 应用程序中,有没有已知的通过 OpenGL 绘制 UI 的解决方案?

【问题讨论】:

如何将控件渲染到位图目标,然后从中更新 GL 纹理? 你的意思是把我所有的按钮、标签等渲染成位图,然后用我的其余图形在 OpenGL 中渲染它们?这就是我通常所说的“肮脏的黑客”:) 如果有办法避免这种情况,我会很高兴。 Dwayne Need 设法解决了这个问题。我还没有看过他的解决方案。此外,我们所做的只是在 GL 内容上方简单地弹出一个无边框 WPF Window,并跟踪它的位置,以便窗口的位置始终位于 GL 内容的“顶部”。 这不是黑客攻击。这是在图形窗口上显示内容的一种相当标准的方式。这也与实际完成的方式非常相似。 为什么不使用Qt SDK? 【参考方案1】:

创建一个 wpf 窗口。 在后台渲染您的 opengl 视口。 获取 opengl 视口的 Snapshot 并在 WPF 中显示图像。 将 WPF 图像上的所有 UI 事件传输到 opengl 视口。

【讨论】:

以上是关于在 Windows 桌面应用程序中的 OpenGL 窗口上显示 WPF 控件的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL和远程桌面

如何远程连接运行OpenGL/Cuda 等GPU程序

在 Visual C++ 中的 Windows 窗体应用程序上使用 OpenGL

Qt+Windows,Windows 底层默认使用d3d还是opengl?

vs2015中的c#windows窗体应用程序怎么使用OpenGL?

Windows 上的 CMake - 使用导入的目标 OpenGL::GLU 时 FindOpenGL.cmake 中的错误?