System.Windows.Forms.TextRenderer.DrawText
метод отображает форматированный текст с левым или правым заполнением или без него в зависимости от значения параметра flags
:
-
TextFormatFlags.NoPadding
- плотно вставляется в ограничивающий прямоугольник, -
TextFormatFlags.GlyphOverhangPadding
- добавляет левое и правое поля, -
TextFormatFlags.LeftAndRightPadding
- добавляет еще большие поля.
Теперь, мой вопрос: , как я могу получить точное количество дополнений (слева и справа), добавленных DrawText
к тексту для заданного контекста устройства, строки, шрифта и т.д.
Я выкопал в .NET 4 с .NET Reflector и обнаружил, что TextRenderer вычисляет "навесу навеса", которая составляет 1/6 от высоты шрифта, а затем умножает это значение для вычисления левого и правого полей с использованием этих коэффициентов:
- left 1.0, right 1.5 для
TextFormatFlags.GlyphOverhangPadding
, - left 2.0, справа 2.5 для
TextFormatFlags.LeftAndRightPadding
.
Полученные значения округляются и передаются в собственные функции API DrawTextExA
или DrawTextExW
. Трудно воссоздать этот процесс, потому что высота шрифта берется не из System.Drawing.Font
, а из System.Windows.Forms.Internal.WindowsFont
, и эти классы возвращают разные значения для одного и того же шрифта. И еще много других внутренних классов BCL из пространства имен System.Windows.Forms.Internal
. Декомпиляция всех из них и повторное использование их кода в моем приложении не является вариантом, потому что это будет серьезная зависимость реализации .NET. Поэтому мне нужно знать, есть ли какой-либо публичный API в WinForms или, по крайней мере, какие функции Windows я могу использовать для получения значений полей слева и справа.
Примечание.. Я пытался использовать TextRenderer.MeasureText
с заполнением и без него и сравнивать результаты, но это дало мне только сумму левого и правого полей, и я нуждаюсь в них отдельно.
Примечание 2: Если вам интересно, зачем мне это нужно: я хочу нарисовать одну строку с несколькими шрифтами/цветами. Это включает вызов DrawText
один раз для каждой равномерно форматированной подстроки с параметром NoPadding
(так что текст не распространяется), но я также хочу добавить вручную обычный GlyphOverhangPadding
в самом начале и в самом конце всего мульти- формат текста.