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