Abrufen von Schriftartmetriken

Die FontFamily-Klasse bietet die folgenden Methoden, die verschiedene Metriken für eine bestimmte Kombination aus Familie und Stil abrufen:

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 Denk-, Abstiegs- und Linienabstand.

Diagramm mit zwei Zeichen in angrenzenden Zeilen, die den Zellenstieg, das Zellenabstiegszeichen und den Zeilenabstand zeigen

Im folgenden Beispiel werden die Metriken für den regulären Stil der Schriftfamilie Arial 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.

#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 Anstieg, den Abstieg und den Zeilenabstand ansendet

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 Ge 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 Pixeln) des Font-Objekts.

Beispielsweise können Sie den Anstieg von Entwurfseinheiten wie folgt in Pixel konvertieren:

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

Der vorangehende Code positioniert Text vertikal durch Festlegen des y-Datenmitglieds eines PointF-Objekts. Die y-Koordinate wird für font.GetHeight(0.0f) jede neue Textzeile um 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 ermittelt wurde.