如何在delphi中用鼠标移动圆?

circle:Shape;

最佳答案

请确保使用ClientToScreenScreenToClient将从控件上的MouseMove获得的Mouse X,Y客户端坐标转换为父级的客户端。

以下过程将控件的中心移到其客户坐标中的点(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事件处理程序钩住其他控件即可::-)

10-03 00:53