Freigeben über


Anleitung: Schriftmetriken abrufen

Die FontFamily Klasse stellt die folgenden Methoden bereit, mit denen verschiedene Metriken für eine bestimmte Kombination aus Familie und Stil abgerufen werden:

Die von diesen Methoden zurückgegebenen Werte befinden sich in Schriftartentwurfseinheiten, sodass sie unabhängig von größe und Einheiten eines bestimmten Font Objekts sind.

Die folgende Abbildung zeigt die verschiedenen Metriken:

Abbildung der Schriftmetriken: Anstieg, Abstieg und Zeilenabstand.

Beispiel

Im folgenden Beispiel werden die Metriken für den regulären Stil der Arial-Schriftartenfamilie angezeigt. Der Code erstellt außerdem ein Font Objekt (basierend auf der Arial-Familie) mit einer Größe von 16 Pixeln und zeigt die Metriken (in Pixel) für dieses bestimmte Font Objekt an.

Die folgende Abbildung zeigt die Ausgabe des Beispielcodes:

Beispielcodeausgabe von Arial-Schriftartmetriken.

Beachten Sie die ersten beiden Zeilen der Ausgabe in der obenstehenden Abbildung. Das Font Objekt gibt eine Größe von 16 zurück, und das FontFamily Objekt gibt eine Em-Höhe von 2.048 zurück. Diese beiden Zahlen (16 und 2.048) sind der Schlüssel zum Konvertieren zwischen Schriftartentwurfseinheiten und den Einheiten (in diesem Fall Pixel) des Font Objekts.

Sie können z. B. den Aufstieg von Entwurfseinheiten wie folgt in Pixel konvertieren:

Formel mit der Konvertierung von Entwurfseinheiten in Pixel

Der folgende Code positioniert Text vertikal, indem das Y Datenelement eines PointF Objekts festgelegt wird. Die Y-Koordinate wird für jede neue Textzeile um font.Height erhöht. Die Height Eigenschaft eines Font Objekts gibt den Zeilenabstand (in Pixel) für dieses bestimmte Font Objekt zurück. In diesem Beispiel beträgt die von Height zurückgegebene Zahl 19. Beachten Sie, dass dies dieselbe Zahl ist, die man erhält, wenn man die Metrik für den Zeilenabstand in Pixel umwandelt und auf eine ganze Zahl aufrundet.

Beachten Sie, dass die Em-Höhe (auch als Größe oder Em-Größe bezeichnet) nicht die Summe des Abstiegs und des Abstiegs ist. Die Summe des Anstiegs und des Abstiegs wird als Zellhöhe bezeichnet. Die Zellhöhe minus dem internen Vorlauf entspricht der em-Höhe. Die Zellhöhe plus der äußeren Führungslinie entspricht dem Zeilenabstand.

string infoString = "";  // enough space for one line of output
int ascent;             // font family ascent in design units
float ascentPixel;      // ascent converted to pixels
int descent;            // font family descent in design units
float descentPixel;     // descent converted to pixels
int lineSpacing;        // font family line spacing in design units
float lineSpacingPixel; // line spacing converted to pixels

FontFamily fontFamily = new FontFamily("Arial");
Font font = new Font(
   fontFamily,
   16, FontStyle.Regular,
   GraphicsUnit.Pixel);
PointF pointF = new PointF(10, 10);
SolidBrush solidBrush = new SolidBrush(Color.Black);

// Display the font size in pixels.
infoString = "font.Size returns " + font.Size + ".";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);

// Move down one line.
pointF.Y += font.Height;

// Display the font family em height in design units.
infoString = "fontFamily.GetEmHeight() returns " +
   fontFamily.GetEmHeight(FontStyle.Regular) + ".";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);

// Move down two lines.
pointF.Y += 2 * font.Height;

// Display the ascent in design units and pixels.
ascent = fontFamily.GetCellAscent(FontStyle.Regular);

// 14.484375 = 16.0 * 1854 / 2048
ascentPixel =
   font.Size * ascent / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The ascent is " + ascent + " design units, " + ascentPixel +
   " pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);

// Move down one line.
pointF.Y += font.Height;

// Display the descent in design units and pixels.
descent = fontFamily.GetCellDescent(FontStyle.Regular);

// 3.390625 = 16.0 * 434 / 2048
descentPixel =
   font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The descent is " + descent + " design units, " +
   descentPixel + " pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);

// Move down one line.
pointF.Y += font.Height;

// Display the line spacing in design units and pixels.
lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular);

// 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel =
font.Size * lineSpacing / fontFamily.GetEmHeight(FontStyle.Regular);
infoString = "The line spacing is " + lineSpacing + " design units, " +
   lineSpacingPixel + " pixels.";
e.Graphics.DrawString(infoString, font, solidBrush, pointF);
Dim infoString As String = "" ' enough space for one line of output
Dim ascent As Integer ' font family ascent in design units
Dim ascentPixel As Single ' ascent converted to pixels
Dim descent As Integer ' font family descent in design units
Dim descentPixel As Single ' descent converted to pixels
Dim lineSpacing As Integer ' font family line spacing in design units
Dim lineSpacingPixel As Single ' line spacing converted to pixels
Dim fontFamily As New FontFamily("Arial")
Dim font As New Font( _
   fontFamily, _
   16, _
   FontStyle.Regular, _
   GraphicsUnit.Pixel)
Dim pointF As New PointF(10, 10)
Dim solidBrush As New SolidBrush(Color.Black)

' Display the font size in pixels.
infoString = "font.Size returns " & font.Size.ToString() & "."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)

' Move down one line.
pointF.Y += font.Height

' Display the font family em height in design units.
infoString = "fontFamily.GetEmHeight() returns " & _
   fontFamily.GetEmHeight(FontStyle.Regular) & "."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)

' Move down two lines.
pointF.Y += 2 * font.Height

' Display the ascent in design units and pixels.
ascent = fontFamily.GetCellAscent(FontStyle.Regular)

' 14.484375 = 16.0 * 1854 / 2048
ascentPixel = _
   font.Size * ascent / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The ascent is " & ascent & " design units, " & ascentPixel _
   & " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)

' Move down one line.
pointF.Y += font.Height

' Display the descent in design units and pixels.
descent = fontFamily.GetCellDescent(FontStyle.Regular)

' 3.390625 = 16.0 * 434 / 2048
descentPixel = _
   font.Size * descent / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The descent is " & descent & " design units, " & _
   descentPixel & " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)

' Move down one line.
pointF.Y += font.Height

' Display the line spacing in design units and pixels.
lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular)

' 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel = _
   font.Size * lineSpacing / fontFamily.GetEmHeight(FontStyle.Regular)
infoString = "The line spacing is " & lineSpacing & " design units, " & _
   lineSpacingPixel & " pixels."
e.Graphics.DrawString(infoString, font, solidBrush, pointF)

Code kompilieren

Das obige Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgse, einen Parameter von PaintEventHandler.

Siehe auch