放狼烟招唤高手:关于控件的拖放 如何把一个image1拖到另一个image2上面,然后image2显示image1的图片?拖动的过程中,image1的位置不变化,但是鼠标指针变成虚线的方框。麻烦给出代码,谢谢大家。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; 谢谢楼上的代码,我试过的确可行。可是我还想知道,其实我们见到好多软件都可以被拖放,拖放过程中,被拖的控件是不动的,但鼠标指针变成dragCursor属性中的crDrag或crMultiDrag图标那样的,其实要实现这种视觉效果,应该有更简单的方法吧? 如果楼主找到更好的就贴出来共享。ImageList1.DragCursor := crDrag;如果是托拽图片,我认为半透明的图片比一个筐给用户的感觉好。 delphi中如何实现图片的alpha值转换 如何让DBGrid绘制的时候精确定位到每一个单元格的颜色? delphi工具“XML Mapper”运行要报错,是什么原因啊? 关于局域网中,编程实现禁止上网的方法? 郁闷,前途不妙啊! 请高手解答;如何使inputbox中输入的字符为*****,就是想密码一样,不让其他人看到? 文件更名 用NMUDP控件可以在局域网中传输.db的文件格式吗? 初学者的问题:MIDAS的连接 请帮我写一个函数 数据库清空后的奇怪问题? 如何给ADOConnection指定连接字符串
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;
ImageList1.DragCursor := crDrag;如果是托拽图片,我认为半透明的图片比一个筐给用户的感觉好。