刷新、更新和重绘有啥区别?

Posted

技术标签:

【中文标题】刷新、更新和重绘有啥区别?【英文标题】:What's the difference between Refresh, Update and Repaint?刷新、更新和重绘有什么区别? 【发布时间】:2010-11-18 01:42:34 【问题描述】:

我不知道这三种方法中哪一种最适合我。他们都为我工作。有人知道刷新、更新和重绘之间的区别吗?

【问题讨论】:

致你和到目前为止投票赞成的两个人:我知道从 IDE 打开 Delphi 帮助有点慢,但它仍然应该比询问 SO 并等待更快答案。除了引用帮助之外几乎无能为力的答案。 使用 Google 搜索在线文档也是另一种选择。 docs.codegear.com Embarcadero 帮助因其“包含信息的高质量”而臭名昭著。我理解ГошУ,他最好在这里问。 @truthseeker 然后请添加答案。所有的答案都是文档升降机。这个问题在我看来没有任何价值。 @David Heffernan 不同意。 Google 的搜索比大多数文档(包括 Embarcadero 的)更智能。文档虽然显然是一个好的开始,但由于缺乏细节而常常受到限制。 SO 有利于用户讨论。所以不,只是温和地说 RTFM 不一定有帮助。 【参考方案1】:

根据在线文档:

Refresh - 在屏幕上重新绘制控件。

调用 Refresh 方法重绘 立即控制。刷新调用 重绘方法。使用刷新和 可互换地重绘方法。

Repaint - 强制控件在屏幕上重新绘制其图像。

调用 Repaint 来强制控制 立即重新绘制其图像。如果 ControlStyle 属性包括 csOpaque,控件绘制自身 直接地。否则,重绘 方法调用 Invalidate 方法和 然后更新方法,以便任何 下方控件的可见部分 该控件也将被重新绘制。

Update - 立即处理任何待处理的绘制消息。

调用Update来强制控制 之前重新粉刷过,可能 耗时,处理需要 地方。使用更新提供即时 反馈给迫不及待的用户 用于 Windows 绘制消息 到了。

更新不会使 控制,但只是强制重绘 任何地区已经 无效。调用 Repaint 来代替 也使控件无效。

【讨论】:

【参考方案2】:

您的问题已得到解答,但如果您需要良好的性能和更少的闪烁,则应改为调用 Invalidate。它允许 Windows 优化绘制过程。

Invalidate - 完全重绘控件。

当整个控件使用 Invalidate 需要重新粉刷。当超过 控制需求范围内的一个区域 重绘,Invalidate 将导致 整个窗口被重新粉刷 单次通过,避免造成闪烁 通过多余的重绘。没有 调用的性能损失 之前多次无效 控件实际上是重新绘制的。

【讨论】:

【参考方案3】:

根据较旧的 (CBuilder 6) VCL 参考:

Invalidate "Invalidate 通知控件其整个表面需要重绘。调用 Invalidate 可以防止由一系列部分重绘引起的闪烁。在调用 Invalidate 之前多次调用不会造成性能损失控件实际上是重新绘制的”。

在控件更新之前不会发生实际的重绘。要强制立即重绘,请改为调用 Repaint。

重绘“TWinControl::Repaint 调用 Invalidate 方法,然后调用 Update 方法来重绘控件”(稍微解释一下)。

(遗憾的是,旧参考文献比我拥有的新参考文献更好、更完整(CBuilder 2007)。

【讨论】:

以上是关于刷新、更新和重绘有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Kendo-UI图表中的刷新方法和重绘方法有啥区别?

FLTK 值更改和重绘等到回调之后:有啥办法吗?

前端性能优化之重排和重绘

前端性能优化之重排和重绘

前端性能优化之重排和重绘

三个提升网页性能技巧