vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik und Font · Font & Text   |   VB-Versionen: VB2008, VB2010, VB201223.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 HerrmannBewertung:  Views:  6.758 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein 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.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.