Vorgehensweise: Abrufen von Schriftarteigenschaften
Die FontFamily-Klasse stellt die folgenden Methoden bereit, die verschiedene Metriken für eine bestimmte Kombination aus Familien und Formatvorlagen abrufen:
GetEmHeight(FontStyle)
GetCellAscent(FontStyle)
GetCellDescent(FontStyle)
GetLineSpacing(FontStyle)
Die von diesen Methoden zurückgegebenen Werte befinden sich in Schriftentwurfseinheiten, sodass sie unabhängig von der Größe und Einheiten eines bestimmten Font-Objekts sind.
Die folgende Abbildung zeigt die verschiedenen Metriken:
Beispiel
Im folgenden Beispiel werden die Metriken für den regulären Stil der Arial-Schriftfamilie angezeigt. Der Code erstellt auch 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.
In der folgenden Abbildung ist das Ergebnis des Beispielcodes dargestellt:
Beachten Sie die ersten beiden Ausgabezeilen in der vorherigen 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 Schriftentwurfseinheiten und den Einheiten (in diesem Fall Pixel) des Font-Objekts.
Sie können z. B. den Aufstieg von Entwurfseinheiten wie folgt in Pixel konvertieren:
Der folgende Code positioniert Text vertikal, indem der Y-Datenmember 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 ist die von Height zurückgegebene Zahl 19. Beachten Sie, dass dies mit der Zahl übereinstimmt (aufgerundet auf eine ganze Zahl), die durch Konvertieren der Zeilenabstandsmetrik in Pixel abgerufen wird.
Beachten Sie, dass die em-Höhe (auch als Größe oder mm-Größe bezeichnet) nicht die Summe des Aufstiegs und des Abstiegs ist. Die Summe des Aufstiegs und des Abstiegs wird als Zellenhöhe bezeichnet. Die Zellenhöhe minus der internen Einzugshöhe entspricht der em-Höhe. Die Zellenhöhe plus die externe Einzugshöhe 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)
Kompilieren des Codes
Das obige Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgse
, einen Parameter von PaintEventHandler.
Siehe auch
.NET Desktop feedback