DragDropHelper.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. {*****************************************************************************
  2. Name : DragDropHelper
  3. Author : Perevoznyk Serhiy
  4. Description : Drag & Drop Helper component provides an images that are
  5. : displayed during drag and drop operations
  6. History :
  7. Date By Description
  8. ---- -- -----------
  9. 30-07-2004 Perevoznyk Serhiy Initial creation of the Unit.
  10. *****************************************************************************}
  11. unit DragDropHelper;
  12. interface
  13. uses
  14. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  15. ExtCtrls, StdCtrls;
  16. type
  17. TInternalDragImageObject = class(TBaseDragControlObject)
  18. protected
  19. FHelper : TComponent;
  20. FImageList: TDragImageList;
  21. FBitmap : TBitmap;
  22. FMaskColor: TColor;
  23. function GetDragImages: TDragImageList; override;
  24. function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override;
  25. procedure SetBitmap(ABitmap: TBitmap);
  26. public
  27. constructor Create(AControl: TControl); override;
  28. destructor Destroy; override;
  29. property Bitmap: TBitmap read FBitmap write SetBitmap;
  30. property MaskColor: TColor read FMaskColor write FMaskColor;
  31. end;
  32. TOnGetDragImage = procedure(Sender : TObject; AControl : TControl; ABitmap : TBitmap) of object;
  33. TOnGetHotSpot = procedure(Sender : TObject; var X : integer; var Y : integer) of object;
  34. TOnGetDragCursor = procedure(Sender : TObject; Accepted : boolean; X, Y : integer; var ACursor : TCursor) of object;
  35. TDragDropHelper = class(TComponent)
  36. private
  37. FOnGetDragImage : TOnGetDragImage;
  38. FDragObject : TInternalDragImageObject;
  39. FMaskColor : TColor;
  40. FBitmap : TBitmap;
  41. FOnGetHotSpot : TOnGetHotSpot;
  42. FOnGetDragCursor : TOnGetDragCursor;
  43. procedure SetBitmap(const Value: TBitmap);
  44. public
  45. constructor Create(AOwner : TComponent); override;
  46. destructor Destroy; override;
  47. function GetDragObject(AControl : TControl) : TDragObject;
  48. published
  49. property OnGetDragImage : TOnGetDragImage read FOnGetDragImage write FOnGetDragImage;
  50. property MaskColor : TColor read FMaskColor write FMaskColor default clFuchsia;
  51. property Bitmap : TBitmap read FBitmap write SetBitmap;
  52. property OnGetHotSpot : TOnGetHotSpot read FOnGetHotSpot write FOnGetHotSpot;
  53. property OnGetDragCursor : TOnGetDragCursor read FOnGetDragCursor write FOnGetDragCursor;
  54. end;
  55. procedure Register;
  56. implementation
  57. procedure Register;
  58. begin
  59. RegisterComponents('Additional', [TDragDropHelper]);
  60. end;
  61. constructor TInternalDragImageObject.Create(AControl: TControl);
  62. begin
  63. inherited Create(AControl);
  64. FBitmap:=nil;
  65. FImageList:=TDragImageList.CreateSize(10, 10);
  66. FMaskColor:= clFuchsia;
  67. end;
  68. procedure TInternalDragImageObject.SetBitmap(ABitmap: TBitmap);
  69. var
  70. XBitMap: TBitMap;
  71. X, Y : integer;
  72. begin
  73. X := 0;
  74. Y := 0;
  75. FImageList.Clear;
  76. if Assigned(ABitmap) then
  77. begin
  78. FBitmap:=ABitmap;
  79. XBitMap:=TBitMap.Create;
  80. try
  81. XBitMap.Width:= ABitmap.Width;
  82. XBitMap.Height:=ABitmap.Height;
  83. XBitMap.Canvas.Draw(0, 0, ABitmap);
  84. FImageList.Width:= XBitMap.Width;
  85. FImageList.Height:=XBitMap.Height;
  86. FImageList.AddMasked(XBitMap, FMaskColor);
  87. if Assigned(FHelper) then
  88. begin
  89. if Assigned(TDragDropHelper(FHelper).OnGetHotSpot) then
  90. begin
  91. TDragDropHelper(FHelper).OnGetHotSpot(Self, X, Y);
  92. FImageList.SetDragImage(0, X, Y);
  93. end;
  94. end;
  95. finally
  96. XBitMap.Free;
  97. end;
  98. end;
  99. end;
  100. destructor TInternalDragImageObject.Destroy;
  101. begin
  102. FImageList.Free;
  103. FImageList:=nil;
  104. inherited;
  105. end;
  106. function TInternalDragImageObject.GetDragImages: TDragImageList;
  107. begin
  108. Result:=FImageList;
  109. end;
  110. function TInternalDragImageObject.GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor;
  111. begin
  112. Result:=inherited GetDragCursor(Accepted, X, Y);
  113. if Assigned(TDragDropHelper(FHelper).FOnGetDragCursor) then
  114. TDragDropHelper(FHelper).FOnGetDragCursor(Self, Accepted, X, Y, Result);
  115. if Assigned(DragTarget) and not (csDisplayDragImage in TControl(DragTarget).ControlStyle) then
  116. TControl(DragTarget).ControlStyle:= TControl(DragTarget).ControlStyle + [csDisplayDragImage];
  117. end;
  118. { TDragDropHelper }
  119. constructor TDragDropHelper.Create(AOwner: TComponent);
  120. begin
  121. inherited;
  122. FDragObject := nil;
  123. FMaskColor := clFuchsia;
  124. FBitmap := TBitmap.Create;
  125. end;
  126. destructor TDragDropHelper.Destroy;
  127. begin
  128. if Assigned(fDragObject) then
  129. FDragObject.Free;
  130. FDragObject := nil;
  131. FBitmap.Free;
  132. inherited;
  133. end;
  134. function TDragDropHelper.GetDragObject(AControl: TControl): TDragObject;
  135. var
  136. XBitmap : TBitmap;
  137. begin
  138. if not Assigned(AControl) then
  139. begin
  140. Result := nil;
  141. Exit;
  142. end;
  143. if not Assigned(FDragObject) then
  144. FDragObject := TInternalDragImageObject.Create(nil);
  145. FDragObject.Control := AControl;
  146. FDragObject.FHelper := Self;
  147. FDragObject.FMaskColor := Self.FMaskColor;
  148. XBitmap := TBitmap.Create;
  149. if (Assigned(FBitmap)) then
  150. begin
  151. if not FBitmap.Empty
  152. then
  153. XBitmap.Assign(FBitmap)
  154. else
  155. if Assigned(FOnGetDragImage) then
  156. FOnGetDragImage(Self, AControl, XBitmap);
  157. end
  158. else
  159. begin
  160. if Assigned(FOnGetDragImage) then
  161. FOnGetDragImage(Self, AControl, XBitmap);
  162. end;
  163. FDragObject.Bitmap := XBitmap;
  164. XBitmap.Free;
  165. Result := FDragObject;
  166. end;
  167. procedure TDragDropHelper.SetBitmap(const Value: TBitmap);
  168. begin
  169. FBitmap.Assign(Value);
  170. end;
  171. end.