Delphi中有关窗口绘制

Invalidate方法通知Windows应该重新绘制表单的整个表面。最重要的是Invalidate不会立即强制执行绘制操作。 Windows只是存储请求,并且只会响应它
当前程序完全执行后,并且只要系统中没有其他待处理事件。 Windows故意延迟绘画操作,因为它是最耗时的操作之一。有时,这种延迟,
只有在多次更改后才能绘制表单,避免多次连续调用(慢)绘制方法。
•Update方法要求Windows立即更新表单的内容并重新绘制
但请记住,只有存在无效区域时才会执行此操作。如果刚刚调用了Invalidate方法或结果,则会发生这种情况
用户的操作。如果没有无效区域,则对Update的调用完全没有效果。出于这个原因,通常在调用Invalidate后才会看到对Update的调用。
这正是两个Delphi方法Repaint和Refresh所做的。
•Repaint方法按顺序调用Invalidate和Update。因此,它会立即激活OnPaint事件。此方法的版本略有不同,称为Refresh。对于表格,效果是一样的;对于组件,它可能会略有不同。

当您需要向表单请求重绘操作时,通常应该调用Invalidate,
遵循标准的Windows方法。这在您需要时尤为重要
经常请求此操作,因为如果Windows花费太多时间来更新
屏幕,重绘的请求可以累积成一个简单的重绘动作。
Windows中的wm_Paint消息是一种低优先级消息。更确切地说,如果一个
请求重新绘制正在等待,但其他消息正在等待,其他消息在系统实际执行绘制操作之前处理。
另一方面,如果多次调用Repaint,则每次Windows可以处理其他消息之前必须重新绘制屏幕,​​并且由于绘制操作是计算密集型的,因此实际上可能会降低应用程序的响应速度。有时候,
但是,当您希望应用程序尽快重绘表面时。在这些不常见的情况下,调用Repaint是可行的方法。

另一个重要的考虑因素是在绘制操作期间,Windows只重绘了
所谓的更新区域,加快了操作。因此,如果您只使a无效
窗口的一部分,只有该区域将被重新绘制。要做到这一点,你可以使用
InvalidateRect和InvalidateRegion函数。实际上,这个功能是一把双刃剑。这是一种非常强大的技术,可以提高速度并减少频繁重绘操作引起的闪烁。另一方面,它也可能产生不正确的输出。
一个典型的问题是,只有一些受用户操作影响的区域实际被修改,而其他区域保持原样,即使系统执行应该更新它们的源代码。实际上,如果绘制操作落在更新区域之外,系统会忽略它,就好像它是ou

Refresh和Repaint是一样的,它只是简单地调用了Repaint.
Update会导致整个窗口(对于没有窗口的TGraphicControl来说,就是它的父控件的窗口)立即处理WM_PAINT消息,即重画应该画的部分.
Invalidate使控件所在窗口的控件客户区域(对于TWinControl来说就是它的客户区域,对于TGraphicControl来说就是它的父控件的窗口在它的区域范围内的部分)失效,从而产生一个WM_PAINT消息,

但并不马上重绘,直到其它消息处理完或遇到一个Update的调用.
Repaint是立即重绘该控件,在TWinControl中其实就是调用了Invalidate和Update,在TGraphiControl中分不同情况作了不同处理,逻辑稍复杂一些,但功能是一样的.

原文地址:https://www.cnblogs.com/Master-Qi/p/9674610.html