AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde
Thema durchsuchen
Ansicht
Themen-Optionen

FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

Ein Thema von Bünni · begonnen am 13. Apr 2019 · letzter Beitrag vom 13. Apr 2019
Antwort Antwort
Bünni

Registriert seit: 4. Mär 2019
67 Beiträge
 
#1

FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 19:42
Bei einem aktuellen Problem versuche ich auf DPI-Veränderungen zu reagieren.

Mit 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 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 msg.WParam steht leider nur die neue.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 19:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 19:55
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
67 Beiträge
 
#4

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:00
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.

Geändert von Bünni (13. Apr 2019 um 20:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#5

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:10
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:14
Schau mal hier..

gruss
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
67 Beiträge
 
#7

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:23
@EWeiss
das ist natürlich auch eine Idee. Aber um im VST Code rumzuwurschteln bin ich nicht gut genug
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:24
Ok ansonsten habe ich nur noch das gefunden..

Ist aber letztendlich das was Uwe schon sagte.

gruss
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
67 Beiträge
 
#9

AW: FormBeforeMonitorDpiChanged kommt nachdem DPI verändert wurde

  Alt 13. Apr 2019, 20:26
Eine Quelle die ich mir abspeichern werde. Auch wegen dem Manifest-Beispiel. Wie oft sucht man sich kaputt, um ein konformes Manifest zu finden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 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