delphi如何用鼠标移动圆圈?
circle:Shape;
ClientToScreen
请务必使用and将您从 Control 上的 MouseMove 获得的 Mouse X,Y 客户端坐标转换为 Parent 的客户端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 事件处理程序挂钩其他控件... :-)
如果您访问我的网页,您可以找到一些示例(全部包含代码),可以帮助您解决这个问题。 “带有图形和平面图的视觉作品样本”;使用两个组件直观地管理、移动、调整大小和保存元素;一个用于选择,移动,调整大小,...(TSeleccOnRuntime)和其他(TSaveComps)用于保存状态(位置,大小,...)。 替代文字 http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png
直观地选择形状;示例用于解释选择视觉形状和图像的两种模式。
在运行时创建、移动和更改控件(如 IDE);TSeleccOnRuntime 组件的另一个示例。模拟和IDE。
替代文字 http://neftali-mirror.site11.com/images/image_ej_form_designer.png
最后是另一个在运行时创建/销毁组件并使用鼠标移动的示例;该样品不含组件。示例中的所有代码。
替代文字 http://neftali-mirror.site11.com/images/imagen_ej_mover_mouse.png
我希望这对你有用。
问候
PD:请原谅我的英语不好。
好吧,我没有太多事情要做,但是让一些东西跟随鼠标移动通常是这样的:
在某处有一个“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 左上角之间的差异。