好吧,在 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 就可以了。