我想获得关于容器形式的控件的Left,Top坐标。目标控件可以同时在任何数量的其他容器内,例如TPanels和TGroupBoxes。这意味着要获取目标控件原点,代码应该考虑所有其他容器的Left,Top坐标+目标控件本身的Left,Top坐标。相反,我正在使用第二个approuch,它包括使用ClientToScreen函数获取目标控件的Left,Top屏幕坐标,然后减去表单的Left,Top坐标。可悲的是,这种做法并不奏效。我附上的图像澄清了我的想法,并且有我用来计算所需坐标的实际代码。我很感激您的帮助。
答案 0 :(得分:3)
尝试使用ClientToParent并将表单指定为Parent
参数。
你必须传递相对于控制的坐标,所以控件的顶部,左侧将处于控制状态(0,0)
Control.ClientToParent(TPoint.Create(0,0), Form)
答案 1 :(得分:2)
@ VitaliyG的答案显示了如何将控件的绝对左上角的坐标转换为与Form相关的客户端坐标。如果您想要转换控件客户区左上角的坐标,则可以将控件的ClientOrigin
属性传递给表单{{1}方法:
ScreenToClient()
如果有问题的控件是function GetControlClienOrigin(const aControl: TControl: const aForm: TForm): TPoint;
begin
Result := aForm.ScreenToClient(aControl.ClientOrigin);
end;
后代,则可以选择使用Win32 API MapWindowPoints()
函数:
TWinControl
端;
答案 2 :(得分:0)
所以这3个语句返回相同的,需要TPoint
:
aControl.ClientOrigin - aForm.ClientOrigin;
aControl.ClientToParent(Point(0,0), aForm);
aForm.ScreenToClient(aControl.ClientOrigin);