Что я делаю, так это получаю размер строки в пикселях и преобразую ее в сотые доли дюйма (т.е. пиксели / 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» (отсюда и конверсия). Я считаю, что текст, изображения и т. Д. Нарисованы с помощью графического объекта «Принтер», но я не совсем уверен.