Einzelnen Beitrag anzeigen

Alfonso

Registriert seit: 10. Jan 2006
250 Beiträge
 
Delphi 11 Alexandria
 
#1

... und wieder mal High-DPI Dual-Monitor - TStringgrid

  Alt 30. Jun 2020, 20:28
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
30-06-_2020_19-34-05.png

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.
Klicke auf die Grafik für eine größere Ansicht

Name:	30-06-_2020_19-34-05.png
Hits:	38
Größe:	26,3 KB
ID:	52766

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.
30-06-_2020_20-02-36.png 30-06-_2020_20-03-55.png

4)Monitor 1 Full HD 100% Default, Monitor 2 Full HD 150%
Sieht ok aus auf beiden Monitoren mit angepasster DPI
30-06-_2020_20-06-36.png

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.
30-06-_2020_20-09-50.png 30-06-_2020_20-10-49.png

------
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;
Miniaturansicht angehängter Grafiken
30-06-_2020_19-38-09.png  
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat