要做一个程序,下部分需要有一些字幕在滚动,我用了一个panel,上边放一个label,然后通过timer来控制label的left,可是这样做出来效果不好,闪烁的厉害,尤其当字体比较大的时候,论坛里有人说可以用staticText来代替label就不闪烁了,可是我试了一下,仍然闪烁阿?是不是我哪里设置错了?有没有比较简单的办法来实现?高手帮忙解决,必要的话我可以把代码传给你,谢谢了

解决方案 »

  1.   

    不闪烁滚动字幕(带图片)
    var
      Form1: TForm1;
      x,tt,l,h:integer;
      pic:trect;
      map:tbitmap;
    implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
    x:=image1.Height +20;
    tt:=x+80;
    form1.Repaint ;
    image1.Canvas.Brush.Color :=clgreen;
    pic:=rect(0,0,image1.width,image1.height);
    image1.Canvas.FillRect(pic);
    map:=tbitmap.Create ;
    pic:=rect(0,0,300,300);
    map.LoadFromFile ('c:\windows\安装程序.bmp');
    //image1.Canvas.StretchDraw(pic,map);end;procedure TForm1.Timer1Timer(Sender: TObject);begin
    x:=x-1;
    tt:=tt-1;
    if x<-160 then begin x:=image1.Height +20;
                         tt:=x+80 end;
    image1.Canvas.Font.Size :=18;
    image1.Canvas .font.Color :=$1200ffff;
    image1.Canvas .textout(10,x,'是不在世上');
    image1.Canvas.Font .color:=$120000ff;
    image1.canvas.Font .size:=12;
    image1.canvas.textout(20,x+50,'在大多数情况下');
    l:=image1.Canvas.TextWidth('在大多数情况下');
    h:=image1.canvas.textheight('在大多数情况下');
    image1.canvas.Pen.color:=clgreen;
    image1.canvas.MoveTo(20,h+x+50-2);
    image1.Canvas.LineTo(20+l,h+x+50-2);
    pic.TopLeft.x :=30;
    pic.topleft.y:=tt;
    pic.BottomRight.x :=pic.TopLeft.x+100;
    pic.bottomright.y:=pic.topleft.y +80;
    image1.canvas.StretchDraw(pic,map);
    image1.Canvas.Pen.Color:=clgreen;
    image1.Canvas.MoveTo(0,pic.topleft.y+80);
    image1.canvas.lineto(pic.topleft.x+100,pic.topleft.y +80);
      

  2.   

    关键是Panel.DoubleBuffered:=true;
    否则你怎么画都会有或多或少的闪烁的。
      

  3.   

    1楼的,那个我试过了,不行的
    2楼的,你这个程序我也看了,主要是能不能用panel和label或者类似的来实现,因为还有很多别的地方,如果思路换的话要改很多地方,太麻烦了,不过先谢谢你
      

  4.   

    改变left后加一句Panel.Invalidate试试
      

  5.   

    不知道你是怎么用的,我的Lable1的字号是72都没有问题。procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if Label1.Left<=1 then
        Label1.Left:=500;
      Label1.Left:=Label1.Left-1;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Panel1.DoubleBuffered:=true;
    end;
      

  6.   

    不可能,我用的是Delphi6,估计是你程序其它地方的问题。
    你新建一个工程,然后分别拖一个Panel,Timer在窗体上,Label在Panel上,把上面代码考过去试验看看。
      

  7.   

    不可能,我用的是Delphi6,估计是你程序其它地方的问题。
    你新建一个工程,然后分别拖一个Panel,Timer在窗体上,Label在Panel上,把上面代码考过去试验看看。
      

  8.   

    楼上,你的timer的interval设的是多少?设为1,然后将Label1.Left:=Label1.Left-1
    每次移动的像素多一些,比如Label1.Left:=Label1.Left-4,然后全屏看,还是闪阿
    我用的是delphi7
      

  9.   

    DoubleBuffered是对TWinControl继承下来的空间才有效的。所以用Label.Parent.DoubleBuffered := True更为保险。
      

  10.   

    用第3方控件行不?推荐你一个好东西,能实现你的要求,一点不闪,还有各种特效,一个字:酷!那就是:AAFont平滑特效字体控件包,在www.2ccc.com有下载。
    有全部源代码,你想自己做可以参考。
      

  11.   

    把 panel 的 DoubleBuffered 设为 True 不可能会闪的,除非你的label没有创建在 panel 之内,也就是说 Label 的父级不是 panel 就这么简单。
      

  12.   

    有个简单的方法,就是放一个panel然后用timer控制改变它的caption属性,就不会闪烁了,但效果可能不是太好.
      

  13.   

    我曾经做过测试 使用DoubleBuffered 并不能真正解决问题 闪烁不能避免只能通过 Bitmap 来解决 同意二楼
      

  14.   

    我试了一下DoubleBuffered效果还可以呀。我另外给你我的方法。
    我是在Panel上放一个Image, Panel的DoubleBuffered设为True;
    我不采用移动Image.left的方式。 
    我直接TextOut出来。 下面是我的源代码。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Panel1: TPanel;
        Image1: TImage;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      iLeft:Integer;implementation{$R *.dfm}{ TForm1 }procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Image1.Canvas.TextOut(iLeft,0,'我们是中国人');
      Dec(iLeft);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      iLeft:=Image1.Width;
      Image1.Transparent:=True;
      Panel1.DoubleBuffered:=True;
    end;end.
      

  15.   

    Timer1的时间间隔为1。Enable为True
      

  16.   

    除非你的label没有创建在 panel 之内,也就是说 Label 的父级不是 panel 就这么简单。