Я разрабатываю программу Winnet 3.5. Win Forms, и у меня возникла «интересная» проблема с текстовым рисунком..net Ошибка DrawString/StringFormat
Я реализую элемент управления редактированием текста и рисует текст с помощью DrawString() и StringFormat.GenericTypographic (далее GT). По мере того, как пользователь вводит, целые слова (или группы слов) ранее в строке двигаются тонко влево и вправо случайным образом.
Вероятно, это ошибки округления - поврежденный блок смотрит на сдвиг одного пикселя в горизонтальной плоскости, когда буквы добавляются к концу строки. Если я использую StringFormat.GenericDefault (GD), этого не произойдет, но символы отображаются менее точно, и это неприемлемо.
Я рассуждал о том, что я мог бы медленно сменить GD на GT (настройки для каждого из них обсуждаются в MSDN и, очевидно, могут быть рассмотрены в отладчике) и посмотреть, какие FormatFlags или другие настройки вызывали это и оттуда. Однако, если я возьму копию GD, измените все свойства так, чтобы он был идентичен GT, размещение символов совсем другое - поведение этих двух предположительно идентичных объектов явно не то же самое.
Как и многие вещи IMHO, .net Reflector показывает, что StringFormat - это просто оболочка для объекта без управления, и я могу только предположить, что не все его свойства подвергаются программному обеспечению .net.
Может ли кто-нибудь предложить что-нибудь, что могло бы мне помочь? Я знаю, что TextRenderer может предоставить альтернативный метод для рендеринга, но я отказался от этого ранее в своем процессе разработки (хотя я не могу вспомнить, какая проблема была сейчас ...).
Редактировать
код я использую для рендеринга выглядит следующим образом:
sForm = new StringFormat(StringFormat.GenericTypographic);
sForm.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
using (SolidBrush brush = new SolidBrush(frmt.ForegroundColour))
context.DrawString(line.Text, frmt.DisplayFont, brush, new PointF(horizontal, height), sForm);
Используете ли вы MeasureString()? Покажите фрагмент с этим вызовом. –
Я не использую MeasureString() здесь - я отредактировал ответ, чтобы показать, что я делаю. –