4

我最近将一个大型程序从 Delphi 转移到了 Lazarus。大部分bug都被整理出来了,Lazarus / FPC给我留下了深刻的印象。但是有一个我无法弄清楚的错误。

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

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

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

Form.ParentWindow := OpenGLWindow.h_wnd;

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

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

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

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

4

1 回答 1

1

尝试使用 Lazarus 自带的 OpenGLControl。从 components 文件夹安装包。这个组件像 Tpaint 一样工作,但它是一个 opengl 上下文。将它放在任何表单上,这个表单将是一个opengl上下文,也是一个表单,可以移动,调整大小等。看看组件附带的示例。

/蓝色伊卡罗

于 2014-05-03T11:56:28.337 回答