Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bildschirm Auflösung (https://www.delphipraxis.net/202405-bildschirm-aufloesung.html)

Zodi 30. Okt 2019 19:56

Bildschirm Auflösung
 
Hi Delphianer

Ich versuche gerade die aktuelle Auflösung an meinem Monitor anzuzeigen.
Momentan ist die auf 3840x2160 ist ein 4K Monitor.

Wenn ich mit meiner Funktion diese versuche anzuzeigen bekomme ich 3072x1728

Delphi-Quellcode:
function ScreenRes: string;
begin
  Result := String(inttostr(GetSystemMetrics(SM_CXSCREEN))) + 'x' + String(inttostr(GetSystemMetrics(SM_CYSCREEN)));
end;
hat wer ne Ahnung worann das liegen kann.

Grüsse Zodi

Zodi 30. Okt 2019 20:33

AW: Bildschirm Auflösung
 
Also mit screen.widht und screen.height bekomme ich die gleichen Werte.

ich habe nur einen Monitor angeschlossen

TurboMagic 30. Okt 2019 20:34

AW: Bildschirm Auflösung
 
Schaut euch mal TScreen genauer an. Soweit ich im Kopf habe, kann man darüber
die Auflösung aller Bildschirme abfragen.

Stichwort: Array! ;-)
Screen[0].Width, Screen[1].Width und vermutlich Screen.Count oder .MonitorCount...

Grüße
TurboMagic

Zodi 30. Okt 2019 20:50

AW: Bildschirm Auflösung
 
scheint auch mit Tscreen nicht zu funktionieren. :(

TurboMagic 30. Okt 2019 21:03

AW: Bildschirm Auflösung
 
Ist vielleicht eine Bildschirmskalierung eingestellt und die wird da evtl. berücksichtigt?
Mal in den Bildschirmeinstellungen von Windows nachschauen und umrechnen, ob ein dort
eingestellter Skalierungsfaktor rechnerisch diese Differenz erklärt?

mkinzler 31. Okt 2019 05:08

AW: Bildschirm Auflösung
 
3072 * 1,25 = 3840.
1728 * 1,25 = 2160.

-> Skalierung von 125% ist eingestellt.

Michael II 31. Okt 2019 06:36

AW: Bildschirm Auflösung
 
Hallo Zodi

ich weiss nicht, mit welcher Delphi Version du arbeitest.

In den neueren kannst du unter Projekt > Optionen > Manifest > DPI Unterstützung einstellen, wie sich dein Programm und Windows punkto der unter Windows eingestellten Skalierung verhalten sollen.

(In älteren Delphi Versionen musst du die Manifest Datei anpassen.)

Ein Beispiel. Dein Programmfenster habe eine Grösse von 600x400.
Wenn du "Keine" DPI Unterstützung auswählst und du unter Windows eine Skalierung von 125% eingestellt hast, dann wird Windows dein Fenster um diesen Faktor vergrössert (und dadurch etwas unscharf) darstellen. Auf dem Bildschirm wird dein Fenster also 600x1.25=750 breit und 400x1.25=500 Monitorpixel hoch angezeigt. Wenn du aber in deinem Programm Breite und Höhe abfragst, werden immer noch 600 bzw. 400 zurückgegeben. Hätte eines deiner Fenster eine Grösse von 3072x1728, dann würde es auf dem Monitor 3072x1.25 breit und 1728x1.25 hoch dargestellt (3840x2160); wenn du Breite und Höhe in deinem Programm abfragst, dann werden 3072 bzw. 1728 zurück gegeben. Genau gleich verhält es sich mit den Screen Werten.

Wenn du unter DPI Unterstützung hingegen zum Beispiel "über Monitor v2" wählst, dann bist du verantwortlich fürs Skalieren des Fensters. Windows wird dein Fenster nicht skalieren. Dein 600x400 Fenster wird 600x400 Monitorpixel gross dargestellt, wenn du keine Korrektur vornimmst. Wenn du jetzt die Screen Werte abfragst, wirst du 3840x2160 zurück erhalten.

KodeZwerg 31. Okt 2019 07:31

AW: Bildschirm Auflösung
 
Guten Tag, auf stackoverflow.com habe ich diese Methodik dafür entdeckt:
Delphi-Quellcode:
var
  MonInfo: TMonitorInfo;
begin
  MonInfo.cbSize := SizeOf(MonInfo);
  GetMonitorInfo(MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST), @MonInfo);
  ShowMessage(Format('Current resolution: %dx%d',
              [MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left,
               MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top]));
Damit noch eine möglich aufgezeigt wird :)

Ps: Dies sollte nur den Hauptmonitor betreffen, ist aber anpassbar.


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