Приложение FireMonkey с несколькими мониторами - PullRequest
2 голосов
/ 22 января 2020

Мне нужно получить масштаб экрана для монитора, на котором отображается мое приложение. Многоплатформенная среда выполнения TPlatFormServices имеет службу под названием IFMXScreenService, которая возвращает экранную шкалу (GetScreenScale).

Проблема в том, что она возвращает его только для основного монитора. Мне нужно получить его для любого монитора, на котором запущено мое приложение.

Ниже приведен мой код C ++ для получения IFMXScreenService. Как мне изменить его, чтобы получить сервис экрана для моего активного монитора?

if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXScreenService)) == true)
{
  pScreenService_ = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXScreenService));
}                         

Ответы [ 2 ]

1 голос
/ 22 января 2020

На данный момент я просто изменил под Windows и добавил следующую подпрограмму в свой базовый класс:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TFormBase::GetScaleFactor()
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

double TFormBase::GetScaleFactor(void)
{
    double fScale = 0.0;
    #ifdef WIN32
    TPoint objTopLeft = TPoint(Left,Top);
    HMONITOR hMonitor = MonitorFromPoint(objTopLeft,MONITOR_DEFAULTTONULL);
    if (hMonitor != NULL)
    {
        DEVICE_SCALE_FACTOR nScaleFactor;
        if (GetScaleFactorForMonitor(hMonitor,&nScaleFactor) == S_OK)
        {
            fScale = static_cast<double> ((static_cast<int> (nScaleFactor))) / 100.0;
        }
    }

    if (fScale == 0.0)
    {
        fScale = ScreenService->ScreenScale;
    }
    #else
    fScale = ScreenService->ScreenScale;
    #endif

    return fScale;
}
0 голосов
/ 23 января 2020

Я не знаю, как в C ++ Builder, в Delphi я делаю это следующим образом

function GetScreenshotZoom(APoint: TPoint): Single; overload;
var
  Monitor: HMonitor;
  DpiX, DpiY: Cardinal;
begin
  if TOSVersion.Check(6, 3) then
  begin
    Monitor := Winapi.MultiMon.MonitorFromPoint(APoint, MONITOR_DEFAULTTONEAREST);
    GetDPIForMonitor(Monitor, MDT_Default, DpiX, DpiY);
    Result := DpiX / StandardDpi;
  end
  else
    Result := 1;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...