Почему 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 () неправильно обрезает текст

Другие вопросы по тегам