|
Tak nakonec si odpovím sám a dám sem kousek kódu, který jsem si upravil pro své potřeby
Imports System.Drawing
Imports System.Text
Imports System.Collections.Specialized
Public Class PrintUtils
Public Enum align_text
left = 0
center
right
justify
End Enum
''' <summary>
''' Rozdělí řetězec na jednotlivé řádky tak, aby se svou délkou vešly do zadaného obdélníka
''' </summary>
''' <param name="text">Vstupní řetězec</param>
''' <param name="maxWidth">Šířka řádku, do kterého se má řetězec zalamovat</param>
''' <param name="g">Objekt typu Graphics, na němž se má řetězec vypsat</param>
''' <param name="font">Písmo, jímž bude řetězec vypsán</param>
''' <returns>Vrátí kolekci řetězců, která obsahuje jednotlivé řádky, které svou délkou odpovídají požadované šířce řádku</returns>
Public Shared Function WordWrapString(ByVal text As String, ByVal maxWidth As Integer, ByVal g As Graphics, ByVal font As Font) As StringCollection
' Vytvoření objektu typu StringCollection pro jednotlivé řádky
Dim wrappedText As New StringCollection()
' Objekt typu StringFormat pro zjištění šířky jednotlivých tokenů představujících slova
Dim stringFormat__1 As StringFormat = StringFormat.GenericTypographic
' Nastavení správného zahrnutí mezer do vypočítávané šířky textu
stringFormat__1.FormatFlags = StringFormatFlags.MeasureTrailingSpaces
If text IsNot Nothing AndAlso text.Length > 0 Then
' Odstranění případných konců řádků
text = text.Replace(Environment.NewLine, " ")
' rozdělit text podle mezer na jednotlivá slova a zpracovat na jednotlivé řádky
Dim words() As String = Split(text, " ")
Dim row As String = Nothing
Dim curW As Single
For Each word As String In words
If g.MeasureString(row & word, font, 0, stringFormat__1).Width <= maxWidth Then
row &= word & " "
Else
wrappedText.Add(Trim(row))
row = word & " "
curW = 0
End If
Next
If row IsNot Nothing Then wrappedText.Add(Trim(row))
End If
' Vrácení výsledku
Return wrappedText
End Function
''' <summary>
''' Tiskne text do zadaného obdélníka. Na základě parametru 'align' je tištěný text zarovnán k levému nebo pravému okraji, vycentrován nebo zarovnán do bloku.
''' </summary>
''' <param name="text">Text, který se bude tisknout</param>
''' <param name="rect">Obdélník, do kterého se bude tisknout</param>
''' <param name="g">Objekt typu Graphics, na němž se text vypíše</param>
''' <param name="font">Font, kterým bude tedxt vypsán</param>
''' <param name="align">Parametr o použitém zarovnání</param>
''' <remarks>Vrací souřadnice pravého horního rohu, na kterém byl ukončen tisk</remarks>
Public Shared Function PrintText(ByVal text As String, ByVal rect As RectangleF, ByVal g As Graphics, ByVal font As Font, ByVal align As align_text) As PointF
Dim s As SizeF
Dim p As New PointF(rect.X, rect.Y)
Dim stringFormat__1 As StringFormat = StringFormat.GenericTypographic
' Správné započítávání mezer při výpočtu šířky textu
stringFormat__1.FormatFlags = StringFormatFlags.MeasureTrailingSpaces
' Rozdělení textu na jednotlivé řádky
Dim sc As StringCollection = WordWrapString(text, rect.Width, g, font)
' Vytisknout text podle požadovaného zarovnání
Select Case align
Case align_text.left
stringFormat__1.Alignment = StringAlignment.Near
For Each row As String In sc
g.DrawString(text, font, Brushes.Black, rect, stringFormat__1)
Next
Case align_text.center
stringFormat__1.Alignment = StringAlignment.Center
For Each row As String In sc
g.DrawString(text, font, Brushes.Black, rect, stringFormat__1)
Next
Case align_text.right
stringFormat__1.Alignment = StringAlignment.Far
For Each row As String In sc
g.DrawString(text, font, Brushes.Black, rect, stringFormat__1)
Next
Case align_text.justify
' Základní zarovnání vlevo pro tisk krátkých řádků
stringFormat__1.Alignment = StringAlignment.Near
For Each row As String In sc
' Rozdělení řádku na jednotlivá slova
Dim sa() As String = row.Split(" ")
' Zjištění počtu mezer
Dim spc As Integer = sa.Count - 1
' Zjištění skutečné šířky textu v řádku
s = g.MeasureString(row, font, 0, stringFormat__1)
' Výpočet šířky mezery mezi jednotlivými slovy
Dim spw As Single = ((rect.Width - s.Width) / spc) + g.MeasureString(" ", font, 0, stringFormat__1).Width
' Pokud je šířka řádku větší než 80% požadované šířky, zarovnat do bloku
If s.Width > (rect.Width * 0.8) Then
For i As Integer = 0 To sa.Count - 1
' Vytiskne jedno slovo
g.DrawString(sa(i), font, Brushes.Black, p, stringFormat__1)
' Zjistí šířku vytisknutého slova
s = g.MeasureString(sa(i), font, p, stringFormat__1)
' Posune souřednice v ose X o šířku slova a šířku mezery
p.X += s.Width + spw
Next
' Nastaví osu X na začátek řádku
p.X = rect.X
' Nastaví osu Y o výšku řádku
p.Y += s.Height
Else
' Vytiskne celý řádek, protože jeho délka je menší než 80% požadované šířky
g.DrawString(row, font, Brushes.Black, p, stringFormat__1)
s = g.MeasureString(row, font, p, stringFormat__1)
p.X += s.Width
End If
Next
End Select
Return p
End Function
End Class
|