【问题标题】:Delphi, Firemonkey - How to draw on component canvas outside of paintDelphi,Firemonkey - 如何在绘图之外的组件画布上绘图
【发布时间】:2017-06-30 06:11:03
【问题描述】:

我正在为 Firemonkey 编写我的第一个组件。它是一个非常动态的控件,并且为了尽量减少刷新时间,当一个属性发生变化时,我只想修改受影响的属性而不是重新绘制整个控件。

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

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

组件基于 TControl

【问题讨论】:

    标签: delphi firemonkey


    【解决方案1】:

    您可能不喜欢这样,但您不应该在绘画活动之外进行绘画。所以不要这样做。如果您违反该规则,Windows 会更宽容一些,但您也不应该在 Windows 上这样做。例如,如果您的窗口(部分)隐藏,则不需要更新,操作系统将跳过绘制事件。因此,与其尝试对抗操作系统,不如使用它。而且通常会有更好的选择。

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

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

    【讨论】:

    • 我正在写的内容非常动态。屏幕上显示了 600 个不同的值,并非所有值都同时更新(但可以)。如果我只更新那些发生变化的,那么性能要比如果其中一个发生变化而必须全部更新要好得多。创建 600 个较小的组件也效果不佳。我将操作系统中的绘画用作“全部更新”,就像操作系统发送绘画时通常那样,它是在它不太明显的时候,例如在显示窗口时。所以我想我创建了一个隐藏的位图并将其复制到油漆上。这样油漆会尽可能快 - 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多