Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Sa 04.04.09 21:57
Hallo,
ich habe von einem Bekannten gehört, dass es viele User gibt, die Ihren Rechner in 120 DPI darstellen lassen, sprich größerer Schrift. Teile meiner Anwendung sahen in dieser Darstellung richtig schlimm aus, weil ich mich nie drum gekümmert habe.
Nun frage ich mich: Was muss man da beachten ? Muss man die ganze GUI für 120 DPI nochmal machen ?
Und dann ist noch etwas komisch: Meine Hauptform wird auch beim Umstellen auf 120 DPI nicht anders. Das Optionsfenster aber schon. Und im Optionsfenster aber auch nur gewisse Teile. Ein Speedbutton zB. bleibt im Schriftgrad genauso klein wie in 96 DPI.
Woran liegt das ? Gibts eventuell ein Tutorial ?
Ciao LHUser
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 05.04.09 15:02
Ich habe in der Zwischenzeit rausgefunden, dass man die Methode ScaleBy für sowas nutzen kann.
Ich habe folgendes gefunden:
Delphi-Quelltext 1: 2:
| if Screen.PixelsPerInch <> PixelsPerInch then ScaleBy(Screen.PixelsPerInch, PixelsPerInch); |
Das dumme ist nur, mein Programm erkennt bei Screen.PixelsPerInch und auch bei PixelsPerInch 120 DPI bzw. 96 DPI. Damit passiert sowohl bei der If-Abfrage als auch by ScaleBy nichts (Streckung um den Faktor 1...).
Ich habe irgendwie den falschen Ansatzpunkt. Habt ihr ne Idee ?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 05.04.09 15:09
Warum benutzt du für den zweiten Wert nicht eben 96DPI? Das ist schließlich dein Ausgangswert.
_________________ >λ=
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 05.04.09 15:19
Ja, das habe ich in der Zwischenzeit schon probiert
Nur muss ich nochmal nachfragen, ob ich das richtig verstanden habe. Es wird doch nur *skaliert*. An den Werten für Width und Height ändert sich nichts ? Weil dann müsste man sämtliche Größenänderungen im Programm zur Laufzeit dynamisch anpassen lassen und das würde Rundungsfehler en masse mit sich bringen, wenn jemand etwas anderes als 96 oder 120DPI nimmt.
Ich habe nämlich den Verdacht, dass sich dadurch auch Height und Width meiner Form ändern (obwohl ja eigentlich nur die Pixel gestreckt werden sollten).
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 05.04.09 15:28
LonghornUser hat folgendes geschrieben : | Ich habe nämlich den Verdacht, dass sich dadurch auch Height und Width meiner Form ändern (obwohl ja eigentlich nur die Pixel gestreckt werden sollten). |
Ich würde behaupten das ist völlig logisch, dass sich width und height ändern  Ich meine, die Form wird ja Größer. Pixel werden keine gestreckt, das würde dem Bildschirm nicht gut tun  Es wird nur berechnet, welche Größe die Elemente die auf der Form liegen nach der Skalierung haben müssen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 05.04.09 15:35
Das heißt also, ich müsste permanent alle Width's und Height's mit AktuelleDPI div 96 multiplizieren. Geht das nicht irgendwie eleganter ? Ich kann irgendwie nicht glauben, dass das mit Delphi nicht besser geht (zumal es die DPI-Einstellung ja schon ewig gibt und auch von einem bestimmten Benutzerkreis stark gebraucht wird) ?? [Edit: Sowas müsste Delphi doch intern machen -> beim Eintragen der Width/Height-Attribute?]
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 05.04.09 15:44
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 05.04.09 15:52
Ich poste am besten mal den Inhalt meines OnResize-Events:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| if ((Form1.ClientWidth > 948) and (MutexA <> 0)) or (MutexC <> 0) then begin MutexA := 0; MutexB := 1; MuteXC := 0; Label1.Left := 786; Label1.Top := 91; Image4.Left := 758; Image4.Top := 88; ButtonUp.Top := 137; ListView1.Top := 128; ListView1.Height := Form1.ClientHeight-211; end; if ((Form1.ClientWidth <= 948) and (MutexB <> 0)) or (MutexC <> 0) then begin MutexA := 1; MutexB := 0; MuteXC := 0; if AppLang = 'English' then begin Label1.Left := 653; Image4.Left := 624; end else begin Label1.Left := 614; Image4.Left := 585; end; Label1.Top := 125; Image4.Top := 122; ButtonUp.Top := 168; ListView1.Top := 156; ListView1.Height := Form1.ClientHeight-235; end;
Shape2.Top := Form1.ClientHeight-24; Image1.Left := Form1.ClientWidth-22; Image5.Left := Form1.ClientWidth-96; Image5.Top := Form1.ClientHeight-20; Image6.Left := Form1.ClientWidth-96; Image6.Top := Form1.ClientHeight-20; Shape6.Left := Form1.ClientWidth-102; Shape6.Top := Form1.ClientHeight-24; ButtonUp.Left := Form1.ClientWidth-54; ButtonDown.Top := Form1.ClientHeight-103; ButtonDown.Left := Form1.ClientWidth-54; LabelA.Top := Form1.ClientHeight-68; Image8.Top := Form1.ClientHeight-73; Image3.Left := Form1.ClientWidth-326; Image3.Top := Form1.ClientHeight-73; Label2.Left := Form1.ClientWidth-300; Label2.Top := Form1.ClientHeight-68;
StatusbarLabel1.Left := Form1.ClientWidth-180; StatusbarLabel1.Top := Form1.ClientHeight-20; LabelDeactivated.Left := Form1.ClientWidth-75; LabelDeactivated.Top := Form1.ClientHeight-20; if AppLang = 'English' then Label7.Left := Form1.ClientWidth-262 else L7.Left := Form1.ClientWidth-454; Label7.Top := Form1.ClientHeight-144; Label8.Top := Form1.ClientHeight-141; Checkbox1.Top := Form1.ClientHeight-141; |
Diese Änderungen macht ScaleBy leider nicht. Ich müsste, wie ich es verstanden habe, wohl so vorgehen, dass ich die ganzen absoluten Werte mit AktuelleDPI/96 multipliziere. Dann sollte es stimmen, aber das kann kein sauberer Weg sein, oder doch ?
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 05.04.09 15:54
Wofür brauchst du so ein Resize Event ??
Du kennst aber schon die Anchors-Property, oder?
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: So 05.04.09 16:23
Hast du schon mal Anchors verwendet um den Abstand (wohlgemerkt der Abstand der *Schrift*, nicht der Abstand des Controls zum Rand) eines Labels zum rechten Rand konstant zu halten  ?
Edit: Argh, ich habs auch gerade gesehen, dass man ja die ersten beiden Anchors auf True und die anderen auf False stellen muss.
Dann sollte das Problem erledigt sein.
Ich mache mal weiter 
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mo 06.04.09 01:01
OK, habs nun doch alles hinbekommen. Die meisten Resizings konnte ich mit den Anchors entfernen, aber nicht alle, da ich 2 verschiedene Anordnungen der Komponenten habe (je nach Form1.Width-Wert). Das musste man dann doch "von Hand" machen.
|
|