如何把一个image1拖到另一个image2上面,然后image2显示image1的图片?拖动的过程中,image1的位置不变化,但是鼠标指针变成虚线的方框。麻烦给出代码,谢谢大家。
 

解决方案 »

  1.   

    type
      TForm1 = class(TForm)
        Image2: TImage;
        Image1: TImage;
        ImageList1: TImageList;
        procedure FormCreate(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        FDownPoint: TPoint;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      vBitmap: TBitmap;
    begin
      ImageList1.Width := Image1.Width;
      ImageList1.Height := Image1.Height;
      vBitmap := TBitmap.Create;
      try
        vBitmap.Width := Image1.Width;
        vBitmap.Height := Image1.Height;
        vBitmap.Canvas.Draw(0, 0, Image1.Picture.Graphic);
        ImageList1.Add(vBitmap, nil);
      finally
        vBitmap.Free;
      end;
    end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button <> mbLeft then Exit;
      ImageList1.BeginDrag(Handle,
        TImage(Sender).Left,
        TImage(Sender).Top
      );
      FDownPoint := Point(X, Y);
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if not (ssLeft in Shift) then Exit;
      ImageList1.DragMove(
        TImage(Sender).Left + X - FDownPoint.X,
        TImage(Sender).Top + Y - FDownPoint.Y
      );
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ImageList1.EndDrag;
      Image2.Canvas.Draw(
        Image1.Left + X - FDownPoint.X - Image2.Left,
        Image1.Top + Y - FDownPoint.Y - Image2.Top,
        Image1.Picture.Graphic
      );
    end;
      

  2.   

    谢谢楼上的代码,我试过的确可行。可是我还想知道,其实我们见到好多软件都可以被拖放,拖放过程中,被拖的控件是不动的,但鼠标指针变成dragCursor属性中的crDrag或crMultiDrag图标那样的,其实要实现这种视觉效果,应该有更简单的方法吧?
      

  3.   

    如果楼主找到更好的就贴出来共享。
    ImageList1.DragCursor := crDrag;如果是托拽图片,我认为半透明的图片比一个筐给用户的感觉好。