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:
- FontFamily::GetEmHeight(FontStyle)
- FontFamily::GetCellAscent(FontStyle)
- FontFamily::GetCellDescent(FontStyle)
- FontFamily::GetLineSpacing(FontStyle)
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.
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.
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:
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.