3

Delphiでマウスで円を移動するには?

circle:Shape;
4

3 に答える 3

6

コントロールの MouseMove から取得したマウスの X、Y クライアント座標を、 および を使用して親のクライアントに変換してClientToScreenくださいScreenToClient

次の手順では、Control の中心をクライアント座標の点 (X,Y) に移動します。

procedure MoveControl(AControl: TControl; const X, Y: Integer);
var
  lPoint: TPoint;
begin
  lPoint := AControl.Parent.ScreenToClient(AControl.ClientToScreen(Point(X, Y)));
  AControl.Left := lPoint.X - AControl.Width div 2;
  AControl.Top := lPoint.Y - AControl.Height div 2;
end;

クリックされたときに TShape を移動するには、次の MouseMove イベント ハンドラを提供する必要があります。

procedure TForm1.ShapeToMoveMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then // only move it when Left-click is down
    MoveControl(Sender as TControl, X, Y);
end;

テストするには、次のコードを使用してフォームにボタンをドロップします。

procedure TForm1.ButtonTestClick(Sender: TObject);
begin
  with TShape.Create(nil) do
  begin
    Name := Format('ShapeToMove%d',[Self.ControlCount + 1]);
    Parent := Self; // Parent will free it
    Shape := stCircle;
    Width := 65;
    Height := 65;
    OnMouseMove := ShapeToMoveMouseMove;
  end;
end;

これは最小限の例ですが、これで始めることができます。
楽しみのために、この MouseMove イベント ハンドラーで他​​のコントロールをフックするだけです... :-)

于 2010-03-05T02:04:23.310 に答える
0

さて、私にはあまり多くのことはありませんが、マウスに追従して何かを動かすには、通常、次のように動作します。

どこかに「IsFollowingMouse」フラグを立ててください。マウスを追う必要があるときにオンにします。フォームの MouseMove イベントで、次のようにします。

procedure TMyForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FIsFollowingMouse then
  begin
    myCircle.left := x + fShapeOffsetX;
    myCircle.top := y + fShapeOffsetY;
  end;
end;

オフセットは、マウス ポインタの位置と TShape の左上隅との差を与える変数です。

于 2010-03-04T23:46:55.007 に答える