Delphi获取有关表单左侧的控件来源

use*_*818 3 delphi delphi-xe

我想获取关于容器表单的控件的 Left,Top 坐标。同时,目标控件可能位于任意数量的其他容器(例如 TPanels 和 TGroupBoxes)内。这意味着要获取目标控件原点,代码必须考虑所有其他容器的 Left,Top 坐标 + 目标控件本身的 Left,Top 坐标。相反,我使用了第二个方法,即使用 ClientToScreen 函数获取目标控件的 Left,Top 屏幕坐标,然后减去窗体的 Left,Top 坐标。可悲的是,这种方法不起作用。我附上了一张图像,它阐明了我的想法,并提供了我用来计算所需坐标的实际代码。我很感激这方面的任何帮助。在此处输入图片说明

Rem*_*eau 5

@VitaliyG 的回答显示了如何将控件的绝对左上角坐标转换为相对于表单的客户端坐标。如果要转换控件客户区左上角的坐标,可以将控件的ClientOrigin属性传递给 Form 的ScreenToClient()方法:

function GetControlClienOrigin(const aControl: TControl: const aForm: TForm): TPoint;
begin
  Result := aForm.ScreenToClient(aControl.ClientOrigin);
end;
Run Code Online (Sandbox Code Playgroud)

如果有问题的控件是TWinControl后代,另一种方法是改用 Win32 APIMapWindowPoints()函数:

function GetControlClientOrigin(const aControl: TWinControl: const aForm: TForm): TPoint;
var
  Pt: TPoint;
begin
  Pt := Point(0, 0);
  SetLastError(0);
  if MapWindowPoints(aControl.Handle, aForm.Handle, Pt, 1) = 0 then
    CheckOSError(GetLastError);
  Result := Pt;
end;
Run Code Online (Sandbox Code Playgroud)