Rubrik: Grafik und Font · Font & Text | VB-Versionen: VB2008, VB2010, VB2012 | 23.03.14 |
Erstzeileneinzüge bei Ausgabe langer Strings Es werden 3 Tipps gezeigt, wie positiver oder negativer Erstzeileneinzug bei der Ausgabe langer Strings mittels DrawString-Methode realisiert werden kann. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 6.758 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wenn man lange Strings/Texte mit meinen Methoden, die im Tipp Umbrechen langer Strings mittels Measurement-Methode und speziellen Funktionen vorgestellt werden, am Anfang der Ausgabe mit positivem oder negativem Erstzeileneinzug versehen möchte, kann man das mit den im Folgenden beschriebenen Vorgehensweisen realisieren.
Voraussetzung für alle Ausgaben ist, dass bei Aufruf von e.Graphics.Drawstring der Paramater StringFormat verwendet wird.
e.Graphics.DrawString(myText, myFont, myBrush, myRect, myStringFormat)
So muss man das Stringformat möglichst in folgender Weise definieren:
Dim myStringFormat As StringFormat, myTabstopp As Single With myStringFormat .LineAlignment = StringAlignment.Near .Alignment = StringAlignment.Near .SetTabStops(0, myTabstopp) End With
D.h., mit SetTabStops wird ein Tabstopp für die Ausgabe an gewünschter Stelle definiert. Wie/wo setzt man aber diese Stelle optimal, das zeigen die folgenden Tipps.
1. Positiver Erstzeileneinzug
Das ist der einfachste Fall. Man setzt den Wert von myTabstopp auf den gewünschten Wert, bspw. myTabstopp = 30. Dann muss man nur vor den auszugebenden String/Text das Zeichen vbTab setzen. Wendet man die Umbruchmethoden aus
meinem oben genannten Tipp an, setzt man das vbTab vor den ersten Teilstring. Dann gibt man String/Text mittels Drawstring-Methode (mit myStringFormat!) aus.
2. Negativer Erstzeileneinzug
Auch hier setzt man myTabstopp auf den gewünschten Wert. Hier sollte man allerdings ausschließlich mit meinen Umbruchmethoden arbeiten. Denn dabei kann man als "Einfügestring" für den Umbruch mit vbCrLf & vbTab arbeiten und
diese Zeichenkombination wird hinter jedem Teilstring eingefügt, sodass alle Zeilen außer der ersten mit Einzug ausgegeben werden.
Bsp.:
myText = wrapStringSpecChar(myText, the_font, layout_rect.Width, _ e.Graphics, vbCrLf & vbTab)
3. Vorgehen bei negativem Erstzeileneinzug und Zeilennummerierung
Es geht in erster Linie darum, die optimale Position des ersten Tabstopps zu bestimmen, damit alle Zeilen ab der zweiten Zeile den gleichen Einzug haben.
Zwei Möglichkeiten: entweder man kennt die maximale Anzahl der zu erwartenden Zeilen oder nicht. Und ich gehe davon aus, dass der anzuwendende Font nicht proportional ist.
Im ersten Fall kann man die Position folgendermaßen bestimmen:
Zunächst
Dim maxAnz As Short, myTabstopp As Single myTabstopp = Format(maxAnz, "#").Length
dann
With myStringFormat .LineAlignment = StringAlignment.Near .Alignment = StringAlignment.Near .SetTabStops(0, myTabstopp) End With
und wie unter 2. beschrieben weiterarbeiten.
Im anderen Fall kann man nur schätzen oder experimentieren... oder aber:
- im StringFormat mehrere TabStopps im gleichen Abstand definieren (bspw. .SetTabStops(0, 30, 60, 90)
- bei jeder Zeilennummerausgabe erst die Länge des Nummernstrings mittels Measurement-Methode ermitteln
- prüfen, ob diese Länge größer als die erste, zweite usw. Tabstopp-Position ist
- dementsprechend eine Anzahl von vbTab-Zeichen einfügen.