停止闪烁

Rem*_*igo 9 delphi

我有一个用borland pascal和Delphi编写的旧程序,如果我使用Form1.Canvas.LineTo和MoveTo函数,我会得到一个闪烁的效果.谁能告诉我如何摆脱闪烁?

Mat*_*ias 20

尝试设置DoubleBuffered为true Form.OnCreate.

  • 当我还是一个年轻的小伙子时,我们必须自己实施双缓冲.在雪地上双向上坡! (13认同)
  • @Greg:赤脚? (7认同)
  • @Greg:烛光? (4认同)

Gre*_*ill 14

用于减少动画图形操作中的闪烁的一般技术称为双缓冲.这个想法是你完成所有绘图到屏幕外的位图,然后当你完成渲染整个场景时,将整个位图复制到可见显示.

该术语还涉及硬件支持的技术,例如将整个视频显示缓冲器与备用视频显示缓冲器交换的能力,其用于诸如控制台视频游戏的专用系统中.


Tom*_*sen 5

虽然使用双缓冲通常是最好的解决方案,但它并不总是正确的解决方案,绝对不是最节省内存的解决方案.但是如果你只绘制图像的一部分,我会与解决方案,以及设置进入DoubleBufferedtrue如其他意见中提到.

但是,如果每次绘制时都填充整个组件区域,则可能需要选择其他方法.如果你设置ControlStylecsOpaque你将避免让组件擦除背景,从而删除闪烁的源,而不必双缓冲.这当然要求您在整个组件区域上绘制,因此解决方案仅适用于您.

一般情况下,如果内存消耗不重要,我也会选择双缓冲,我只是想为您提供替代方案.:)


r_j*_*r_j 5

双缓冲的简单代码示例。

创建缓冲区(TBitmap)

在缓冲区画布上绘制。

在画布上绘制位图。Form1.Canvas例如。

Buffer := TBitmap.Create;
try 
  Buffer.Width:=Form1.Width;
  Buffer.Height:=Form1.Height;
  //clearBuffer
  Buffer.Canvas.FillRect(Buffer.Canvas.ClipRect);
  //draw Something
  Buffer.Canvas.TextOut(0,0,'Hello World');
  Buffer.Canvas.Rectangle(0,1,2,3);
  //drawBuffer on canvas
  Form1.Canvas.Draw(0,0,Buffer);
finally
  Buffer.free  
end;
Run Code Online (Sandbox Code Playgroud)