![]() |
FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
Bei einem aktuellen Problem versuche ich auf DPI-Veränderungen zu reagieren.
Mit
Delphi-Quellcode:
funktioniert das. Aber ich da kann ich beim Monitorwechsel immer nur die neue DPI abfragen und nicht die vorherige.
procedure WMDPIChanged(var msg: TMessage); message WM_DPICHANGED;
Deswegen habe ich mir als Test in das FormBeforeMonitorDpiChanged Event eine showmessage geschrieben
Delphi-Quellcode:
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.
ShowMessage(Form1.Monitor.PixelsPerInch.ToString);
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:
steht leider nur die neue.
msg.WParam
|
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 |
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? |
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:
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.
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; 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:
Hat aber entsprechend Nachteile, wenn das Formular welches verschoben wird NICHT das Formular ist auf dem das VST liegt.
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; |
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.
|
AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
|
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. |
AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
|
AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz