15.4 Schriftdarstellung
Vor Windows 3.1 wurden hauptsächlich Bitmap-Schriften verwendet. Sie waren in einer festen Größe gespeichert und konnten nicht skaliert werden. Mit der Einführung von Windows 3.1 änderte sich das durch die Einführung skalierbarer TrueType-Schriften. Ende der 90er-Jahre wurde das OpenType-Schriftformat vorgestellt, das eine Kombination aus TrueType und dem in PostScript verwendeten Type-1 ist.
GDI+ unterstützt ausschließlich TrueType und OpenType. Sollten Sie im Konstruktor der Font-Klasse eine Schriftart angeben, die nicht diesen Formaten entspricht, wird automatisch die Standardschrift Microsoft Sans Serif verwendet.
15.4.1 Schriftart (Font und FontFamily)
Das Format einer Schrift wird durch mehrere Eigenschaften festgelegt: Schriftgröße und Schrifttyp sind am offensichtlichsten. Dazu gesellen sich weitere Darstellungseigenschaften wie fett, kursiv usw. Daher hat die Klasse Font, die eine Schriftart erzeugt, viele Konstruktoren. In der folgenden Syntax sind optionale Parameter kursiv gesetzt und Alternativen durch einen senkrechten Strich voneinander getrennt. Wenn der letzte Parameter die Einheit ist, kann der Stil auch als nichtletztes Argument entfallen.
Public Sub New(prototype As Font, newStyle As FontStyle) Public Sub New(family As FontFamily|String, emSize As Single, _ style As FontStyle, unit As GraphicsUnit, _ gdiCharSet As Byte, gdiVerticalFont As Boolean) |
Mit
Dim f As New Font("Arial", 12)
erzeugen Sie ein neues Font-Objekt, das als Schriftart »Arial« hat und eine Schriftgröße von 12 Punkten. Wenn Sie möchten, können Sie darüber hinaus auch sofort den Stil festlegen.
15.4.2 Schriftstil mit FontStyle
Der Schriftstil beschreibt, ob eine Schrift fett, kursiv, unterstrichen oder durchgestrichen dargestellt wird. Die Stile eines Font-Objekts sind schreibgeschützt. Daher müssen Sie ein neues Font-Objekt erzeugen, um einen anderen Stil zu bekommen. Geeignet ist dazu der Kopierkonstruktor, der die Referenz auf ein existierendes Font-Objekt erwartet sowie die Angabe des zu setzenden Stils, zum Beispiel:
Dim f As New Font(Me.Font, FontStyle.Bold)
Erlaubte Schriftstile sind in der Enumeration FontStyle aufgelistet (siehe Tabelle 15.4).
Konstante | Formatierung |
Bold |
Fett |
Italic |
Kursiv |
Regular |
Normal |
Strikeout |
Durchgestrichen |
Underline |
Unterstrichen |
Soll eine Schrift beispielsweise fett und kursiv sein, müssen die entsprechenden Konstanten mit dem bitweisen ODER-Operator verknüpft werden. Die folgende Anweisung erzeugt eine Schrift, die sowohl fett als auch kursiv dargestellt wird.
frm.Font = New Font(frm.Font, FontStyle.Bold Or FontStyle.Italic)
15.4.3 Ausgabe einer Zeichenfolge
Analog zu den Methoden zur grafischen Darstellung von Linien, Kurven und geometrischen Figuren hat die Klasse Graphics mit DrawString eine sechsfach überladene Methode, um eine Zeichenfolge grafisch auszugeben. In der folgenden Syntax sind optionale Teile kursiv gesetzt und Alternativen durch einen senkrechten Strich voneinander getrennt.
Public Sub DrawString(s As String, font As Font, brush As Brush _
, point As PointF | layoutRect As RectangleF | (x As Single,y As Single) _
, format As StringFormat) |
Die ersten drei Parameter sind erforderlich und in allen Methoden gleich: Es wird zuerst die zu zeichnende Zeichenfolge angegeben, anschließend die Schriftart und dann noch ein Objekt vom Typ Brush, um dem grafischen Layout einen großen Spielraum zu eröffnen. Der vierte Parameter spezifiziert die Position und kann ein Punkt, ein umschreibendes Rechteck oder ein Koordinatenpaar sein. Dem letzten Parameter vom Typ StringFormat widme ich mich in Abschnitt 15.4.5, »Textlayout mit StringFormat«.
Hinweis |
Die Struktur Point gibt die Punktkoordinaten als Integer an, PointF als Single. |
Im folgenden Beispiel wird mit der DrawString-Methode eine Zeichenfolge in die linke obere Ecke des zweiten Quadranten (oben links) des Clientbereichs der Form gezeichnet und noch einmal in die linke obere Ecke des vierten Quadranten (rechts unten). Die Aufteilung des Fensters in Quadranten verdeutlichen eine vertikale und eine horizontale Linie. Abbildung 15.8 zeigt das Aussehen der Form.
Abbildung 15.8 Texte
'...\GDI\Figuren\Texte.vb |
Public Class Texte Private Sub Texte_Paint(sender As Object, e As PaintEventArgs) _ Handles MyBase.Paint Dim str As String = "Hallo Welt" Dim ft As New Font("Arial", 20) Dim gr As Graphics = e.Graphics Dim w As Integer = ClientSize.Width, h As Integer = ClientSize.Height gr.DrawString(str, ft, Brushes.Black, 0, 0) gr.DrawLine(New Pen(Brushes.Blue), 0, h \ 2, w, h \ 2) gr.DrawLine(New Pen(Brushes.Blue), w \ 2, 0, w \ 2, h) gr.DrawString(str, ft, Brushes.Black, w / 2, h / 2) End Sub End Class
15.4.4 Abmessungen mit MeasureString
Die Festlegung des Startpunkts einer Zeichenfolge ist einfach. Die Abmessungen einer Zeichenfolge im Voraus zu wissen ist aber auch wichtig. Sie wollen beispielsweise die Zeichenfolge »Hallo Welt« mittig im Clientbereich einer grafikfähigen Komponente zeichnen lassen. Dazu müssen Sie wissen, wie viel Platz die Zeichenfolge sowohl horizontal als auch vertikal für sich beansprucht.
Hier hilft uns die Methode MeasureString der Klasse Graphics. Diese Methode ist wieder vielfach überladen, liefert aber in allen Fällen die Referenz auf ein SizeF-Objekt zurück. In der folgenden Syntax sind optionale Teile kursiv gesetzt. Bitte beachten Sie, dass ohne Übergabe eines StringFormat-Objekts die ermittelte Größe etwas zu groß ist, insbesondere wenn Unterschneidungen oder Ligaturen von Buchstaben auftreten. Als Formatierungsobjekt eignet sich die Rückgabe von StringFormat.GenericTypographic. Für genaue Messungen sollte außerdem graphics.TextRenderingHint = TextRenderingHint.AntiAlias gesetzt werden. Exakter passende Messungen erhalten Sie mit MeasureCharacterRanges.
Public Function MeasureString([text] As String, font As Font _ , layoutArea As SizeF, stringFormat As StringFormat _ , ByRef charactersFitted As Integer, ByRef linesFilled As Integer) _ As SizeF Public Function MeasureString([text] As String, font As Font, _ origin As PointF, stringFormat As StringFormat) As SizeF Public Function MeasureString( [text] As String, font As Font, _ maxWidth As Integer, format As StringFormat) As SizeF Public Function MeasureCharacterRanges([text] As String, font As Font, _ layoutRect As RectangleF, stringFormat As StringFormat) As Region() |
Die Struktur SizeF repräsentiert einen rechteckigen Bereich, dessen Abmessungen in den Eigenschaften Height und Width vom Typ Single gespeichert sind. Um einen Text zu zentrieren, müssen Sie ihn um die Hälfte der Abmessungen vom Zentrum nach links oben verschieben, da der Textursprung links oben liegt. Ein alternativer Weg führt über die Klasse StringFormat.
15.4.5 Textlayout mit StringFormat
Ein Objekt vom Typ StringFormat enthält Informationen für das Textlayout, beispielsweise die Textausrichtung und den Zeilenabstand. Mit den beiden Eigenschaften Alignment und LineAlignment wird eine Zeichenfolge positioniert. Alignment beschreibt die horizontale Ausrichtung eines Textes, LineAlignment die vertikale. Beide sind vom Typ der Enumeration StringAlignment (siehe Tabelle 15.5).
Konstante | Beschreibung |
Near |
Die Ausrichtung orientiert sich an der linken oberen Ecke. |
Center |
Die Ausrichtung ist zentriert in der Mitte. |
Far |
Die Ausrichtung orientiert sich an der rechten unteren Ecke. |
Damit wird die zentrierte Ausgabe einer Zeichenfolge wie in Abbildung 15.9 einfach: Wir erzeugen ein StringFormat-Objekt und legen die beiden Eigenschaften Alignment und LineAlignment auf StringAlignment.Center fest. Anschließend übergeben wir das StringFormat-Objekt der DrawString-Methode.
'...\GDI\Figuren\TextZentriert.vb |
Public Class TextZentriert Private Sub TextZentriert_Paint(sender As Object, e As PaintEventArgs) _ Handles MyBase.Paint Dim ft As New Font("Arial", 20) Dim gr As Graphics = e.Graphics Dim format As New StringFormat() format.Alignment = StringAlignment.Center format.LineAlignment = StringAlignment.Center Dim w As Integer = ClientSize.Width, h As Integer = ClientSize.Height gr.DrawLine(New Pen(Brushes.Blue), 0, h \ 2, w, h \ 2) gr.DrawLine(New Pen(Brushes.Blue), w \ 2, 0, w \ 2, h) gr.DrawString("Hallo Welt", ft, Brushes.Black, w / 2, h / 2, format) End Sub End Class
Abbildung 15.9 Zentrierter Text
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.