[Gelöst] DPI Skalierung zur Compilezeit feststellen?

Antworten
MmVisual
Beiträge: 1126
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

[Gelöst] DPI Skalierung zur Compilezeit feststellen?

Beitrag von MmVisual »

Hallo,

Wie kann ich zur Compilezeit die aktuelle DPI mit linken?

In meinem Quellcode gehe ich davon aus, dass zur Zeit der Übersetzung die Skalierung vom Windows 96 DPI ist. Wenn dann die EXE mit einem anderen Windows mit 200% Skalierung gestartet wird, dann sieht alles gut aus.
Jedoch wenn ich bei einem anderen Windows übersetze mit z.B. 200% Skalierung, und dann die EXE öffne, dann sind die Steuerelemente doppelt so groß.

Nun sollte ich während dem Übersetzen wissen mit welcher Skalierung das geschah, damit ich das zurückrechenen kann.

Gibt es so eine Compile-Variable?

Quellcode:

Code: Alles auswählen

// Das muss übersetzt werden, damit alles gut aussieht wenn Windows auf 100%/96 DPI eingestellt ist
Procedure TForm1.FormCreate(Sender: TObject);
Begin
  ScaleDPI(Self, 96);
end
 
// Das muss übersetzt werden, damit alles gut aussieht wenn Windows auf 200%/192 DPI eingestellt ist
Procedure TForm1.FormCreate(Sender: TObject);
Begin
  ScaleDPI(Self, 192);
end


Nun möchte ich gerne diese "96" bzw "192" automatisch beim Übersetzen richtig setzen, unabhängig wie gerade das Windows eingestellt ist.

Dankeschön, Grüße Markus.

Infos dazu hier "uscaledpi.pas":
https://wiki.freepascal.org/High_DPI/de
Zuletzt geändert von MmVisual am Fr 6. Mär 2020, 21:27, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4222
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von af0815 »

MmVisual hat geschrieben:Gibt es so eine Compile-Variable?

Notfalls eine selbst im Projektispektor definieren. Mir sind nur im Projektinpektor auf der ersten Seite des Dialogs die beiden Checkboxen zu DPI bekannt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 3304
Registriert: Fr 8. Apr 2011, 09:01

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von wp_xyz »

Normalerweise reicht es auf Anwendungsebene, das Häkchen vor "LCL-Skalierung verwenden" in den Projekt-Optionen zu setzen. Dann werden alle Dimensionen, über die man im Objektinspektor zugreifen kann (Width,Height, Constraints, BorderSpacing etc) automatisch umgerechnet. Zumindest für die LCL-eigenen Controls. Die Skalierungsfunktionen müssen nur aufgerufen werden, wenn Dimensionen zur Laufzeit gesetzt werden.

Auf Komponenten-Ebene muss man intern verwendete Dimensionen in der Routine DoAutoAdjustLayout anpassen.

https://wiki.lazarus.freepascal.org/Hig ... _and_above

Du verweist auf die Unit "uscaledpi" im High-DPI-Artikel. So eine Unit ist meiner Meinung nach nicht mehr erforderlich, der Artikel trägt erheblich zur Verwirrung bei.
Zuletzt geändert von wp_xyz am Fr 6. Mär 2020, 16:11, insgesamt 1-mal geändert.

kupferstecher
Beiträge: 273
Registriert: Do 17. Nov 2016, 11:52

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von kupferstecher »

Es gibt eine Einstellung unter
Werkzeuge -> Einstellungen -> Umgebung -> Formulareditor -> Force DPI scaling in design time

Schau mal, ob das gesetzt ist.
(Ist aber leider keine projektspezifische Einstellung.)

wp_xyz
Beiträge: 3304
Registriert: Fr 8. Apr 2011, 09:01

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von wp_xyz »

kupferstecher hat geschrieben:Es gibt eine Einstellung unter
Werkzeuge -> Einstellungen -> Umgebung -> Formulareditor -> Force DPI scaling in design time

Schau mal, ob das gesetzt ist.
(Ist aber leider keine projektspezifische Einstellung.)

Force DPI scaling in designtime sollte per default aktiv sein. Damit kann man ausschalten, dass der Formulardesigner vom Wechsel der Auflösung während der Entwicklungszeit die Dimensionen umrechnet. Das wird nur dann benötigt, wenn man die LCL-Skalierung nicht will und selbst skalieren will (viel Spaß bei so viel Masochismus).

MmVisual
Beiträge: 1126
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von MmVisual »

Wenn ich die "uscaledpi.pas" mit ScaleDPI() nicht benutze funktioniert es richtig. Also diese Unit ist wohl veraltet und Lazarus macht das ganze nun von Haus aus richtig, zumindest mit den eigenen Steuerelementen.

Die Raster-Gitter für der Einstellungen werden bei Änderung der DPI Einstellungen nicht mit "gezoomt":
Bild1.png


Dann muss ich bei 200% 6 Pixel einstellen damit es gleich wird.

sstvmaster
Beiträge: 345
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von sstvmaster »

Für Design Time im Objectinspector:

Code: Alles auswählen

ShowMessage('DesignTimePPI: ' + Self.DesignTimePPI.ToString + ' dpi.');

Für Run Time:

Code: Alles auswählen

ShowMessage('RunTimePPI: ' + Screen.PixelsPerInch.ToString + ' dpi.');
LG Maik

MmVisual
Beiträge: 1126
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DPI Skalierung zur Compilezeit feststellen?

Beitrag von MmVisual »

Genau das habe ich gesucht, vielen Dank!
Und es funktioniert auch noch :D

Die "uscaledpi.pas" wird benötigt um das Formular korrekt aus zu richten:

Code: Alles auswählen

  ScaleDPI(Self, Self.DesignTimePPI);
  ScaleImageList(imges, Self.DesignTimePPI)


Die TImageList "images" muss ebenfalls skaliert werden, damit die Icons alle schön aussehen. Dazu muss zusätzlich die Option TImageList.Scaled aktiviert werden. In meinem Programm sind alle Icons der Tasten in dieser TImageList.

Getestet mit Win10, Umschaltung der Skalierung 100% / 200%, übersetzen <> umschalten klappt nun. Auch bei Win10 200% übersetzen und Win7 100% wird die gleiche EXE korrekt gezeigt.

Viele Grüße Markus.

Antworten