【发布时间】: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 然后问一个问题,但它应该是很简单。