Поделиться через


Получение метрик шрифта

Класс FontFamily предоставляет следующие методы, которые получают различные метрики для определенного сочетания семейств и стилей:

Числа, возвращаемые этими методами, находятся в единицах конструктора шрифтов, поэтому они не зависят от размера и единиц определенного объекта Font.

На следующем рисунке показан подъем, спуск и интервалы между линиями.

схема двух символов на смежных линиях, показывающая подъем ячейки, спуск ячеек и интервалы линий

В следующем примере отображаются метрики для регулярного стиля семейства шрифтов Arial. Код также создает объект Font (на основе семейства Arial) с размером 16 пикселей и отображает метрики (в пикселях) для этого конкретного объекта 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. Эти два числа (16 и 2048) являются ключом для преобразования между единицами конструктора шрифтов и единицами (в данном случае пикселями) объекта Font.

Например, вы можете преобразовать переход из единиц проектирования в пиксели следующим образом:

уравнение, согласно которому 1854 единицы проектирования умножаются на 16 пикселей, а затем делится на 2048 единиц проектирования, что равно 14,484375 пикселей

Предыдущий код позиционирует текст вертикально, задавая элемент данных y у объекта PointF. Координата y увеличивается на font.GetHeight(0.0f) для каждой новой строки текста. Метод Font::GetHeight объекта шрифта возвращает межстрочное расстояние (в пикселях) для этого конкретного объекта . В этом примере число, возвращаемое Font::GetHeight, равно 18.398438. Обратите внимание, что это то же самое, что и число, полученное путем преобразования интервала строки в пиксели.