图象组件如Image、文本如Label在移动时,屏幕会发生闪烁,如果图象较小或者文本中字体较小,可能不会很明显。以下代码: 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Left := Image1.Left + 1;
  Label1.Left := Label1.Left + 1;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Interval := 10;
  Timer1.Enabled := True;
end;
  
   闪烁的情况会随图形的增大而增加,会随文字的变大、增多而增加。简单地分析一下它的原因,是因为每一次一个组件的位置属性如Left,Top等更改时,会自动触发它的刷新、重画过程。当重画的次数增大到某一程度时,我们便会感觉到闪烁。对于此问题,解决的方案很奇怪也有点难以解释,就是不要更改图象或者标签的位置,而让它们放在一个面板(Panel)内,然后只修改面板的位置属性,就不会闪烁。  为了使面板不会影响瞻观,可以使它的AutoSize属性为真。试试这个:procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Panel1.Left := Panel1.Left + 1;
  Label1.Left := Label1.Left + 1;
end; 这样一来,图象的闪烁的基本消除了,就算多大的图象也不会闪烁。但是有一个问题,就是面板叠放的个数不能是偶数个,否则又会出现闪烁。真奇怪。对于标签就没有这么幸运了,尽管放在面板上它的闪烁有所减少,但仍然较明显,属于不能忍受的程度,特别在领导面前演示时就更不好了。经过版主多方发掘,终于发现在LMD这套里组件里有一个面板:TLMDSimpleLabel,我们将标签放在此面板上移动面板就不会闪烁了。您不妨一试。

解决方案 »

  1.   

    不用Timage,而是在OnPaint事件中,把位图直接绘制到窗体上
    另外,背景图最好使用种子填充的方式,比把一幅整图绘到窗体上快procedure TForm1.FormPaint(Sender: TObject);
    var
      bmp:TBitmap;
      i,j,bmpWidth,bmpHeight:integer;
    begin
      try
        bmp:=Tbitmap.Create ;
        bmp.LoadFromFile('c:\winnt\blue lace 16.bmp');
        bmpWidth:=bmp.Width ;
        bmpHeight:=bmp.Height ;
        for i:=0 to (width div bmpWidth) do begin
          for j:=0 to (height div bmpHeight) do begin
            Canvas.Draw(i*bmpWidth,j*bmpHeight,bmp);
          end;
        end;
      finally
        bmp.Free ;
      end;end;
      

  2.   

    可改用api函数,具体的函数我忘了,sorry,希望对你有帮助!
      

  3.   

    有的人说用bitblt,我试过,好像也不行
      

  4.   

    使用JPEG图像,可以使用JPEG单元,操作方法和我给出的代码是一样的。
      

  5.   

    有个属性,就是在改变位置的时候不重绘背景,记不得这个属性的名字了 
    对于标签,用TStaticText
      

  6.   

    venne,我刚才试了一下,还是闪烁
      

  7.   

    用.BMP格式的例子:procedure TForm1.FormCreate(Sender: TObject);
    begin
      Brush.Bitmap:=Self.Image1.Picture.Bitmap;
    end;
      

  8.   

    procedure TForm1.FormPaint(Sender: TObject);
     var
    bmp:Tjpegimage;
      i,j,bmpWidth,bmpHeight:integer;
    begin
      try
        bmp:=Tjpegimage.Create ;
        bmp.LoadFromFile('c:\image1\language.jpg');
        bmpWidth:=bmp.Width ;
        bmpHeight:=bmp.Height ;
        for i:=0 to (width div bmpWidth) do begin
          for j:=0 to (height div bmpHeight) do begin
            Canvas.Draw(i*bmpWidth,j*bmpHeight,bmp);
          end;
        end;
      finally
        bmp.Free ;
      end;
      

  9.   

    不要直接放在Form上,放在Panel上试试
      

  10.   

    .BMP格式,你试过没有,肯定没有闪烁用.BMP格式的例子:procedure TForm1.FormCreate(Sender: TObject);
    begin
      Brush.Bitmap:=Self.Image1.Picture.Bitmap;
    end;不要光等待,要试试!
      

  11.   

    你有多少个FORM啊?呵呵,败给你了。不知道你的运行环境了。我怎么试也不闪烁啊,原来我用这个做多媒体程序都没有这么糟糕哦。
      

  12.   

    原来是没有将doublebuffered=true;的缘故,可是又有一个问题:form关闭时很慢,
    有什么办法吗??
      

  13.   

    试一下:
    form1.Canvas.Draw(x,y,TGraphics);