[教程]FMX 下将当前控件的相对坐标转换为屏幕坐标

好吧,在 VCL 里简单的 ClientToScreen,到了 FMX 就变得不是那么简单了。这就牵涉到了 FMX 的坐标体系,咱们不在这里的展开说明,仅提供实现的介绍:

1、调用控件的 LocalToAbsolute 将控件坐标转换为绝对坐标,这个绝对坐标是相对于 Form 的,所以不要以为它是屏幕坐标,这是人很容易看名字猜为屏幕坐标。

2、调用控件场景的 LocalToScreen 将绝对坐标转换为屏幕坐标。

所以,FMX 的 LocalToScreen 也就变成了:

pt:=Control.Scene.LocalToScreen(Control.LocalToAbsolute(pt));

同理,将屏幕坐标转换为控件坐标的代码,也就需要逆过来,就不再缀述。

好了,为了方便,我们简单的 helper 下吧。

type
  TScreenClientHelper = class helper for TControl
    function ClientToScreen(const pt: TPointF): TPointF;inline;
    function ScreenToClient(const pt: TPointF): TPointF;inline;
  end;

{ TScreenClientHelper }

function TScreenClientHelper.ClientToScreen(const pt: TPointF): TPointF;
begin
  Result := Scene.LocalToScreen(LocalToAbsolute(pt));
end;

function TScreenClientHelper.ScreenToClient(const pt: TPointF): TPointF;
begin
  Result := AbsoluteToLocal(Scene.ScreenToLocal(pt));
end;

然后直接调用 ClientToScreen/ScreenToClient 就可以了。

分享到: