Я получаю размер строки в пикселях и конвертирую его в сотые доли дюйма (т.е. пиксели / DPI = дюймы, дюймы * 100 = сотые доли дюйм). Вот мой код:
private static SizeF TextSize(string text, Font txtFnt)
{
SizeF txtSize = new SizeF();
// The size returned is 'Size(int width, int height)' where width and height
// are the dimensions of the string in pixels
Size s = System.Windows.Forms.TextRenderer.MeasureText(text, txtFnt);
// Value based on normal DPI settings of 96
txtSize.Width = (float)Math.Ceiling((float)s.Width / 96f * 100f);
txtSize.Height = (float)Math.Ceiling((float)s.Height / 96f * 100f);
return txtSize;
}
Теперь, используя шрифт Arial, все это отлично работает для шрифтов меньше 12, но после этого символы начинают обрезаться, потому что расчетный размер меньше фактического. Я знаю, что мои настройки DPI установлены на 96. Все мои шрифты определены одинаково с изменением размера шрифта:
Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point);
Я считаю, что мне нужно использовать GraphicsUnit.Point
из-за настраиваемого элемента управления, который я я рисую строки, но имеет ли значение GraphicsUnit
?
Функция MeasureText
работает правильно или что-то еще происходит?
EDIT
Я рисую в настраиваемом элементе управления предварительным просмотром печати. Единицы измерения в элементе управления предварительным просмотром печати - «дюймы / 100» (отсюда и преобразование). Я считаю, что текст, изображения и т. Д. Нарисованы с помощью графического объекта Printer, но я не совсем уверен.