美好的一天...... 我正在使用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的图像......
答案 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;