Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   FMX IFMXScreenService GetScreenScale (https://www.delphipraxis.net/203247-fmx-ifmxscreenservice-getscreenscale.html)

t2000 28. Jan 2020 10:11

FMX IFMXScreenService GetScreenScale
 
Moin zusammen,

ich benötige die Skalierung des Monitor in Firemonkey. Und zwar von dem, auf dem die Anwendung läuft.

Ich nutze zur Zeit folgendes:

Code:
  FMXScreenService := IFMXScreenService( TPlatformServices.Current.GetPlatformService(IFMXScreenService));
  FMXDisplayService := IFMXMultiDisplayService( TPlatformServices.Current.GetPlatformService(IFMXMultiDisplayService));

  CurrentDisplay := FMXDisplayService.DisplayFromWindow( MeineMainForm.Handle);
  CurrentScreenScale := FMXScreenService.GetScreenScale;
Ich habe 3 Monitore. Einer hat 100% und die anderen 150%. Der Primary Monitor ist 150%
Ich kann mit FMXDisplayService.DisplayFromWindow(MeineMainForm. Handle) den aktuellen Monitor ermitteln. Aber wie bekomme ich die Skalierung? Eine Property ist nicht vorhanden und beim ScreenService bekomme ich immer 150%, egal auf welchem Monitor die Anwendung läuft.
Wie kann ich FMXScreenService beibringen, "meinen" Monitor zu untersuchen?

Danke
VG Thomas

Der schöne Günther 28. Jan 2020 10:29

AW: FMX IFMXScreenService GetScreenScale
 
So wie es aussieht hat FireMonkey noch nicht mitbekommen dass man unter Windows (seit ca sechseinhalb Jahren) unterschiedliche DPIs auf verschiedenen Monitoren haben kann:

https://stackoverflow.com/q/59850739/2298252

t2000 28. Jan 2020 10:58

AW: FMX IFMXScreenService GetScreenScale
 
aufgerufen wird dieses:

Delphi-Quellcode:
function GetDCScale(const DC: HDC): Single;
begin
  Result := GetDeviceCaps(DC, LOGPIXELSX) / StandardDpi;
end;
Die Funktion beschrieben ist hier:
https://docs.microsoft.com/en-us/win...-getdevicecaps

aber auch dort wird für alle Displays der selbe Wert ausgegeben

Zitat:

Number of pixels per logical inch along the screen width. In a system with multiple display monitors, this value is the same for all monitors.

t2000 28. Jan 2020 11:05

AW: FMX IFMXScreenService GetScreenScale
 
Wenn ich fest von Windows als Plattform ausgehe, kann ich dieses nutzen:

Delphi-Quellcode:
CurrentScreenScale := WindowHandleToPlatform( MeinMainForm.Handle).Scale;

Kenn jemand ein Interface, welches diese Funktion entsprechend kapselt?

philipp.hofmann 28. Jan 2020 12:42

AW: FMX IFMXScreenService GetScreenScale
 
Ich persönlich nutze eine andere Variante, weil GetScreenScale nur beim ersten Display funktioniert. Elegant ist anders, aber es funktioniert:

Delphi-Quellcode:
  osScale:=1.00;
  if ((currentDisplay=0) and (TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(service)))) then
  begin
    osScale:=service.GetScreenScale;
  end else begin
    if (lastWindowState<>TWindowState.wsMaximized) then
      self.WindowState:=TWindowState.wsMaximized;
    try
      osScale:=Screen.Displays[currentDisplay].BoundsRect.Width / self.Width;
    except on E: Exception do
      begin
        osScale:=1;
      end;
    end;
    if (lastWindowState<>TWindowState.wsMaximized) then
      self.WindowState:=TWindowState.wsNormal;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz