请务必将鼠标X转换,Y坐标的客户,你从MouseMove事件得到你的控制父的客户端使用,以ClientToScreen和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;
Run Code Online (Sandbox Code Playgroud)
现在要在单击时移动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;
Run Code Online (Sandbox Code Playgroud)
要测试它,请使用以下代码在表单中删除一个按钮:
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;
Run Code Online (Sandbox Code Playgroud)
现在,这是一个极简主义的例子,但它应该让你开始.
为了好玩,只需使用此MouseMove事件处理程序挂钩其他控件...... :-)
如果你去我的网页,你可以找到一些样本(所有包含代码)可以帮助你解决这个问题. "用数字和计划进行视觉工作的样本" ; 使用两个组件可视化地管理,移动,调整大小和保存元素; 一个用于选择,移动,调整大小,...(TSeleccOnRuntime)和其他(TSaveComps)用于保存状态(位置,大小......). alt text http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png
选择形状视觉 ; 样本用于解释选择视觉形状和图像的两种模式.
在Runtime上创建,移动和重置控件(如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
我希望这对你有用.
问候
PD:我的英语不好的借口.