Hi,
bin absolut ratlos und nach etlichen Stunden Arbeit gebe ich es auf, alleine eine Lösung zu suchen.
Verwende Delphi 10.4 und das Projekt hat High-DPI über Monitor V2 und Laufzeit Themes aktiviert.
Habe ein kleines Beispielprogramm beigelegt
(in der ersten Antwort, da ich max. 7 Anhänge hochladen kann).
Es geht darum, bei einem Stringgrid die richtige Fontgröße einzustellen.
Der Stringgrid passt sich nicht automatisch an High DPI an, so wie es aussieht. Ich möchte dass der Anwender sich die Fontgröße des Grids über eine Trackbar einstellt. Das Beispiel hat zwei grid. Bei dem rechtem Grid gebe ich die eingesellte Fontgröße direkt an das Grid weiter. Beim linken Grid errechne ich, abhängig von der DPI des Monitors, wo die Anwendung gerade läuft, eine neue Fontsize nach folgender Formel:
Code:
Function TForm8.AdaptToDPI(Value:Integer):Integer;
begin
Result:=Round(Value* (Monitor.PixelsPerInch / 96));
end;
Nun habe ich verschiedene Varianten probiert. Ein Bildschirm kann 4K und einer Full HD. Interessant und sehr verwunderlich ist, dass sich die Anzeige des Grids auf dem selben Monitor mit der exakt gleichen Konfiguration anders verhält, abhängig davon, welcher Monitor als Default-Monitor eingestellt ist. Allgemein kann man sagen: Es ist immer schlecht, wenn der Defaultmonitor die Höhere DPI hat.
Hier meine Beobachtungen
1) Beide Monitor Full HD 100% = 96 DPI
Alles OK
2) Monitor 1 4K 225% = 216 DPI. Monitor 2 Full HD 100% = 96 DPI. Monitor 2 Default
Sieht mit DPI Fontanpassung ok aus auf beiden Bildschirmen.
3) Gleiche Konfiguration wie 2), jedoch ist nun Monitor 1 Default:
Jetzt sieht die Anzeige
ohne DPI anpassung gut aus auf Monitor 1, mit Fontanpassung zu groß.
Schiebe ich es auf Monitor 2, sind beide Anzeigen überdimensioniert.
4)Monitor 1 Full HD 100% Default, Monitor 2 Full HD 150%
Sieht ok aus auf beiden Monitoren mit angepasster DPI
5) Gleiche Konfiguration wie 4), jedoch ist nun Monitor 2 Default:
Jetzt sieht die Anzeige auf Monitor 2
ohne DPI Anpassung gut aus, mit Fontanpassung zu groß.
Schiebe ich es auf Monitor 1, sind beide Anzeigen ok.
------
Im Übrigen, die Ergebniss von 3 und 5 sind genauso schlecht, wenn ich nur ein Monitor alleine mit High-DPI habe.
Mein Resumé: Keine Ahnung!
Probiert es bitte bei euch aus und gebt mir bitte Feedback!
Hier mein Code:
Code:
procedure TForm8.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer);
begin
lblDPI.Caption:='Monitor.PixelsPerInch: '+Monitor.PixelsPerInch.ToString;
TrackBarFontSizeTabChange(sender);
end;
procedure TForm8.FormCreate(Sender: TObject);
begin
for var Temp := 0 to 10 do
begin
LayoutBspGrid.Cells[0,Temp]:='Beispiel der Schriftgröße + Zeilenabstand in Tabellen';
StringGrid1.Cells[0,Temp]:='Beispiel der Schriftgröße + Zeilenabstand in Tabellen';
end;
TrackBarFontSizeTabChange(sender);
FormAfterMonitorDpiChanged(sender,0,0);
end;
Function TForm8.AdaptToDPI(Value:Integer):Integer;
begin
Result:=Round(Value* (Monitor.PixelsPerInch / 96));
end;
procedure TForm8.TrackBarFontSizeTabChange(Sender: TObject);
var FontsizeTbl,i:Integer;
begin
FontsizeTbl:=TrackBarFontSizeTab.Position;
StringGrid1.Font.Size:=FontsizeTbl;
LayoutBspGrid.Font.Size:= AdaptToDPI(TrackBarFontSizeTab.Position);
lblTrack.Caption:='TrackBar: '+TrackBarFontSizeTab.Position.ToString;
lblFont.Caption:='Font ohne DPI Anpassung: '+FontSizeTbl.ToString;
lblFontDPI.Caption:='Font mit DPI Anpassung: '+AdaptToDPI(FontSizeTbl).ToString;
Application.processMessages;
end;