Ceci est une ancienne révision du document !
Drag & Drop
Afficher une image lors d'un Drag & Drop
Pour afficher une image lorsque l'on fait un drag and drop on peut utiliser cette méthode.
Cette astuce proviens directement des exemples dans LAZARUS, dans exemples/dragimagelist
{ TTileDragObject } interface ... TTileDragObject = class(TDragControlObjectEx) private FDragImages: TDragImageList; protected function GetDragImages: TDragImageList; override; public constructor Create(AControl: TControl); override; destructor Destroy; override; end; ... implementation { TTileDragObject } function TTileDragObject.GetDragImages: TDragImageList; begin Result := FDragImages; end; constructor TTileDragObject.Create(AControl: TControl); var vBitmap: Graphics.TBitmap; begin inherited Create(AControl); FDragImages := TDragImageList.Create(AControl); AlwaysShowDragImages := C_SHOW_DRAG_IMAGE; vBitmap := Graphics.TBitMap.Create; try vBitmap.Width := AControl.Width; vBitmap.Height := AControl.Height; if AControl is TWinControl then TWinControl(AControl).PaintTo(vBitmap.Canvas, 0, 0); FDragImages.Width := vBitmap.Width; FDragImages.Height := vBitmap.Height; FDragImages.add(vBitmap, nil); FDragImages.DragHotspot := Classes.Point(vBitmap.Width div 2, vBitmap.Height div 2); finally vBitmap.Free; end; end; destructor TTileDragObject.Destroy; begin FDragImages.Free; inherited Destroy; end;
Le Control qui doit être dessiné doit implémenter la méthode PaintTo :
procedure TTICTileControl.Paint; var ARect: TRect; begin ARect := GetClientRect; Canvas.FillRect(ARect); end; procedure TTICTileControl.PaintTo(DC: HDC; X, Y: integer); var DCChanged: boolean; begin DCChanged := (not Canvas.HandleAllocated) or (Canvas.Handle <> DC); if DCChanged then Canvas.Handle := DC; try Paint; finally if DCChanged then Canvas.Handle := 0; end; end;
Dans le OnStartDrag on doit créer et remplir le TDragObject
procedure TTICTileControl.DoStartDrag(var DragObject: TDragObject); var vDO: TTileDragObject; begin vDO := TTileDragObject.Create(Self); vDO.Control := self; DragObject := vDO; ... end;
Vous pourriez laisser un commentaire si vous étiez connecté.