如何在 FireMonkey 中进行屏幕缩放?

How do I get the screen scaling in FireMonkey?

使用 C++ Builder v. 10.2.3,我想将正在调整大小的 TForm 居中。为此,我使用 TScreen::WorkArea 值。但是,运行 在 Windows 10 缩放比例为 125% 的系统上,代码无法正常工作,因为 TForm 已按比例放大。我如何确定是否发生了这种缩放,然后相应地进行调整? FireMonkey 中是否有内置功能来执行此操作?我应该注意到,在 Windows 10 中缩放 > 100%,TForm::TPosition 值似乎无法正常工作 - 例如,将其设置为 ScreenCenter 似乎有类似的问题,但它不是t 实际上居中。

此函数将 return 屏幕缩放,即如果您在 Windows 上使用 125% 缩放则为 1.25:

function GetScreenScale: Single;
var ScreenService: IFMXScreenService;
begin
  Result := 1;
  if TPlatformServices.Current.SupportsPlatformService (IFMXScreenService, IInterface(ScreenService)) then
    Result := ScreenService.GetScreenScale;
end;

请注意,在 Mac 上,唯一可能的屏幕缩放比例是 1.0(非视网膜)和 2.0(视网膜)。然而,在 Mac 上,由 TScreen 编辑的值 return 已经缩放,因此不需要更正。

汉斯答案的 C++ 等价物是

double GetScreenScale ()
{
    double value = 1.0;
    _di_IFMXScreenService screenService;
    if (TPlatformServices::Current->SupportsPlatformService (__uuidof (IFMXScreenService), &screenService))
        value = screenService->GetScreenScale ();
    return value;
}