Delphi, Firemonkey - 如何在油漆之外的组件画布上绘图



我正在为 Firemonkey 编写我的第一个组件。这是一个非常动态的控件,为了保持最短的刷新时间,当属性更改时,我只想修改受影响的属性,而不是重新绘制整个控件。

我发现的第一个问题是,除非你在 Paint 循环中,否则你需要先调用 Canvas.SetMatrix(AbsoluteMatrix(,否则 canvas 函数被引用到父坐标。我不太明白这一点。

第二个问题是,在 OSX 上使用此控件时,除非我调用继承的绘制过程(我重写(,否则画布上的任何更改都不会显示。这在 Win32 中工作正常

组件基于 TControl

你可能不喜欢这样,但你不应该在绘画事件之外绘画。所以不要这样做。如果你打破了这个规则,Windows会更宽容一些,但你也不应该在Windows上这样做。例如,如果窗口(部分(隐藏,则不需要更新,操作系统将跳过绘制事件。因此,与其试图针对操作系统工作,不如使用它。通常有更好的选择。

您可以保留内部"缓存"位图,并根据需要对其进行更新。然后,当绘制事件到来时,您可以绘制整个位图。如果可能,如果需要更改,请在 paint 事件中更新此缓存位图。

如果要暂时突出显示项目,可以在顶部设置一个透明窗口,并在该窗口上绘画。让操作系统窗口管理器为您完成繁重的工作。

最新更新