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/)
-   -   FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde (https://www.delphipraxis.net/200364-formbeforemonitordpichanged-kommt-nachdem-dpi-veraendert-wurde.html)

Bünni 13. Apr 2019 18:42

FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Bei einem aktuellen Problem versuche ich auf DPI-Veränderungen zu reagieren.

Mit
Delphi-Quellcode:
procedure WMDPIChanged(var msg: TMessage); message WM_DPICHANGED;
funktioniert das. Aber ich da kann ich beim Monitorwechsel immer nur die neue DPI abfragen und nicht die vorherige.

Deswegen habe ich mir als Test in das FormBeforeMonitorDpiChanged Event eine showmessage geschrieben
Delphi-Quellcode:
ShowMessage(Form1.Monitor.PixelsPerInch.ToString);
um damit die DPI anzeigen zu lassen, bevor sie verändert wird. Aber die showmessage wird erst angezeigt, wenn die DPI schon verändert wurde.

Ist das ein Fehler? Das Event heißt schließlich FormBeforeMonitorDpiChanged.

Gibt es eine andere Möglichkeit mittels WMDPIChanged die alte DPI auszulesen? In
Delphi-Quellcode:
msg.WParam
steht leider nur die neue.

EWeiss 13. Apr 2019 18:53

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Was spricht gegen ein Property dem du die DPI übergibst wenn du sie geändert hast und zurück liest wenn sie abermals geändert wurde.
Was anderes fällt mir auch nicht ein.

gruss

Uwe Raabe 13. Apr 2019 18:55

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Na ja, das Form kann ja die DPI-Änderung nicht vorausahnen und reagiert auch nur auf eine entsprechende Windows-Message. Der Event bringt dir aber sowohl den alten als auch den neuen Wert als Parameter mit. Das Before und das After bei dem Partner-Event steht für die DPI-Änderung innerhalb des Forms. Before kommt halt bevor alle Controls auf die DPI-Änderung reagieren und After eben danach.

Gibt es einen bestimmten Grund, warum du direkt auf die Windows-Message reagierst und nicht die dafür vorgesehenen virtuellen Methoden nutzt?

Bünni 13. Apr 2019 19:00

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Ich versuche das zu erklären.
VirtualStringTree hat eine DefaultNodeHeight Property die von sich aus schon auf DPI-Veränderungen reagiert.

Einige meiner Nodes haben aber eine Höhe die etwa doppelt so hoch ist wie DefaultNodeHeight.
Damit das bei allen DPI's gut aussieht möchte ich auf DPI-Veränderungen reagieren und diese Variable, die die Höhe für größere Nodes enthält, entsprechend anpassen

Delphi-Quellcode:
procedure TForm1.WMDPIChanged(var msg: TMessage);
var
 LOldDPI, LNewDPI: Integer;
begin
 LOldDPI := Form1.Monitor.PixelsPerInch;
 LNewDPI := LOWORD(msg.WParam);

 VSTNodeHeightBig := MulDiv(VSTNodeHeightBig, LNewDPI, LOldDPI);

 inherited;
end;
LNewDPI ist kein Problem. LOldDPI ist aber nie das was es sein soll. Die DPI wurde schon geändert, also kann LOldDPI nicht den alten Wert enthalten. Aber genau den brauche ich für MulDiv leider.
Wenn das besser geht, teilt es mir mit. Ich scheitere leider daran, bei einem DPI-Wechsel an die entsprechenden DPI-Werte zu kommen.

Meine aktuelle, wirklich sehr schmutzige Lösung sieht so aus
- aktuelle DPI des Formulars im OnShow Event in eine Variable schreiben

- im WMDPIChanged dann folgendermaßen agieren
Delphi-Quellcode:
 LOldDPI := OldDPI; // alte DPI, die beim Programmstart / OnShow des Hauptformulars gesetzt wurde
 LNewDPI := LOWORD(msg.WParam);

 Caption := LOldDPI.ToString + ' - ' + LNewDPI.ToString;

 VSTNodeHeightBig := MulDiv(VSTNodeHeightBig, LNewDPI, OldDPI);
 OldDPI := LNewDPI;
Hat aber entsprechend Nachteile, wenn das Formular welches verschoben wird NICHT das Formular ist auf dem das VST liegt.

Uwe Raabe 13. Apr 2019 19:10

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Versuch das mal in OnAfterMonitorDPIChanged zu machen. Dort wird dir ja der alte und neue DPI-Wert übergeben. Eventuell musst du den TreeView aber nach der Änderung nochmal neu zeichnen, damit das wirksam wird.

EWeiss 13. Apr 2019 19:14

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Schau mal hier..

gruss

Bünni 13. Apr 2019 19:23

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
@EWeiss
das ist natürlich auch eine Idee. Aber um im VST Code rumzuwurschteln bin ich nicht gut genug :lol:
Die Verschiebung des Codes von WMDPIChanged in FormAfterMonitorDpiChanged scheint zu funktionieren.

Ich merke gerade erst, dass ich einigen anderen Code mittlerweile auch löschen kann.
In einer ListBoxen beispielsweise veränderte ich die Schriftgröße, wenn die DPI > 100% ist. Das musste ich mit alten Delphiversionen leider so machen.
Jetzt brauche ich das alles nicht mehr.

EWeiss 13. Apr 2019 19:24

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Ok ansonsten habe ich nur noch das gefunden..

Ist aber letztendlich das was Uwe schon sagte.

gruss

Bünni 13. Apr 2019 19:26

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
 
Zitat:

Zitat von EWeiss (Beitrag 1430253)

Eine Quelle die ich mir abspeichern werde. Auch wegen dem Manifest-Beispiel. Wie oft sucht man sich kaputt, um ein konformes Manifest zu finden.


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