from里面有一些文字
开始是被一张图片盖着的,看不见
当鼠标移到指定的button上面时候 
图片就连续移开直到文字露出来我是这样做的:
当button onmouseEnter的时候启动一个线程来减小图片的宽度,直到为 0 ,
线程函数是
  while image.width>0 do
  begin
   image.width := image.width - 8; //每次减小的像素
   form.Invalidate;
  end;
但是这样做移得很慢,并且感觉不连续,还耗cpu,
如果几个button的OnmouseEnter事件都调用此线程,感觉还会不灵;
请问还有什么好的办法流畅地移动或者减小图片的宽度。
或者还有什么更好的办法来实现遮罩的这种效果

解决方案 »

  1.   

    楼主不要用线程,对于图片处理,单线程与多线程是一样的,
    也不同意楼上的同步,线程同步相当于让当前线程等待,等主线程做完才回到当前线程,
    那样的话还不如不用线程。楼主的代码有问题,不要用 form.Invalidate;这样会慢死你,
    再一个不要用 Image ,给楼主一个提示,做两幅图片,
    第一步:清空背景图片,并在背景图片上面画文字,
    第二步:把盖住文字的图片画在要画的位置。
    第三步:把背景图片画到 Form 上。
    给你个例子代码做参考:
    procedure TForm1.Button5Click(Sender: TObject);
    var
      Text:string;          //要画的文字
      FrontImage:TBitmap;   //盖住文字的图片
      BackImage:TBitmap;    //背景图片
      i:Integer;  //测试用的变量
    begin
      Text:='测试';
      FrontImage:=TBitmap.Create;
      BackImage:=TBitmap.Create;
      try
        FrontImage.LoadFromFile('c:\aa.Image');
        BackImage.Assign(FrontImage);
        BackImage.Canvas.Brush.Color:=clWhite;  //假设背景色为白色
        for i:=0 to 10 do
        begin
          BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
          BackImage.Canvas.Draw(i * 8,0,FrontImage);
          BackImage.Canvas.TextOut(0,0,Text);
          Self.Canvas.Draw(0,0,BackImage);   //画到 Form 上。
        end;
      finally
        FrontImage.Free;
        BackImage.Free;
      end;
    end;
      

  2.   

    把上面的代码加工一下放到 Timer 控件的 OnTimer 里面,
    把 Timer 控件的 Interval 的值设成 1,
    当button onmouseEnter的时候执行 Timer.Enabled:=True;
    直到前景图片移出背景图片的时候再 Timer.Enabled:=False;
      

  3.   

    cnmaxu(Max),试了你给的例子,能够流畅移动图片,但是会留下痕迹,背景图片会被forntimage留下的痕迹所遮挡
      

  4.   

    我倒~~~~楼主我只是教给你一个方法,这个方法可以平滑的处理图片,
    你说的被 frontimage 留下的痕迹应该是你没有用到如下:{
    BackImage.Canvas.Brush.Color:=clWhite;  //假设背景色为白色
    for i:=0 to 10 do //<<---并且你看我用的循环,只是 0->10 当然会留下一半。
    //只是个例子而以楼主要体会思想,用内存缓冲来做界面上面要做的事儿。
    begin
       BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
    }这段话吧,这段话就是用来清除前景图片留下的痕迹的。//下面这是我测试过的,你把 aa.bmp 按成你的 前景图片就行了。
    procedure TForm1.Button5Click(Sender: TObject);
    var
      Text:string;          //要画的文字
      FrontImage:TBitmap;   //盖住文字的图片
      BackImage:TBitmap;    //背景图片
      i:Integer;            //测试用的变量
    begin
      Text:='测试';
      FrontImage:=TBitmap.Create;
      BackImage:=TBitmap.Create;
      try
        FrontImage.LoadFromFile('c:\aa.bmp');
        BackImage.Assign(FrontImage);
        BackImage.Canvas.Brush.Color:=clWhite;  //假设背景色为白色
        for i:=0 to BackImage.Width do
        begin
          BackImage.Canvas.FillRect(Rect(0,0,BackImage.Width,BackImage.Height));
          BackImage.Canvas.Draw(i,0,FrontImage);
          BackImage.Canvas.TextOut(0,0,Text);
          Self.Canvas.Draw(0,0,BackImage);   //画到 Form 上。
        end;
      finally
        FrontImage.Free;
        BackImage.Free;
      end;
    end;
      

  5.   

    cnmaxu(Max),您辛苦了,多谢你,还有一点是想要frontimage移走了,但是还保留以前backimage的东西
    不要都是白色,怎么搞阿
      

  6.   

    backImage 本身就是一张有用的图吧,那么你就应该用 另一个 B3:TBitmap 保存背景图。把我给你的代码中的 FillRect 好句话 改成 backImage.Canvas.Draw(0,0,B3); 就行了。楼主也太那个了吧。
      

  7.   

    cnmaxu(Max) 我太哪个了?
    你讲不要紧,我扛得住
      

  8.   

    ---送佛送到西---接着楼主
    procedure TForm1.Button5Click(Sender: TObject);
    var
      Text:string;          //要画的文字
      FrontImage:TBitmap;   //前景图片
      BackImage:TBitmap;    //背景图片
      DisplayImage:TBitmap; //要画的图
      i:Integer;            //测试用的变量
    begin
      Text:='测试';
      FrontImage:=TBitmap.Create;
      BackImage:=TBitmap.Create;
      DisplayImage:=TBitmap.Create;
      try
        FrontImage.LoadFromFile('c:\aa.bmp');
        BackImage.LoadFromFile('c:\bb.bmp');
        for i:=0 to BackImage.Width do
        begin
          DisplayImage.Assign(BackImage);
          DisplayImage.Canvas.Brush.Style:=bsClear;
          DisplayImage.Canvas.TextOut(0,0,Text);
          DisplayImage.Canvas.Draw(i,0,FrontImage);
          Canvas.Draw(0,0,DisplayImage);   //画到 Form 上。
        end;
      finally
        FrontImage.Free;
        BackImage.Free;
        DisplayImage.Free;
      end;
    end;
      

  9.   

    哈哈,我确实有点懒笨,我本身不是做delphi的,才开始用没多久,所以很多不明,请原谅
      

  10.   

    其实我也研究过,也不是很懒,用什么timer 线程做出了都不尽人意,所以没办法的情况下就问了
    还是要谢谢你!多聊几句我们揭帖
      

  11.   

    你可以用timer事件控制,图片的移动,不知道符合不