刷新、更新和重绘有什么区别?

54

我不知道哪种方法最适合我。它们都可以对我起作用。有人知道“Refresh”、“Update”和“Repaint”之间的区别吗?


13
对于你和目前点赞的两个人:我知道从IDE打开Delphi帮助有点慢,但这仍然比在SO上提问并等待答案要快。答案很可能只是从帮助文档中引用而已,帮助文档反而更能帮到你。 - mghie
6
使用谷歌搜索在线文档也是另一种选择。http://docs.codegear.com/ - stukelly
8
Embarcadero的帮助文档以"高质量且信息量丰富"而闻名。我理解ГошУ更好地在这里在SO上提问。 - truthseeker
3
@David Heffernan 不同意。谷歌拥有比大多数文档(包括 Embarcadero 的文档)更智能的搜索功能。虽然文档显然是一个很好的起点,但通常由于缺乏细节而受到限制。SO 有用户讨论的好处。因此,仅仅平淡地说 RTFM 并不能真正帮助。 - Bizmarck
2
@David,它提到了另一种方法,实际上非常有用。 - Bizmarck
显示剩余9条评论
3个回答

43

根据在线文档:

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

调用Refresh方法可以立即重绘控件。Refresh会调用Repaint方法,两者可以互换使用。

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

调用Repaint方法可以强制控件马上重新绘制。如果ControlStyle属性包含csOpaque,则控件会直接绘制自己。否则,Repaint方法会先调用Invalidate方法,然后再调用Update方法,以便将控件下面任何可见部分的控件也一并重新绘制。

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

调用Update方法可以在进行任何可能耗时的处理之前强制控件重新绘制。使用Update可以为用户提供即时反馈,而无需等待Windows绘图消息到达。

Update不会使控件失效,而只是强制重绘任何已经失效的区域。如果要使控件失效,则应该调用Repaint。


40

您的问题已经得到解答,但如果您需要更好的性能和更少的闪烁,应该调用Invalidate而不是其他方法。这将允许Windows优化绘画过程。

Invalidate - 完全重绘控件。

当整个控件需要重新绘制时,请使用Invalidate。当控件内部的多个区域需要重新绘制时,Invalidate会在单个传递中导致整个窗口被重新绘制,从而避免由冗余重绘引起的闪烁。在控件实际重新绘制之前多次调用Invalidate不会产生性能损失。


4
根据较旧的VCL参考文献(CBuilder 6):
Invalidate:“Invalidate会通知控件需要重新绘制其整个表面。在进行一系列部分重绘时,调用Invalidate可以防止闪烁。在控件实际重绘之前多次调用Invalidate不会造成性能损失。”
实际的重绘将在更新控件时发生。要强制立即重绘,请调用Repaint。
Repaint:“TWinControl :: Repaint调用Invalidate方法,然后调用Update方法来重新绘制控件”(稍作改述)。
(可悲的是,我所拥有的更新的参考文献(CBuilder 2007)比这个旧的参考文献更差和不完整。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接