Почему TextRenderer добавляет поля при измерении текста?
Из-за отсутствия в некоторых местах объекта Graphics в моем приложении я решил использовать класс TextRenderer. Что удивительно, так это то, что он добавляет много полей к размеренному тексту. Например:
private void button1_Click(object sender, EventArgs e) {
using (var g = this.CreateGraphics()) {
Font font = new Font("Calibri", 20.0f, GraphicsUnit.Pixel);
Size size = TextRenderer.MeasureText("Ala ma kota", font);
g.DrawRectangle(Pens.Red, new Rectangle(new Point(10, 10), size));
TextRenderer.DrawText(g, "Ala ma kota", font, new Point(10, 10), Color.Black);
}
}
Дает следующий результат:
Почему это так? Есть ли способ заставить его получить реальный размер текста? (и, конечно, нарисуйте его в том же прямоугольнике, который он возвращает)
1 ответ
Из MSDN:
Например, поведение по умолчанию
TextRenderer
заключается в добавлении отступов к ограничивающему прямоугольнику нарисованного текста для размещения нависающих глифов. Если вам нужно нарисовать строку текста без этих лишних пробелов, используйте версииDrawText
а такжеMeasureText
что взятьSize
а такжеTextFormatFlags
параметр, как показано в примере.
Вы также должны пройти Graphics
объект для правильных результатов, потому что:
Это перегрузка
MeasureText(String, Font, Size, TextFormatFlags)
будет игнорироватьTextFormatFlags
ценностьNoPadding
или жеLeftAndRightPadding
, Если вы указываете значение отступа, отличное от значения по умолчанию, вы должны использовать перегрузкуMeasureText(IDeviceContext, String, Font, Size, TextFormatFlags)
это занимаетIDeviceContext
объект.
Size size = TextRenderer.MeasureText(g,
"Ala ma kota",
font,
new Size(int.MaxValue, int.MaxValue),
TextFormatFlags.NoPadding);
TextRenderer.DrawText(g, "Ala ma kota", font,
new Point(10, 10),
Color.Black,
TextFormatFlags.NoPadding);
g.DrawRectangle(Pens.Red, new Rectangle(new Point(10, 10), size));
Также взгляните на использование Graphics
методы напрямую: GDI + MeasureString () неправильно обрезает текст