以下のコードは、ドラッグ操作中にコントロール (ラベルなど) がドラッグ画像を表示できるようにします。
私の問題は、ドラッグが開始されたときにドラッグ画像を即座に表示したくないことです。マウスがコントロールの特定の境界にあるときに画像を表示したいです。ラベルの右半分に .
これまでのところ、これに対する解決策を見つけることができませんでした.VCLソースを変更しない限り、画像は即座に表示されます. VCL ドラッグ アンド ドロップ ユーティリティを放棄し、マウスをキャプチャするカスタム ユーティリティをロールする前に、この時点で目的の動作を取得するためのトリックに感謝します。
ラベルのドラッグ画像を有効にする疑似コードの例を次に示します。
{ turn on dragging }
Label1.DragMode := dmManual;
Label1.ControlStyle := Label1.ControlStyle + [csDisplayDragImage];
type
// VCL needs this for getting drag images..
TMyDragObject = class(TDragControlObject)
protected
function GetDragImages: TDragImageList; override;
end;
function TMyDragObject.GetDragImages: TDragImageList;
begin
Result := Form1.ImageList1;
end;
procedure TForm1.Label1MouseDown(...);
begin
{ start the dragging manually }
Label1.BeginDrag(False, 4); // the problem area! image is shown instantly at here!
end;
procedure TForm1.Label1StartDrag(Sender: TObject; var DragObject: TDragObject);
var b : TBitmap;
begin
ImageList1.Clear;
DragObject := TMyDragObject.Create(self);
b := TBitmap.Create;
try
b.Width := ImageList1.Width;
b.Height := ImageList1.Height;
b.LoadFromFile('/path/to/image');
ImageList1.Add(b, nil);
finally
b.Free;
end;
end;
procedure TForm1.Label1MouseMove(...);
begin
if X > Label1.Width div 2 then // right half
// ??? - do show the drag image
else
// ??? - no drage image should be shown
end;