![]() |
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
Hallo DieDolly von einer Länge 1050 auf 1575 sind's nicht 33,4% mehr sondern 50%. Genau so ist es bei den DPI Werten: Von 96 auf 144 sind's auch 50% mehr. Wenn du auf System 1 Auflösung DPI1 und auf System 2 DPI2 hast, und ein Formular auf System 1 l1 lang ist, dann hat es auf System 2 eine Länge von l2 := (DPI2/DPI1)*l1. In deinem Fall l2=144/96*1050=1.5*1050=1575. |
AW: Formulargröße auf HighDPI-Monitor speichern
Ich gebe mal ein kleines Beispiel wie ich das in meinem KVPlayer mache (c++) keine Ahnung ob du das dann so auf VCL umsetzen kannst.
Code:
CLIENT_WIDTH und CLIENT_HEIGHT ist die normale größe ohne DPI.
SetRect(&rc, 0, 0, dpi(CLIENT_WIDTH), dpi(CLIENT_HEIGHT));
AdjustWindowRectEx(&rc, dwStyle, FALSE, 0);
Code:
Ich rechne DPI hoch wie folgt.
#define CLIENT_WIDTH 960
#define CLIENT_HEIGHT 658
Code:
Du musst nun lediglich die DPI in umgekehrter Reihenfolge zurück rechnen das wars schon.
long dpi(IN long nPix) {
static float ratio; if (ratio == 0) { HDC hDC = GetDC(0); ratio = (GetDeviceCaps(hDC, LOGPIXELSX) / 96.0f); ReleaseDC(0, hDC); } return (long)(nPix * ratio); } Ich denke damit kommst du zurecht. gruss |
AW: Formulargröße auf HighDPI-Monitor speichern
Und wie rechne ich zurück (auf 96 DPI), dass ich so abspeichern kann, dass Windows nicht bei jedem Start neu hochskaliert? :(
Leider verstehe ich das da oben nicht. Was funktioniert ist, das Formular kurz vorher zurück auf 96 DPI zu skalieren ABER ob das schön ist ... ich bezweifle es
Delphi-Quellcode:
Das ergibt dann zwar 1057 Pixel statt 1050 aber damit kann man leben.
// Routine zum beenden und speichern des Programms ...
ZuSchließendeUndSpeicherndeForm.ScaleBy(96, Aktuelle DPI des Monitors auf dem das Form liegt); |
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
Code:
so wird die neue gesetzt das ins Gegenteil umlegen und fertig.
(GetDeviceCaps(hDC, LOGPIXELSX) / 96.0f);
Code:
nPix * Ratio
Code:
Oder?
nPix div Ratio
gruss |
AW: Formulargröße auf HighDPI-Monitor speichern
Leider kenne ich mich mit C++ kein bisschen aus. Deswegen sagen mir weder diese Funktionen was noch die Variablen.
|
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
Zitat:
Delphi-Quellcode:
<zu speichernder Wert> := MulDiv(<aktueller Wert>, 96, <aktuelle DPI>);
|
AW: Formulargröße auf HighDPI-Monitor speichern
Hallo Dolly, was an der Formel verstehst du nicht?
Nimm ein System 1 mit DPI1 und ein System 2 mit DPI2. Formularlänge auf System 1 sei l1 und auf System 2 l2. Wenn DPI1 und DPI2 bekannt sind und das Formular mit Länge l1 momentan auf System 1 liegt, dann gilt für die entsprechende Länge l2 auf System 2 (zum Beispiel die Breite oder die Höhe oder die Diagonale ;-)): l2 := DPI2/DPI1*l1 (1) und umgekehrt kannst du natürlich auch nach l1 auflösen: 11 := DPI1/DPI2*l2 (2) In deinem Fall: Dein Formular befindet sich auf System 2 mit DPI2=144 und hat eine Breite von w=1575. Nun willst du die Breite auf System 1 bestimmen. Es gilt Formel 2 von oben: Du berechnest l1 := 96/144*1575 = 1050 Das Formular hat also auf System 1 eine Breite von l1=1050. Was nebenbei und nicht ganz zufällig genau dem Wert entspricht, den du gemessen hast ;-). |
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
Delphi-Quellcode:
function dpi(nPix: Integer): Integer; (oder(LongInt ))
var ratio: Single; DC: HDC; begin if (ratio = 0) then begin DC := GetDC(0); ratio := (GetDeviceCaps(DC, LOGPIXELSX) / 96.0); ReleaseDC(0, hDC); end; result := nPix * ratio; end;
Delphi-Quellcode:
ratio: Single;
global definieren. Dafür brauche ich nicht mal ein Manifest.. muss halt nur drauf achten das ich jedes Control durch diese Funktion jage. Zitat:
GetDC(0) ist das DC des Desktop. Von der Auflösung des Desktop wird dann über GetDeviceCaps(GetDeviceCaps(DC, LOGPIXELSX)) die DPI zurückgegeben. Diese noch durch 96.0 teilen und fertig. gruss |
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
Ich hatte es so verstanden, daß es genau darum ging: Zitat:
|
AW: Formulargröße auf HighDPI-Monitor speichern
Zitat:
![]() Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 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 by Thomas Breitkreuz