德尔福获取关于表格左侧的控制来源

时间:2014-09-22 15:35:44

标签: delphi delphi-xe

我想获得关于容器形式的控件的Left,Top坐标。目标控件可以同时在任何数量的其他容器内,例如TPanels和TGroupBoxes。这意味着要获取目标控件原点,代码应该考虑所有其他容器的Left,Top坐标+目标控件本身的Left,Top坐标。相反,我正在使用第二个approuch,它包括使用ClientToScreen函数获取目标控件的Left,Top屏幕坐标,然后减去表单的Left,Top坐标。可悲的是,这种做法并不奏效。我附上的图像澄清了我的想法,并且有我用来计算所需坐标的实际代码。我很感激您的帮助。enter image description here

3 个答案:

答案 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);