我做了一个播放进度显示,进度条Alige:=alClient,进度条上面有一个可移动的25*9的小图片
每秒刷新一回这个新图片。我现在的写法是
src  := rect(0,0,6,29);
dest := rect(0,0,Image1.Width,29);
Image1.canvas.copyrect(dest, Image_Skin.canvas, src);//底下进度条背景src  := rect(0,0,6,29);
dest := rect(12,0,20,29);//这里本来用是代码计算
Image1.canvas.copyrect(dest, Image_Skin.canvas, src);//可移动的25*9的小图片
这样就组成一个图,问题是,改变窗体大小的,小图片成比例缩放我不想让图片随窗体的大小自动缩收,要怎么实现?
要怎么修改才好???
我写了一个例子,改变一下窗体的宽看看,在点按钮2看看,还是缩收状态
例子下载地址:www.cocowo.com/down/123.rar

解决方案 »

  1.   

    首先,Image_MusicPlayMax的Stretch应该设成false
    然后用我这段代码
    procedure TForm1.Button1Click(Sender: TObject);
    var
            dest, src : trect;
            mBitMap : TBitMap;
    begin
            mBitMap := TBitMap.Create;
            mBitMap.Width := Image_MusicPlayMax.Width;
            mBitMap.Height := Image_MusicPlayMax.Height;        src  := rect(0,0,6,29);
            dest := rect(0,0,mBitMap.Width,mBitMap.Height);
            mBitMap.canvas.copyrect(dest, Image_MusicPlayDemo.canvas, src);        src  := rect(0,0,25,7);
            dest := rect(0,3,25,10);
            mBitMap.canvas.CopyRect(dest, Image_MusicPlayCur.canvas, src);        Image_MusicPlayMax.Picture.Assign(mBitMap);        mBitMap.Destroy;
    end;procedure TForm1.FormResize(Sender: TObject);
    begin
            Button1Click(nil);
    end;
      

  2.   

    经过测试,发现这种效果在做鼠标跟随时,执行起来有点卡,效果是可以了,可是执行效率慢呀。
    例子下载地址:www.cocowo.com/down/123-2.rar这回加了鼠标跟随,在全屏的情况下,快速移动鼠标可以发现,卡呀!!
    我用以前的方法,画一个宽5000宽的图片做快速移动,都一点不卡。
    有没有更好的方法解决?
      

  3.   

    procedure TForm1.MusicPlay_Plan(X,Max:Integer);//给个位置,给个宽就可以
     var  dest, src : trect;
          mBitMap : TBitMap;
    begin
       mBitMap := TBitMap.Create;
       mBitMap.Width := Image_MusicPlayMax.Width;
       mBitMap.Height := Image_MusicPlayMax.Height;
      src  := rect(0,0,6,29);
      dest := rect(0,0,Image_MusicPlayMax.Width,Image_MusicPlayMax.Height);
      mBitMap.canvas.copyrect(dest, Image_MusicPlayDemo.canvas, src);
      src  := rect(0,0,25,7);
      if X/Max >1 then X:=Image_MusicPlayMax.Width;
      if X <0 then X:=0;
      dest := rect(Trunc((Image_MusicPlayMax.Width-25)*(X/Max)),6,Trunc((Image_MusicPlayMax.Width-25)*(X/Max))+25,13);
      mBitMap.canvas.copyrect(dest, Image_MusicPlayCur.canvas, src);
      Image_MusicPlayMax.Picture.Assign(mBitMap);end;
    首先:在这个函数里,mBitMap没有释放,运行一段时间后内存会用光光,程序会嗝屁。
    其次:mBitMap经常用到,就做成全局变量,这样不用进一次函数就申请释放一次了,可以提高点速度,包括那些个src,dest什么的,都可以尽量用全局变量,放在form的onResize事件里修改。
    procedure TForm1.FormCreate(Sender: TObject);
    begin
            mBitMap := TBitMap.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
            mBitMap.Destroy;
    end;