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/)
-   -   Mit Delphi den Skalierungsfaktor herausfinden (https://www.delphipraxis.net/191954-mit-delphi-den-skalierungsfaktor-herausfinden.html)

ShortAnni 7. Mär 2017 09:30

Mit Delphi den Skalierungsfaktor herausfinden
 
Hallo,

ich habe mal wieder ein kleines Problem.

Ich möchte mit Delphi herausfinden welche Skalierung in Windows (100%, 125%, 150%) eingestellt ist. Zumindest für den primären Monitor.
Hat jemand eine Idee wie man das macht.

LG Anni

Sherlock 7. Mär 2017 09:34

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Ich hatte da mal das hier gefunden und für mich folgendes rausgezogen:

Delphi-Quellcode:
function TPaintingGrid.SetScreenDPIandScale(const Context: TFmxObject = nil):
  Boolean;
var
  DeviceBehavior: IDeviceBehavior;
  DisplayMetrics: TDeviceDisplayMetrics;
{$IFDEF ANDROID}
  dm: JDisplayMetrics;
{$ENDIF}
begin
  Result := False;
{$IFDEF ANDROID}
  dm := GetJDisplayMetrics;
  if dm <> nil then
  begin
    fppi := dm.densityDpi;
    fScale := dm.scaledDensity;
    Result := True;
    exit;
  end;
{$ENDIF}
  if TBehaviorServices.Current.SupportsBehaviorService(IDeviceBehavior,
    DeviceBehavior, Context) then
  begin
    DisplayMetrics := DeviceBehavior.GetDisplayMetrics(Context);
    fScale := DisplayMetrics.ScreenScale;
    fppi := DisplayMetrics.PixelsPerInch; // / (fScale * fScale);
    fScreenWidth := DisplayMetrics.LogicalScreenSize.Width;
    Result := True;
  end;
end;
Sherlock

t.roller 7. Mär 2017 09:48

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Ab WIN8.1:
GetScaleFactorForMonitor

ShortAnni 7. Mär 2017 10:12

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Super, ich danke euch. Ich werde das gleich mal probieren.

LG Anni

Uwe Raabe 7. Mär 2017 10:40

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Dies sollte auch gehen:

Delphi-Quellcode:
result := Round(Screen.PrimaryMonitor.PixelsPerInch*100/96); // ganze Prozent


Ist auch leicht auf alle Monitore zu erweitern.

t.roller 7. Mär 2017 12:51

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1363414)
Dies sollte auch gehen:

Delphi-Quellcode:
result := Round(Screen.PrimaryMonitor.PixelsPerInch*100/96); // ganze Prozent
Ist auch leicht auf alle Monitore zu erweitern.

XE7 kennt Screen.PrimaryMonitor.PixelsPerInch nicht.
Ersatz:
Delphi-Quellcode:
  caption:= INTTOSTR(ROUND(Screen.PixelsPerInch*100/96))+' %';
Zeigt bei WIN8.1 richtig an: 100% bzw. 125%

jaenicke 7. Mär 2017 14:23

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Aber Vorsicht, die von t.roller genannte Funktion gibt es nicht ohne Grund. Ab Windows 8 kann jeder Monitor auch eine eigene Skalierung haben.
Die beiden Full HD 24" Monitore links und rechts haben bei mir z.B. 100%, der 27" QHD Monitor in der Mitte aber 125%.

Uwe Raabe 7. Mär 2017 14:40

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von jaenicke (Beitrag 1363434)
Aber Vorsicht, die von t.roller genannte Funktion gibt es nicht ohne Grund. Ab Windows 8 kann jeder Monitor auch eine eigene Skalierung haben.
Die beiden Full HD 24" Monitore links und rechts haben bei mir z.B. 100%, der 27" QHD Monitor in der Mitte aber 125%.

Deswegen kann man das ja auch über
Delphi-Quellcode:
Screen.Monitor[I]
für jeden einzelnen Monitor abfragen.

uligerhardt 9. Mai 2017 07:57

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Hallo!

Ich kämpfe auch gerade mit dem Thema. Da ich auf D2007 festgenagelt bin, kann ich die neuen, monitorspezifischen APIs nicht (ohne Weiteres) nehmen. Aber wenn ich meine beiden Monitore (Laptop und extern) auf 125% gestellt habe, sollten Screen.PixelsPerInch und GetDeviceCaps(DC, LOGPIXELSX) doch 120 ergeben? Ich kriege aber bei beiden 96. Ich habe in Windows 10 die Einstellung "Größe von Text, Apps und anderen Elementen ändern" genommen - das ist die Variante, die sofort, ohne Neuanmeldung, wirkt.

