【问题标题】:How to prevent a firemonkey form to draw itself (for calling an own drawing function)?如何防止 firemonkey 表单自己绘制(用于调用自己的绘图函数)?
【发布时间】:2013-01-24 01:22:06
【问题描述】:

我尝试在 C++ Builder XE3 中将现有的 OpenGL 应用程序从基于 VCL 的表单转换为基于 FMX 的表单。

为此,我使用 Firemonkey 表单的句柄来创建 OpenGL 设备上下文,并使该表单成为另一个表单的子表单,以模仿我在基于 VCL 的应用程序中的表单内的面板。

现在的问题是,在调整大小事件之后或通常在调用 Invalidate() 之后,表单会以其背景呈现。这会导致闪烁甚至更糟:有时会显示背景而不是我的 OpenGL 渲染场景。

如何防止在我的 Firemonkey-OpenGL-form 位置重新绘制区域。或者,我可以定义一个 Ownerdraw 函数或其他东西吗?

请注意,我无法选择使用 Firemonkey-3d-Form。

【问题讨论】:

  • 不确定“Firemonkey”是什么,但大概它有绘画方法和擦除背景的方法,就像 Windows 窗体一样。您需要找到擦除背景消息,覆盖它并确保它什么都不做。
  • @Robinson:Firemonkey 类似于 Windows 窗体,但控件使用 OpenGL (MacOS) 或 DirectX (Win) 绘制。因此,它的行为方式完全不同。

标签: delphi opengl firemonkey


【解决方案1】:

是否尝试为表单提供透明背景?然后,您可以“在顶部”绘制任何您想要的东西。

快速的方法是将表单的透明属性设置为 True,但这会导致组合框出现问题。

另一种方法是在窗体上放置一个 TRectangle。将它的 StyleName 设置为“backgroundstyle”。将其 Fill.Color 设置为 claNull。将 Stroke.Thickness 设置为 0。这将替换表单的默认背景样式。

如果您也想绘制自己的边框,则需要研究非客户区样式,但目前我没有指向好的资源的指针。

【讨论】:

  • 感谢您的想法。我都试过了。如果我切换到透明背景,则不会渲染任何内容(尽管手动调用了 OpenGL 渲染函数)。
    将 TRectangle 样式名设置为 backgroundstyle 不会改变任何内容(使用 XE3)。我必须在其他地方定义这种风格吗?

    您还有其他想法吗?
【解决方案2】:

经过数小时的试验,我找到了解决方案:“TCommonCustomForm”具有所需的属性:(1) 它不会自行绘制,(2) 它有一个可用于 OpenGL 初始化的句柄。

我希望这些信息对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多