我在TPanel上有一个T
Image,另一个(空)TPanels.我想拖
图像从第一个到第二个面板使用拖放.
图像从第一个到第二个面板使用拖放.
我真的想看到图像从一个面板移动到
其他(半透明).
我想我应该使用TDragObject.GetDragImages,但我不知道如何构建整个魔术.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer); begin Image1.ControlStyle := Image1.ControlStyle + [csdisplayDragImage]; // ??? timage(Sender).BeginDrag(False); end; procedure TForm1.Image1StartDrag(Sender: TObject; var DragObject: TDragObject); begin // ??? end; procedure TForm1.Panel1DragOver(Sender,Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean); begin if (Source is timage) then Accept := timage(Source).Parent <> Sender; end; procedure TForm1.Panel1DragDrop(Sender,Y: Integer); begin if (Source is timage) then begin timage(Source).Parent := TPanel(Sender); timage(Source).Align := alClient; end; end;
更新 – 我发现一个有用的文章:Implementing Professional Drag & Drop In VCL/CLX Applications
解决方法
unit Unit3; interface // 2012 Thomas Wassermann - demo uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls; type TMyDragObject = class(TDragControlObject) private FImageList:timageList; fdragSource:TControl; protected function GetDragImages: TDragImageList; override; public Procedure StartDrag(G:TGraphic;p:TPoint;DragSource:TControl); Constructor Create(AControl: TControl); override; Destructor Destroy;override; Property DragSource:TControl read fdragSource; end; TForm3 = class(TForm) Panel1: TPanel; Panel2: TPanel; Image1: timage; procedure Image1StartDrag(Sender: TObject; var DragObject: TDragObject); procedure FormCreate(Sender: TObject); procedure Panel1DragOver(Sender,Y: Integer; State: TDragState; var Accept: Boolean); procedure FormDestroy(Sender: TObject); procedure Panel1DragDrop(Sender,Y: Integer); private { Private-Deklarationen } fdragObject:TMyDragObject; public { Public-Deklarationen } end; var Form3: TForm3; implementation constructor TMyDragObject.Create(AControl: TControl); begin inherited; FImageList:=timageList.Create(nil); end; destructor TMyDragObject.Destroy; begin FImageList.Free; inherited; end; function TMyDragObject.GetDragImages: TDragImageList; begin Result := FImageList; end; {$R *.dfm} procedure TMyDragObject.StartDrag(G: TGraphic;p:TPoint;DragSource:TControl); var bmp:TBitMap; begin fdragSource := DragSource; bmp:=TBitMap.Create; try FImageList.Width := g.Width; FImageList.Height := g.Height; bmp.Width := g.Width; bmp.Height := g.Height; bmp.Canvas.Draw(0,g); FImageList.Add(bmp,nil); finally bmp.Free; end; FImageList.SetDragImage(0,p.x,p.y) end; procedure TForm3.FormCreate(Sender: TObject); var i:Integer; begin ControlStyle := ControlStyle + [csdisplayDragImage]; for I := 0 to ControlCount -1 do if Controls[i] is TPanel then TPanel(Controls[i]).ControlStyle := TPanel(Controls[i]).ControlStyle + [csdisplayDragImage]; ReportMemoryLeaksOnShutDown := True; end; procedure TForm3.FormDestroy(Sender: TObject); begin if Assigned(fdragObject) then fdragObject.Free; end; procedure TForm3.Image1StartDrag(Sender: TObject; var DragObject: TDragObject); var p:TPoint; begin p:=timage(Sender).ScreenToClient(mouse.cursorpos); if Assigned(fdragObject) then fdragObject.Free; fdragObject := TMyDragObject.Create(timage(Sender)); fdragObject.StartDrag(timage(Sender).Picture.Graphic,p,timage(Sender)); DragObject := fdragObject; end; procedure TForm3.Panel1DragDrop(Sender,Y: Integer); begin if fdragObject.DragSource is timage then timage(fdragObject.DragSource).Parent := TPanel(Sender); end; procedure TForm3.Panel1DragOver(Sender,Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TMyDragObject; end; end.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。