Получаем размер шрифта в пикселях в C#
Одна странность класса Font заключается в том, что его свойство «Размер» возвращает размер шрифта в единицах, которые использовались для создания шрифта. Свойство Unit класса Font указывает вам единицы, используемые для создания шрифта, но если вам нужен размер шрифта в определенных единицах (например, пикселях), вам необходимо обрабатывать несколько возможных случаев при преобразовании размера шрифта.
Пример При рисовании гладкого текста в GraphicsPath в C# используется следующий код, чтобы избежать необходимости конвертировать размер шрифта.
// Используйте большой шрифт. private void Form1_Load(object sender, EventArgs e) { this.AutoScaleMode = AutoScaleMode.None; this.Font = new Font("Times New Roman", 30, FontStyle.Bold, GraphicsUnit.Pixel); }
Этот код использует пиксели для определения шрифта формы. Позже программа использует следующий код для добавления строки к объекту GraphicsPath.
path.AddString("DrawPath Normal", this.Font.FontFamily, (int)this.Font.Style, this.Font.Size, new Point(10, y), string_format);
Метод AddString определяет размер шрифта в пикселях. Поскольку обработчик события Load формы определяет размер шрифта в пикселях, этот код может использовать this.Font.Size для размера, переданного методу AddString.
В этом примере используется другой метод. Вместо того, чтобы создавать шрифт с использованием единичных пикселей, он использует свойство PropertyInPoints объекта Font, чтобы получить размер шрифта в точках, а затем преобразует их в пиксели.
// Рисуем образцы текста.
private void Form1_Paint(object sender, PaintEventArgs e)
{
const string txt = "Sample Text";
int y = 10;
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString(txt, this.Font, Brushes.Green, 10, y);
y += this.Font.Height;
using (StringFormat string_format = new StringFormat())
{
string_format.Alignment = StringAlignment.Near;
string_format.LineAlignment = StringAlignment.Near;
// Get the form's font size in pixels no matter
// what unit was used to create the font.
float size_in_pixels =
this.Font.SizeInPoints / 72 * e.Graphics.DpiX;
using (GraphicsPath path = new GraphicsPath())
{
path.AddString(txt, this.Font.FontFamily,
(int)this.Font.Style, size_in_pixels, new Point(10, y),
string_format);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillPath(Brushes.Green, path);
}
}
}
Строка ключевого кода выше выделена синим цветом. По определению точка принтера составляет 1/72 дюйма дюйма. Код получает размер шрифта в точках и делит на 72, чтобы получить дюймы. Затем он умножается на разрешение экрана в точках (пикселей) на дюйм, чтобы получить размер в пикселях. Он использует этот размер, чтобы добавить строку к объекту GraphicsPath.
Результаты, полученные методом DrawString объекта Graphics и объектом GraphicsPath, почти одинаковы. В этом примере метод DrawString использует значение TextRenderingHint AntiAlias. Если вы используете AntiAliasGridFit, вы получите немного лучший кернинг (межсимвольный интервал), чтобы получить более приятный результат, но тогда ширина строки не совпадает с результатом, заданным объектом GraphicsPath.
Источник: