hi,
es scheint ein Missverständnis zu geben was DPI (Hardware) und DPIaware (Software) angeht
--- DPI Hardware
mein alter 19" Dell 4:3 Monitor hatte 1600 x 1200 und der 22" 16:9 Monitor 1920 x 1200
mein 2K (2560 x 1440) Monitor hat die selbe "Pixel-Dichte" aber ist 32"
auf allen 3 Monitoren ist "Solitär" ( XP Version ) gleich gross in mm und Pixel wobei immer 100% Skalierung läuft
ich hab dann noch ein 10" Table PC was Full-HD 1920 x 1050 macht aber da ist "Solitär" viel keiner.
Klar auf einem 10" ist die "Pixel-Dichte" = DPI (Hardware) viel grösser als bei 22"
--- Windows Skalierung
wenn man die Windows Skalierung nutzt wird alles grösser ... ausser was DPIaware ist wie "Solitär"
DPIaware bedeutet "nur" das genau 1 Pixel = 1 Pixel "native" ist
wenn man 2 Monitor nebeneinander hat mit verschiedener DPI/Skalierung und eine App zwischen beide liegt dann sieht man den Unterschied.
das passiert NICHT mit DPIaware und WENN der Monitor die selbe "Pixel-Dichte" = DPI (Hardware) hat
---
hier setzt nun der "interne" xBase Zoom Faktor an zusammen (!) mit DPIaware.
es spielt dann keine Rolle ob der User die Windows Skalierung aktiviert hat (DPIaware) sondern welche Grösse (Zoom) der User für die App gewählt hat.
---
ich gehe nun vom Font aus welchen der User wählen kann.
als "Referenz" dient nun ein langen String mit "WgÖ ..." möglichst breit,tief,hoch und GraQueryTextBox() für den X,Y Zoom Faktor
allgemein nutze ich den o:resize Callback Slot .. für JEDES Fenster
Code: Alles auswählen
DrawingArea:resize := {| aOldSize, aNewSize, oSelf | MyResize(aOldSize, aNewSize, oSelf) }
PROCEDURE MyResize(aOldSize, aNewSize, oSelf)
....
oSelf:lockUpdate( .T. )
aChild := oSelf:Childlist()
kMax := LEN( aChild )
FOR k := 1 TO kMax
aChild[k]:SetPos( {aLayOut[k][POSX]* SP_nXFaktor(),;
aLayOut[k][POSY]* SP_nYFaktor() })
aChild[k]:SetSize( {aLayOut[k][SIZEX]* SP_nXFaktor(),;
aLayOut[k][SIZEY]* SP_nYFaktor() })
aChild[k]:setFont(aLayOut[k][FONT])
IF LEN(aChild[k]:Childlist()) > 0
// evtl rekursive
ENDIF
NEXT
oSelf:lockUpdate( .F. )
...
RETURN
wie man sieht nutze ich ein Array mit den "Original" Daten nach dem o:Dialog:Create()
ähnlich wie beim Resize nutze ich o:Childlist() um die XbParts "einzusammeln"
"das" macht auch der LayoutManager() von Xbase++ ...
hier das Demo was wir von Till 2015 (?) bekommen haben