我最近将一个大型程序从 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/