1

以下のコードは、ドラッグ操作中にコントロール (ラベルなど) がドラッグ画像を表示できるようにします。

私の問題は、ドラッグが開始されたときにドラッグ画像を即座に表示したくないことです。マウスがコントロールの特定の境界にあるときに画像を表示したいです。ラベルの右半分に .

これまでのところ、これに対する解決策を見つけることができませんでした.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;
4

3 に答える 3

1

b という名前の TBitmap をグローバル変数にして、次の行を削除します。

ImageList1.Add(b, nil);

Label1StartDrag プロシージャから、OnDragOverProcedure に配置します。これにより、マウスが

Label1.BeginDrag(False, 4);

于 2009-09-09T21:41:10.500 に答える
0

このトピックに関する沈黙が意味するように、私が望むのは、デフォルトの VCL ドラッグ アンド ドロップ ユーティリティに対して少し過剰であると思います。

とにかく、目的の効果を得るために、つまりドラッグ操作をより細かく制御するには、マウスをキャプチャしてメッセージを手動で処理する方法を次に示します。

  SetCapture(Handle);
  try
    while GetCapture = Handle do 
       { Process messages like mouse move, click, etc..
         ie. Change the drag image when the control under cursor changes.. } 
  finally
    if Handle = GetCapture then
      ReleaseCapture;
  end;
于 2009-04-05T23:20:17.150 に答える
0

Label1.DragMode := dmAutomatic;

dmManual を使用しようとしましたか? もう少しコードを書く必要がありますが、より多くのプロセスを変更できます。

ところで、なぜ標準的な動作を変更したいのですか? ユーザーはおそらく標準を期待しており、プログラムの動作が異なるとイライラする可能性があります。

于 2009-03-19T14:43:35.190 に答える