SProske 9. Mai 2017 08:01

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von uligerhardt (Beitrag 1370680)
Ich habe in Windows 10 die Einstellung "Größe von Text, Apps und anderen Elementen ändern" genommen - das ist die Variante, die sofort, ohne Neuanmeldung, wirkt.

Ich hatte damit auch mal zu kämpfen und glaube mich zu erinnern, dass man - egal wie eingestellt - immer erst den Rechner neu starten musste, bevor das auch das Delphi-Programm mitbekam.

Frickler 9. Mai 2017 08:15

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von uligerhardt (Beitrag 1370680)
Hallo!

Ich kämpfe auch gerade mit dem Thema. Da ich auf D2007 festgenagelt bin, kann ich die neuen, monitorspezifischen APIs nicht (ohne Weiteres) nehmen. Aber wenn ich meine beiden Monitore (Laptop und extern) auf 125% gestellt habe, sollten Screen.PixelsPerInch und GetDeviceCaps(DC, LOGPIXELSX) doch 120 ergeben? Ich kriege aber bei beiden 96. Ich habe in Windows 10 die Einstellung "Größe von Text, Apps und anderen Elementen ändern" genommen - das ist die Variante, die sofort, ohne Neuanmeldung, wirkt.

Ist es nicht so, dass bei Windows 10 Programmen, die nicht per Manifest kundtun, pro Monitor skalieren zu können, einfach 96 dpi vorgegaukelt werden? Und Windows skaliert dann selbst.... gibt diesen "fusseligen" Look.

Bernhard Geyer 9. Mai 2017 08:25

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Hast du den Manifest erweitert das auch für Windows 10 dein Anwendung nicht "als zu dumm zum eigenen Scallieren" betrachtet wird?

uligerhardt 9. Mai 2017 08:26

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von Frickler (Beitrag 1370686)
Zitat:

Zitat von uligerhardt (Beitrag 1370680)
Hallo!

Ich kämpfe auch gerade mit dem Thema. Da ich auf D2007 festgenagelt bin, kann ich die neuen, monitorspezifischen APIs nicht (ohne Weiteres) nehmen. Aber wenn ich meine beiden Monitore (Laptop und extern) auf 125% gestellt habe, sollten Screen.PixelsPerInch und GetDeviceCaps(DC, LOGPIXELSX) doch 120 ergeben? Ich kriege aber bei beiden 96. Ich habe in Windows 10 die Einstellung "Größe von Text, Apps und anderen Elementen ändern" genommen - das ist die Variante, die sofort, ohne Neuanmeldung, wirkt.

Ist es nicht so, dass bei Windows 10 Programmen, die nicht per Manifest kundtun, pro Monitor skalieren zu können, einfach 96 dpi vorgegaukelt werden? Und Windows skaliert dann selbst.... gibt diesen "fusseligen" Look.

Upps. Nö. Das wird's dann wohl sein. :oops:

Update: Ich hab mal testhalber schnell SetProcessDPIAware aufgerufen und schon klappt's.
Update 2: ...aber nur nach einem Neustart.

uligerhardt 15. Sep 2017 10:38

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Hallo zusammen!

Ich krieg langsam die Krise! Jetzt klappt's (anscheinend :mrgreen:) unter W10.
Dafür hab ich (seit kurzem?) unter W7 ein neues Problem. Dort kriege ich scheinbar nur bis 125% korrekte Werte für LOGPIXELSX/Y geliefert.
Mal als Tabelle:
Code:
    | 100%  125%    150%
----+-------------------------------------------------------------------------
W7  | 96x96 120x120 96x96
W10 | 96x96 120x120 144x144
Der Wert für 150% unter W7 sollte mMn auch 144x144 sein, ist er aber nicht. Laut unserer Tester ist es auch mit 133% falsch. :wall:
Hat jemand ne Idee, was ich jetzt wieder falsch gemacht habe?

Edit: Scheint das zu sein: https://stackoverflow.com/questions/...l-shows-96-dpi

Sherlock 15. Sep 2017 10:47

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Mir gehts genauso...nur mit Windows-macOS-iOS. Ich überlege langsam fixe Werte anzunehmen...

Sherlock

uligerhardt 15. Sep 2017 10:59

AW: Mit Delphi den Skalierungsfaktor herausfinden
 
Zitat:

Zitat von Sherlock (Beitrag 1381276)
Mir gehts genauso...nur mit Windows-macOS-iOS. Ich überlege langsam fixe Werte anzunehmen...

Sherlock

Beruhigend, dass ich nicht als einziger leide. :mrgreen::thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 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