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