【问题标题】:Combining Lazarus LCL and OpenGL结合 Lazarus LCL 和 OpenGL
【发布时间】:2013-06-14 03:01:40
【问题描述】:

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

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

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

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

Form.ParentWindow := OpenGLWindow.h_wnd;

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

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

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

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

【问题讨论】:

  • 将主窗体留在 LCL 中并在主窗体中嵌入 OpenGL 怎么样?
  • 也许吧。这是我正在考虑尝试的事情之一。 opengl窗口是用win32调用实现的,有一个自定义的消息循环(这里我很关心效率),不知道嵌入到表单中会不会对它有什么影响。
  • 仅由 Win32 实现的 OpenGL(主!)窗口很重要!这可能与您的问题有关 - 请编辑您的问题以记录下来。其次,为什么自定义消息循环更高效? VCL 从来没有以缓慢着称,甚至可以追溯到资源受限的 Windows 3 / Delphi 1 天。除非有充分的理由,否则坚持使用表格似乎是个好主意。您也可以使用已知的有效育儿和主窗体系统,您的问题可能会消失。
  • 值得深思,我将更新主要问题。当我还是一名新手程序员时,我做出了这些设计决定。我只是想 100% 确定如果链条中存在薄弱环节,我可以控制它,所以我在最低级别实现了所有内容。 VCL(现在的 LCL)表格是在很久以后才添加到程序中的。
  • 全屏应该很容易——我只熟悉VCL,但你可以轻松地制作一个无边框的表单,在顶部并且与屏幕的大小和位置相同。我 认为 Windows 有一些 API 来通知它它是一个类似游戏的全屏窗口,即防止任务栏出现等。我建议搜索 SO 然后问一个问题,但它应该是很简单。

标签: delphi opengl vcl lazarus


【解决方案1】:

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

/BlueIcaro

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-07-04
    相关资源
    最近更新 更多