Share via


Abrufen von Schriftartmetriken

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 Zahlen befinden sich in Schriftentwurfseinheiten, sodass sie unabhängig von der Größe und den Einheiten eines bestimmten Font-Objekts sind.

Die folgende Abbildung zeigt Aufstieg, Abstieg und Zeilenabstand.

Diagramm von zwei Zeichen in angrenzenden Linien mit Zellaufstieg, Zellabstieg und Zeilenabstand

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 der Größe 16 Pixel und zeigt die Metriken (in Pixel) für dieses bestimmte Font-Objekt an.

#define INFO_STRING_SIZE 100  // one line of output including null terminator
WCHAR infoString[INFO_STRING_SIZE] = L"";
UINT  ascent;                 // font family ascent in design units
REAL  ascentPixel;            // ascent converted to pixels
UINT  descent;                // font family descent in design units
REAL  descentPixel;           // descent converted to pixels
UINT  lineSpacing;            // font family line spacing in design units
REAL  lineSpacingPixel;       // line spacing converted to pixels
                       
FontFamily   fontFamily(L"Arial");
Font         font(&fontFamily, 16, FontStyleRegular, UnitPixel);
PointF       pointF(10.0f, 10.0f);
SolidBrush   solidBrush(Color(255, 0, 0, 0));

// Display the font size in pixels.
StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE, 
   L"font.GetSize() returns %f.", font.GetSize());

graphics.DrawString(
   infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0);

// Display the font family em height in design units.
StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE, 
   L"fontFamily.GetEmHeight() returns %d.", 
   fontFamily.GetEmHeight(FontStyleRegular));

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down two lines.
pointF.Y += 2.0f * font.GetHeight(0.0f);

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

// 14.484375 = 16.0 * 1854 / 2048
ascentPixel = 
   font.GetSize() * ascent / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString,
   INFO_STRING_SIZE,
   L"The ascent is %d design units, %f pixels.",
   ascent, 
   ascentPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0f);

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

// 3.390625 = 16.0 * 434 / 2048
descentPixel = 
   font.GetSize() * descent / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE,
   L"The descent is %d design units, %f pixels.",
   descent, 
   descentPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0f);

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

// 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel = 
   font.GetSize() * lineSpacing / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE,
   L"The line spacing is %d design units, %f pixels.",
   lineSpacing, 
   lineSpacingPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);
            

Die folgende Abbildung zeigt die Ausgabe des vorangehenden Codes.

Screenshot eines Fensters mit Text, der Schriftgrad und -höhe sowie den Auf-, Abstiegs- und Zeilenabstand angibt

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 für die Konvertierung 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:

Gleichung, die 1854 Entwurfseinheiten mit 16 Pixel dividiert durch 2048 Entwurfseinheiten multipliziert, gleich 14,484375 Pixel

Der vorangehende Code positioniert Text vertikal, indem der y-Datenmember eines PointF-Objekts festgelegt wird. Die Y-Koordinate wird für jede neue Textzeile um font.GetHeight(0.0f) erhöht. Die Font::GetHeight-Methode eines Font-Objekts gibt den Zeilenabstand (in Pixel) für dieses bestimmte Font-Objekt zurück. In diesem Beispiel ist die von Font::GetHeight zurückgegebene Zahl 18,398438. Beachten Sie, dass dies mit der Zahl identisch ist, die durch Konvertieren der Metrik für den Zeilenabstand in Pixel abgerufen wird.