delphi - 结合 Lazarus LCL 和 OpenGL

标签 delphi opengl vcl lazarus

我最近将一个大型程序从 Delphi 移至 Lazarus。大多数错误都已解决,Lazarus/FPC 给我留下了深刻的印象。但有一个错误我不太清楚。

我的应用程序有一个主 OpenGL 窗口和一些补充表单。最初,我使用 Delphi VCL 设计了这些表单,现在我已将它们移至 Lazarus LCL。

编辑:OpenGL 窗口目前不是 LCL 窗体。它是通过调用 Win32 来实现的,并且有自己的消息循环。

根据这行代码,所有窗体都被视为主 OpenGL 窗口的子级:

Form.ParentWindow := OpenGLWindow.h_wnd;

不幸的是,当窗体归 OpenGL 窗口所有时,它们就会消失。当然,OpenGL 窗口以 30fps 的帧速率刷新,这会导致屏幕缓冲区问题。表单正在渲染,然后由 OpenGL 窗口在其顶部渲染。

如果表单不属于主窗口,则问题即可解决。不幸的是,更改所有权对最终用户来说相当具有破坏性(菜单在程序后面丢失等)。

所以我想知道,遇到这样的问题我该从哪里开始呢?我是否需要确保表单有自己的屏幕缓冲区来在其中渲染,或者这是错误的想法?

澄清一些事情:我使用的是 Win32 版本的 LCL,而不是 QT 或类似的东西。 另外,我尝试将表单设置为双缓冲,看看是否有帮助,但没有。

最佳答案

尝试使用Lazarus自带的OpenGlControl。从 componentes 文件夹安装软件包。该组件的工作方式类似于 Tpaint,但它是一个 opengl 上下文。将其放在任何窗体上,该窗体将是一个 opengl 上下文,而且也是一个窗体,可以移动、调整大小等。 查看组件附带的示例。

/蓝色伊卡罗

关于delphi - 结合 Lazarus LCL 和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100454/

相关文章:

multithreading - 防止 Delphi MDI 应用程序在外部 DLL 中创建 TApplication

delphi - 如何让Delphi TWebbrowser组件在IE9模式下运行?

delphi - 如何声明仅存在于 Windows 8 上的外部函数而不会使应用程序在 Windows 7 及更低版本上崩溃?

delphi - 如何正确释放 DragObject

qt - OpenGL 或 OpenGL ES

regex - Borland Builder 6.0 的正则表达式库

delphi - X,Y 字符串的大量组合

c++ - 规范化 "Point"

c++ - openGL:无法在相机前正确绘制球体

delphi - 在 Delphi 5 中将 TDateTimePicker.Font.Style 设置为斜体时出错