获取字体指标

FontFamily 类提供以下方法,用于检索特定系列/样式组合的各种指标:

这些方法返回的数字采用字体设计单位,因此它们与特定 Font 对象的大小和单位无关。

下图显示了上升、下降和行距。

相邻线条上两个字符的示意图,显示单元格上升、单元格下降和行距

以下示例显示 Arial 字体系列的常规样式的指标。 该代码还基于大小为 16 像素的 Arial 系列) 创建 Font 对象 ( ,并显示该特定 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);
            

下图显示了上述代码的输出。

显示字号和高度以及上升、下降和行距的文本的窗口的屏幕截图

请注意上图中的前两行输出。 Font 对象返回大小 16,FontFamily 对象返回 2,048 的 em 高度。 这两个数字 (16 和 2,048) 是字体设计单位与 字体对象的像素) 在本例中 (单位之间进行转换的关键。

例如,可以将上升从设计单位转换为像素,如下所示:

公式将 1854 个设计单位乘以 16 像素除以 2048 个设计单位,等于 14.484375 像素

上述代码通过设置 PointF 对象的 y 数据成员来垂直定位文本。 每增加一行文本,y 坐标就增加 font.GetHeight(0.0f) Font 对象的 Font::GetHeight 方法返回该特定 Font 对象的行距 () 像素。 在此示例中, Font::GetHeight 返回的数字为 18.398438。 请注意,这与通过将行距指标转换为像素获得的数字相同。