Zeilenanfang in Controls



  • Hallo zusammen,

    ich erkläre erstmal was ich bereits habe:

    ich versuche gerade einzelne Fenster (Controls: Checkboxes, Radiobutton, Edit Controls und Static Text) an die Länge des enthaltenen Textes anzupassen, d.h. die Fentergröße genau so einzustellen dass der Text gerade noch sichtbar und vollständig reinpasst (Höhe und Breite). Ich hab mir hierfür ein kleines Testprogramm geschrieben. Zur besseren Übersicht habe ich die Controls bunt eingefärbt, damit sie sich gegenüber dem Hauptfenster abheben und man das angepasste Mess-/Einstellergebniss besser sieht. Generell habe ich die Controls mit und ohne Rahmen erstellt, die notwendige Größenanpassung habe ich dann über GetSystemMetrics(...) abgefragt und die jeweilige Rahmenstärke aufaddiert. Für Static Text funktioniert das wunderbar.

    was mir fehlt:

    in der Editcontrol beginnt das erste Zeichen nicht direkt am Fensteranfang. Je größer die eingestellte Schriftgröße ist, je mehr Pixel sind vor dem ersten Zeichen in der Editcontrol frei, wie kann ich den Zeichenbereich des Textes der Editcontrol ermitteln.
    Gleiches gilt für die Radio- und die Checkbox, zuerst kommt das Icon dann eine Lücke von ein paar Pixel (Schriftart abhängig) , dann das erste Zeichen. Auch hier wieder: wie kann ich den Zeichenbereich des Textes der Editcontrol ermitteln.

    Weiterhin ist mir aufgefallen, wenn ich bei Dialogen eine kursive Schriftart einstelle und Checkboxen und Radiobuttons im Resourcen Editor hinzufüge, daß bereits dort der letzte Buchstabe des Controls ein wenig beschnitten wird, obwohl nach links genügend Platz ist. Das scheint mir wohl irgendein Bug zu sein oder?

    Ich benutze VS2005 Prof. und alle meine Proggies haben ein Manifest für Common Controls 6 + dpiAware



  • Gibt es eine Möglichkeit das gestrichelte Rechteck auszumessen, das erscheint wenn man das Control mit der ALT-Taste aktiviert? Wenn ja, wie geht das?


  • Mod

    Was meinst Du für ein Rechteck bei Drücken der Alt-Taste?

    Zum Edit Control: EM_GETRECT liefert das innere Rectangle.
    Der äußere Rahmen ist immer um 4DLUs links und rechts breiter und exakt um 4DLUs höher.

    Entsprechend für Buttons: BCM_GETTEXTMARGIN



  • Super, danke, das werde ich mal testen. Das mit den DLUs muss ich erst noch mal recherchieren was das damit genau auf sich hat.

    Beim Rechteck habe ich mich nicht genau genug ausgedrückt. Das erscheint nur beim Radiobutton und bei der Checkbox, wenn das Control aktiviert wird.


  • Mod

    Meinst Du das Focus Rectangle?



  • Moin,

    ja ich denke den meine ich. Den sieht man wenn man die Checkbox oder den Radiobutton aktiviert und die ALT-Taste drückt.

    Ich habe nun festgestell, dass wenn das Controll den Style "BS_MULTILINE" enthält, werden sowohl einzeilige als auch mehrzeilige Texte, die auch TABs enthalten können korrekt ausgemessen und beim resizen passt die Schrift perfekt in die neue Fenstergröße des Control.

    Fehlt dem Control nun der Syle "BS_MULTILINE" ermittele ich mit meinem Messverfahren immer noch die wirkliche Größe des Textes. Beim anpassen der Fenstergröße ist es jedoch so, das der Text nicht ins Fenter passt, obwohl es die notwendige Größe besitzt.

    Ich hab da mal einen Screenshot hochgeladen, die oberen 3 RadioButtons sind mit "BS_MULTILINE", die beiden unteren ohne "BS_MULTILINE". Man kann erkennen das der Focus Rectangle viel kleiner ist als die Fenstergröße des Controls. Warum hat der sich beim resizen nicht mitangepasst?

    http://img5.fotos-hochladen.net/uploads/image33bea5pcsqk.png

    Ein weitere Screenshot, wenn die Controls als Static-Text erstellt wurden:

    http://img5.fotos-hochladen.net/uploads/image1njcr3beyt7.png

    Hier klappt alles einwandfrei, TABs, Zeilenumbruch und &-Prefix werden genauso berechnet, wie Windows das Control dann auch zeichnet.

    Beim Radiobutton/Checkbox scheint meine Messmethode korrekte Ergebnisse zu liefern, aber das Controll schein nicht korrekt gezeichnet zu werden. Mach ich da irgendetwas falsch?


Anmelden zum Antworten