如何在OnPaint Delphi中更新绘图

时间:2014-02-08 21:02:51

标签: delphi delphi-xe5

美好的一天...... 我正在使用OnPaint Delphi来创建几行......直到它没事......当我尝试更新这些行时我的问题就出现了......

我发现要清洁屏幕,我可以使用:

Invalidate () 

前:

Then if True 
Begin 
      Canvas.Ellipse (0,0,100,50); 
End Else Begin 
     Invalidate (); 
end; 

这种方式效果很好......但问题是Invalidate()的内存消耗;使用....

正常消耗低于 0.3% ....现在Invalidate ();消耗 30% ......差别很大......

是否有任何其他功能可以用来清理屏幕而不使用OnPaint两个处理器...或者一种方法来使OnPaint传递给Invalidate(); ...因为它一直在更新,因此消耗了大量的CPU ....我当时需要清理这个屏幕,但其他人需要更新OnPaint的图像......

2 个答案:

答案 0 :(得分:4)

问题是缺乏细节。代码不完整。但是,看起来您正在从您正在绘制的同一个地方调用Invalidate。这是一个明显的错误。

绘画的工作原理是将窗口区域标记为无效。当窗口区域无效时,系统将在消息队列变空时启动绘制周期。在这一点上,我们的计划工作就是自己画画。当程序需要更改其外观时,它会使修改后的区域无效,然后处理随后的绘制周期。

看起来你正在从你的绘画方法中调用Invalidate。这导致无限重复的序列:

  • 你画画。
  • 您无效。
  • 消息队列清空,窗口无效。
  • 系统会引发油漆循环。
  • 你画画。
  • 您无效。
  • 依此类推。

这种无限的事件序列将导致您燃烧CPU周期。

解决方案是停止在paint方法中失效。我不知道为什么你在那里无效,但无论你想做什么,使你的窗口失效都不是答案。

答案 1 :(得分:0)

谢谢...我想你明白我错过了什么......我这样做了,显然工作正常:

procedure paintestOnclick(blabla);
Begin
    if word= 'Open' then Begin
        onpaintTela := True;
        repaint();
      End;

      if word= 'close' Then Begin
        invalidate();
        onpaintTela := False;
      End;
End;

Onpaint程序:

if onpaintTela then begin
    //Comand paint
End;