请教:
我的 form1 窗体上有个 image1 控件,timer1 控件
我希望当我单击 button1 ,
图片从 image1 的左下角,移动到 左上角那么/
procedure TForm1.Button1Click(Sender: TObject);var
     filename:string;
     map:Tbitmap; //位图实例变量
     imagew:integeer; //image1的宽
     imageh:integeer; //image1的高
begin
     filename:=ExtractFilePath(paramstr(0))+'000.bmp';
     map:=Tbitmap.Create;
     map.LoadFromFile(filename);     //这里程序要怎么写?
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
      //这里程序要怎么写?
end;谢谢!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);var
         filename:string;
         map:Tbitmap; //位图实例变量
         imageh:integer; //image1的高
         maph:integer;    //图片的高
    begin
         filename:=ExtractFilePath(paramstr(0))+'000.bmp';
         map:=Tbitmap.Create;
         map.LoadFromFile(filename);
         imageh:=Image1.Height;
         maph:=map.Height;
         Image1.Canvas.Draw(0,(imageh-maph),map);
    end;怎么使图片移动啊?
    谢谢!
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      x,y:integer;
      map:Tbitmap; //位图实例变量
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var
         filename:string;
         imageh:integer; //image1的高
         maph:integer;    //图片的高
    begin      filename:=ExtractFilePath(paramstr(0))+'000.bmp';
          map:=Tbitmap.Create;
          map.LoadFromFile(filename);
          imageh:=Image1.Height;
          maph:=map.Height;
          x:=0;
          y:=imageh-maph;
         if  (Timer1.Enabled = false )then     Timer1.Enabled:=true;end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
         m,n:integer;
         pic:Trect;
    begin
          if (y>0) then
             begin
                   Image1.Canvas.Draw(x,y,map);
                    m:=x;
                    n:=y;
                    image1.Canvas.brush.color:=clBlue;
                    pic:=Rect(x,y,map.width,map.height);  //把以前的覆盖掉
                    image1.Canvas.FillRect(pic);
                    y:=y-5;
             end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
         if  (Timer1.Enabled = true) then     Timer1.Enabled:=false;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
         pic:Trect;
    begin
          image1.Canvas.brush.color:=clBlue;
          pic:=Rect(0,0,image1.width,image1.height);
          image1.Canvas.FillRect(pic);
    end;end.
    这样也不行啊!
    各位大哥帮我看看啊!
    谢谢!
      

  3.   

    image1.Canvas.brush.color:=clBlue;
    pic:=Rect(x,y,map.width,map.height);  
    image1.Canvas.FillRect(pic);//把以前的覆盖掉为什么不能把以前的覆盖掉呢?
    谢谢!
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, JPEG;type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        AJpeg : TJpegImage;
        iX, iY: Integer;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      Timer1.Interval := 50;
      Timer1.Enabled := False;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      AJpeg := TJpegImage.Create;
      AJpeg.LoadFromFile('C:\1.jpg');
      iX := 0;
      iY := Image1.Height;
      Timer1.Enabled := True;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      iY := iY - 5;  //每次移动的距离为5 Pixels
      if iY < 0 then iY := 0;
      Image1.Canvas.Draw(iX, iY, AJpeg);
      if iY = 0 then
      begin
        Timer1.Enabled := False;
        AJpeg.Free;
      end;
    end;end.
      

  5.   

    1. 不要用TImage控件;
    2. 不要在Timer事件中调用Draw。可以用 TPaintBox, 应该在OnPaint事件中画图,而不是在Timer事件中调用Draw, 在Timer事件中可以调用 Invalidate以使控件刷新。
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        Timer1: TTimer;
        Button2: TButton; 
        Button3: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        procedure RefreshActivePoint;
        procedure MoveImage;
        { Private declarations }
      public
        { Public declarations }
        FBitMap:TBitMap; //保存图形
        FBitMapBuff:TBitMap; //缓冲区
        FActivePoint:TPoint; //当前移动到的位置
        FMoveXSpace:Integer; //X方向要移动的距离
        FMoveYSpace:Integer; //Y方向要移动的距离
        FStop:Boolean;
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FBitMapBuff:=TBitmap.Create;
      FBitMap:=TBitmap.Create;
      //缓冲区图大小和Image1大小相同
      FBitMapBuff.Width:=Image1.Width;
      FBitMapBuff.Height:=Image1.Height;
      FBitMap.LoadFromFile('D:\Winnt\Greenstone.bmp');
      FActivePoint:=Point(0,0);
      FMoveXSpace:=10;
      FMoveYSpace:=10;
    end;function  GetRandomSpace:Integer;
    begin
    //返回一个随机的移动距离
      Randomize;
      Result:=Random(30);
    end;procedure TForm1.RefreshActivePoint;
    begin
       //检查移动边界,确定下一个要移动到的位置
      if (FActivePoint.X+FBitMap.Width>=Image1.Width) then
        FMoveXSpace:=0-GetRandomSpace
      else if FActivePoint.X<=0 then
        FMoveXSpace:=GetRandomSpace;  if FActivePoint.Y+FBitMap.Height>=Image1.Height then
        FMoveYSpace:=0-GetRandomSpace
      else if FActivePoint.Y<=0 then
        FMoveYSpace:=GetRandomSpace;
      FActivePoint:=Point(FActivePoint.X+FMoveXSpace,FActivePoint.Y+FMoveYSpace);  if FActivePoint.X+FBitMap.Width>Image1.Width then
        FActivePoint.X:=FActivePoint.X-(FActivePoint.X+FBitMap.Width-Image1.Width)
      else if FActivePoint.X<0 then
        FActivePoint.X:=0;  if FActivePoint.Y+FBitMap.Height>Image1.Height then
        FActivePoint.Y:=FActivePoint.Y-(FActivePoint.Y+FBitMap.Height-Image1.Height)
      else if FActivePoint.Y<0 then
        FActivePoint.Y:=0;
    end;procedure  TForm1.MoveImage;
    begin
      //先绘制缓冲区中的图形
      With FBitMapBuff do
      begin
        FreeImage;
        CleanupInstance;
        Canvas.FillRect(Rect(0,0,FBitMapBuff.Width,FBitMapBuff.Height));
        Canvas.Draw(FActivePoint.X,FActivePoint.Y,FBitMap);
      end;
      //然后直接给Image 绘制
      Image1.Canvas.Draw(0,0,FBitMapBuff);
      RefreshActivePoint;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    //循环移动
      FStop:=Not FStop;
      while FStop do
      begin
        MoveImage;
        Application.ProcessMessages;
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
    //定时器移动
      Timer1.Enabled:=Not Timer1.Enabled;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      MoveImage;
    end;end.
      

  7.   

    注意上面是button2和Button3 用了一个缓冲的图形,防止闪烁
      

  8.   

    把doublebuffer打開,然後用timer控制移動就可以了.