Partager via


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 :

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.

diagramme de deux caractères sur des lignes adjacentes, montrant l’ascension, la descente de cellule 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.

capture d’écran d’une fenêtre avec du texte qui indique la taille et la hauteur de la police, ainsi que l’ascension, la descente et l’espacement des lignes

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 :

équation qui multiplie 1854 unités de conception par 16 pixels divisé par 2048 unités de conception, égal à 14,484375 pixels

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.