P puyd Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-02 #8 看一下VCL的源码,就不难发现了。 Paint是TCustomForm的Protected方法,实际就是调用OnPaint事件。 Invalidate是TWinControl的方法,主要是发送一个CM_INVALIDATE消息,对控件的值作有效性判断。 Update也是TWinControl的方法,是通过调用Win32API函数重画窗口。 Repaint是TControl的虚方法,在TWinControl中override,程序只有2行,就是(1)Invalidate;(2)Update Refresh是TControl的方法,程序只有1句:Repaint. 所以ReFresh和RePaint对于TWinControl的子类来说是等价的(除非又重载过),但是应该说Refresh是更规范的用法。 至于Invalidate的Update一般是没有单独使用的必要的。
看一下VCL的源码,就不难发现了。 Paint是TCustomForm的Protected方法,实际就是调用OnPaint事件。 Invalidate是TWinControl的方法,主要是发送一个CM_INVALIDATE消息,对控件的值作有效性判断。 Update也是TWinControl的方法,是通过调用Win32API函数重画窗口。 Repaint是TControl的虚方法,在TWinControl中override,程序只有2行,就是(1)Invalidate;(2)Update Refresh是TControl的方法,程序只有1句:Repaint. 所以ReFresh和RePaint对于TWinControl的子类来说是等价的(除非又重载过),但是应该说Refresh是更规范的用法。 至于Invalidate的Update一般是没有单独使用的必要的。
H herotjun Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-05 #10 非常感谢puyd能给出解答。但是这些方法分别在什么时候使用呢?我想它们绘制出的控件 肯定在什么地方有点不同,Borland不必用五种不同的方法来做同一件事吧
P puyd Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-05 #11 Refresh是Control子类的通用刷新方法,对于一般的窗体控件,仅仅是调用了一下Repaint 重画,对于不可见的控件,以及一些和数据集相关的控件,Refresh还能刷新数据,是一个 通用的刷新方法,而Repaint仅负责窗体重画,至于Update和Invalidate是负责具体实现 Repaint功能的方法,窗体的重画最终还是由Update方法调用WinAPI函数实现的。至于paint 和窗体重画无关,是私有的方法,不可能被调用,其作用仅仅是能在适当的时候调用用户设 定的OnPaint事件。
Refresh是Control子类的通用刷新方法,对于一般的窗体控件,仅仅是调用了一下Repaint 重画,对于不可见的控件,以及一些和数据集相关的控件,Refresh还能刷新数据,是一个 通用的刷新方法,而Repaint仅负责窗体重画,至于Update和Invalidate是负责具体实现 Repaint功能的方法,窗体的重画最终还是由Update方法调用WinAPI函数实现的。至于paint 和窗体重画无关,是私有的方法,不可能被调用,其作用仅仅是能在适当的时候调用用户设 定的OnPaint事件。
C cqbaobao Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-05 #12 Invalidate 是发一个需要重画的消息到消息队列,等现在的消息处理完了再处理它 Update 直接重画,跳过消息队列的东东; 这是我的理解。