谁能告诉我Paint,Repaint,Update,Refresh,Invalidate这几个方法在绘制控件时的区别吗?(30分)

  • 主题发起人 主题发起人 herotjun
  • 开始时间 开始时间
H

herotjun

Unregistered / Unconfirmed
GUEST, unregistred user!
被这个问题困扰以久,希望能得到各位富翁的赐教。
 
踢一脚也行
 
帮你UP,正好也要解决相关问题,呵呵~
 
自己踢一脚
 
是没高手,还是太简单??

再帮你~
 
看一下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一般是没有单独使用的必要的。
 
学习!我以前瞎用一气!呵呵!
 
非常感谢puyd能给出解答。但是这些方法分别在什么时候使用呢?我想它们绘制出的控件
肯定在什么地方有点不同,Borland不必用五种不同的方法来做同一件事吧
 
Refresh是Control子类的通用刷新方法,对于一般的窗体控件,仅仅是调用了一下Repaint
重画,对于不可见的控件,以及一些和数据集相关的控件,Refresh还能刷新数据,是一个
通用的刷新方法,而Repaint仅负责窗体重画,至于Update和Invalidate是负责具体实现
Repaint功能的方法,窗体的重画最终还是由Update方法调用WinAPI函数实现的。至于paint
和窗体重画无关,是私有的方法,不可能被调用,其作用仅仅是能在适当的时候调用用户设
定的OnPaint事件。
 
Invalidate 是发一个需要重画的消息到消息队列,等现在的消息处理完了再处理它
Update 直接重画,跳过消息队列的东东;

这是我的理解。
 
对不起,分发晚了
 
后退
顶部