如何在Delphi中使用鼠标移动圆形?

3
如何在Delphi中用鼠标移动圆形?
circle:Shape;

你目前有多少进展了?这个圆是由一个 TShape 组件表示的,还是你自己在一个更大的画布对象上绘制的? - Rob Kennedy
它是 TShape。我不知道选择哪个事件使圆圈随鼠标移动。 - klaawz
3个回答

6

请务必使用 ClientToScreenScreenToClient 将从 Control 的 MouseMove 中获得的鼠标 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事件处理程序连接即可... :-)


我认为“所有者”已经释放了它,父对象会传递消息,比如 wm_paint。我会将构造函数改为 create(self)。 - James Barrass
无论谁先射击,所有者或其父级别将释放它。如果这纯粹是视觉方面的,则可以将工作留给其父级别,这是其角色。 - Francesca

5
如果您访问我的网页,您可以找到一些示例(所有示例都包含代码),这些示例可以帮助您解决这个问题。 “用于可视化处理图形和计划的示例”;使用两个组件来可视化地管理、移动、调整大小和保存元素;一个用于选择、移动、调整大小等操作(TSeleccOnRuntime),另一个(TSaveComps)用于保存状态(位置、大小等)。 alt text http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png “可视化选择形状”的示例;介绍了两种可视化选择形状和图像的模式。 “在运行时创建、移动和调整控件(类似IDE)”;另一个TSeleccOnRuntime组件的示例。模拟IDE。 alt text http://neftali-mirror.site11.com/images/image_ej_form_designer.png 最后是另一个示例,“在运行时创建/销毁组件并使用鼠标移动”;这个示例是没有组件的,所有代码都在示例中。 alt text http://neftali-mirror.site11.com/images/imagen_ej_mover_mouse.png 希望对您有用。
问候
注:抱歉我的英语不好。

你的网站上有一些非常好的组件。WMI 组件的工作非常出色。Brian。 - Brian Frost
@Neftali:你能否请看一下我下面的问题? https://dev59.com/xUzSa4cB1Zd3GeqPmGBT - Brian Frost

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左上角之间的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接