Delphi 如何防止firemonkey窗体自行绘制(用于调用自己的绘制函数)? 我尝试将现有的OpenGL应用程序从基于VCL的表单转换成基于C++的Builder XE3的FMX表单。

Delphi 如何防止firemonkey窗体自行绘制(用于调用自己的绘制函数)? 我尝试将现有的OpenGL应用程序从基于VCL的表单转换成基于C++的Builder XE3的FMX表单。,delphi,opengl,firemonkey,Delphi,Opengl,Firemonkey,为此,我使用Firemonkey表单的句柄来创建OpenGL设备上下文,并使该表单成为另一个表单的子表单,以模拟我在基于VCL的应用程序中使用的表单内的面板 现在的问题是,在resize事件之后,或者通常在调用Invalidate()之后,表单将与其背景一起呈现。这会导致闪烁,甚至更糟:有时会显示背景,而不是我的OpenGL渲染场景 如何防止在Firemonkey OpenGL窗体的位置重新绘制区域。或者,我可以定义Ownerdraw函数或其他什么吗 请注意,我没有选择使用Firemonkey-

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

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

如何防止在Firemonkey OpenGL窗体的位置重新绘制区域。或者,我可以定义Ownerdraw函数或其他什么吗


请注意,我没有选择使用Firemonkey-3d-Form

您是否尝试过为表单提供透明背景?然后你就可以在上面画你想要的任何东西

快速的方法是将forms Transparent属性设置为True,但这会导致组合框出现问题

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


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

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


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

不确定“Firemonkey”是什么,但它可能有一种绘画方法和擦除背景的方法,就像Windows窗体一样。您需要找到擦除背景消息,覆盖它并确保它不执行任何操作。@Robinson:Firemonkey与Windows窗体类似,但控件是用OpenGL(MacOS)或DirectX(Win)绘制的。因此,它的行为方式完全不同。谢谢你的想法。我两个都试过了。如果切换到透明背景,则不会渲染任何内容(尽管会手动调用OpenGL渲染函数)。
将TRectangle stylename设置为backgroundstyle不会更改任何内容(使用XE3)。我必须在其他地方定义这种风格吗?

你还有其他想法吗?