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 в самом начале и в самом конце всего мульти- формат текста.
