如何在Delphi中用鼠标移动圆形?
circle:Shape;
请务必使用 ClientToScreen
和 ScreenToClient
将从 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事件处理程序连接即可... :-)
嗯,我没有太多的线索,但通常按照鼠标移动某物的方法如下:
在某处设置一个“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左上角之间的差异。
TShape
组件表示的,还是你自己在一个更大的画布对象上绘制的? - Rob Kennedy