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

时间:2010-03-04 21:52:39

标签: delphi shape

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

circle:Shape;

3 个答案:

答案 0 :(得分:6)

请务必使用ClientToScreenScreenToClient将您从Control上的MouseMove获得的Mouse X,Y客户端坐标转换为Parent的客户端。

以下过程将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事件处理程序挂钩其他控件......: - )

答案 1 :(得分:5)

如果你去我的网页,你可以找到一些样本(所有包含代码)可以帮助你解决这个问题。 "Sample for visual work with figures and plans";使用两个组件可视化地管理,移动,调整大小和保存元素;一个用于选择,移动,调整大小,...(TSeleccOnRuntime)和其他(TSaveComps)用于保存状态(位置,大小......)。 alt text http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png

Select Shapes Visually;样本用于解释选择视觉形状和图像的两种模式。

Create, move and resive controls on Runtime (like IDE); TSeleccOnRuntime组件的另一个示例。模拟和IDE。

alt text http://neftali-mirror.site11.com/images/image_ej_form_designer.png

最后是Create/destroy components in runtime and move with mouse的另一个样本;该样品不含组分。样本中的所有代码。

alt text http://neftali-mirror.site11.com/images/imagen_ej_mover_mouse.png

我希望这对你有用 问候

P.D:我的英语不好的借口。

答案 2 :(得分: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左上角之间的差异。