Share via


Obtención de métricas de fuente

La clase FontFamily proporciona los métodos siguientes que recuperan varias métricas para una combinación de familia o estilo determinada:

Los números devueltos por estos métodos están en unidades de diseño de fuente, por lo que son independientes del tamaño y las unidades de un objeto Font determinado.

En la ilustración siguiente se muestra el espaciado de la línea, el descenso y el ascenso.

diagrama de dos caracteres en líneas adyacentes, que muestra el ascenso de celda, el descenso de celdas y el espaciado de líneas

En el ejemplo siguiente se muestran las métricas del estilo normal de la familia de fuentes Arial. El código también crea un objeto Font (basado en la familia Arial) con un tamaño de 16 píxeles y muestra las métricas (en píxeles) para ese objeto Font determinado.

#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);
            

En la ilustración siguiente se muestra la salida del código anterior.

captura de pantalla de una ventana con texto que indica el tamaño y la altura de la fuente, y el espaciado de línea, descenso y ascenso

Observe las dos primeras líneas de salida en la imagen anterior. El objeto Font devuelve un tamaño de 16 y el objeto FontFamily devuelve un alto em de 2048. Estos dos números (16 y 2048) son la clave para convertir entre unidades de diseño de fuente y las unidades (en este caso píxeles) del objeto Font .

Por ejemplo, puede convertir el ascenso de unidades de diseño a píxeles de la siguiente manera:

ecuación que multiplica 1854 unidades de diseño por 16 píxeles divididos por 2048 unidades de diseño, que equivalen a 14,484375 píxeles

El código anterior coloca el texto verticalmente estableciendo el miembro de datos y de un objeto PointF . La coordenada y se incrementa en font.GetHeight(0.0f) cada nueva línea de texto. El método Font::GetHeight de un objeto Font devuelve el espaciado de línea (en píxeles) para ese objeto Font determinado. En este ejemplo, el número devuelto por Font::GetHeight es 18.398438. Tenga en cuenta que es el mismo que el número obtenido convirtiendo la métrica de interlineado en píxeles.