为什么再ontimer中设置invalidate来控制画布的paint速度无效?(100分)

  • 主题发起人 主题发起人 divers
  • 开始时间 开始时间
D

divers

Unregistered / Unconfirmed
GUEST, unregistred user!
我自定义一个控件,继承TImage,里面多了一个TTimer,我通过TTimer来控制canvas的刷新
Procedure TPool.OnTimer(Send:TObject);
Begin
self.invalidate;
End;

Procedure TPool.Draw;
Var i :Integer;
Begin
if fbFlooding then
Begin
with Canvas do
Begin
if di=s then di :=0 else di :=s;
i:=0;
while Height-di-i* 3*s>3*s do
Begin
inc(i);
Rectangle(5,di+(i-1)*3*s,11,di+(i-1)*3*s+2*s);
Rectangle(141,di+(i-1)*3*s,147,di+(i-1)*3*s+2*s);
Rectangle(20+di+(i-1)*3*s, 116,20+di+(i-1)*3*s+2*s, 122);
End;
End;
End;
End;

procedure TPool.Paint;
begin
Inherited Paint;
Draw;
end;

为什么ontimmer里面的invalidate的控制,对paint取不了作用,
paint的刷新速度不是Timer的Interval的间隔时间,??
 
Timer的定时能力是有限度的,往往达不到定时精度,可以使用
选用线程加sleep,但sleep的精度也不高,只比timer好一点而已
或者MMSystem的timecreateevent建立高精度timer。
 
这是因为invalidate只是发送WM_PAINT消息给TIMAGE控件!而WM_PAINT消息不是优先处理的。
它会被移到消息队列的末尾!同时,多个WM_PAINT消息会被合并为一个。
试试用refresh替换invalidate。
GOOD LUCK。
 
后退
顶部