Obtention de métriques de police
La classe FontFamily fournit les méthodes suivantes qui récupèrent différentes métriques pour une combinaison de style/famille particulière :
- FontFamily::GetEmHeight(FontStyle)
- FontFamily::GetCellAscent(FontStyle)
- FontFamily::GetCellDescent(FontStyle)
- FontFamily::GetLineSpacing(FontStyle)
Les nombres retournés par ces méthodes se trouvent dans des unités de conception de police. Ils sont donc indépendants de la taille et des unités d’un objet Font particulier.
L’illustration suivante montre l’ascension, la descente et l’espacement des lignes.
L’exemple suivant affiche les métriques pour le style normal de la famille de polices Arial. Le code crée également un objet Font (basé sur la famille Arial) d’une taille de 16 pixels et affiche les métriques (en pixels) pour cet objet Font particulier.
#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);
L’illustration suivante montre la sortie du code précédent.
Notez les deux premières lignes de sortie dans l’illustration précédente. L’objet Font renvoie une taille de 16, et l’objet FontFamily renvoie une hauteur em de 2 048. Ces deux nombres (16 et 2 048) sont la clé pour convertir entre les unités de conception de police et les unités (dans ce cas des pixels) de l’objet Font .
Par exemple, vous pouvez convertir l’ascension des unités de conception en pixels comme suit :
Le code précédent positionne le texte verticalement en définissant le membre de données y d’un objet PointF . La coordonnée y est augmentée de font.GetHeight(0.0f)
pour chaque nouvelle ligne de texte. La méthode Font::GetHeight d’un objet Font retourne l’espacement de ligne (en pixels) pour cet objet Font particulier. Dans cet exemple, le nombre retourné par Font::GetHeight est 18.398438. Notez que cela est identique au nombre obtenu en convertissant la métrique d’espacement de ligne en pixels.