Recupero delle metriche dei tipi di carattere
La classe FontFamily fornisce i metodi seguenti che recuperano varie metriche per una particolare combinazione di famiglia/stile:
- FontFamily::GetEmHeight(FontStyle)
- FontFamily::GetCellAscent(FontStyle)
- FontFamily::GetCellDescent(FontStyle)
- FontFamily::GetLineSpacing(FontStyle)
I numeri restituiti da questi metodi sono in unità di progettazione dei tipi di carattere, quindi sono indipendenti dalle dimensioni e dalle unità di un particolare oggetto Font .
La figura seguente mostra l'ascente, la discesa e la spaziatura linea.
Nell'esempio seguente vengono visualizzate le metriche per lo stile regolare della famiglia di caratteri Arial. Il codice crea anche un oggetto Font (basato sulla famiglia Arial) con dimensioni di 16 pixel e visualizza le metriche (in pixel) per quel particolare oggetto Font .
#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);
La figura seguente mostra l'output del codice precedente.
Si notino le prime due righe di output nell'illustrazione precedente. L'oggetto Font restituisce una dimensione pari a 16 e l'oggetto FontFamily restituisce un'altezza em pari a 2.048. Questi due numeri (16 e 2.048) sono la chiave per la conversione tra le unità di progettazione del carattere e le unità (in questo caso pixel) dell'oggetto Font .
Ad esempio, è possibile convertire l'ascente da unità di progettazione a pixel come indicato di seguito:
Il codice precedente posiziona il testo verticalmente impostando il membro dati y di un oggetto PointF . La coordinata y viene aumentata di font.GetHeight(0.0f)
per ogni nuova riga di testo. Il metodo Font::GetHeight di un oggetto Font restituisce l'interlinea , espressa in pixel, per quel particolare oggetto Font . In questo esempio il numero restituito da Font::GetHeight è 18.398438. Si noti che si tratta dello stesso numero ottenuto convertendo la metrica di interlinea in pixel.