2010-08-25 2 views
5

Я разрабатываю программу 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); 
+0

Используете ли вы MeasureString()? Покажите фрагмент с этим вызовом. –

+1

Я не использую MeasureString() здесь - я отредактировал ответ, чтобы показать, что я делаю. –

ответ

0

Ну, я решил эту проблему. Это не так, как я хотел это сделать, но для справки, я сделал это вот так:

У меня уже есть код, который вычисляет ограничивающий прямоугольник для каждого слова (для выработки позиции каретки при нажатии в элементе управления и для отображения обоснованного текста), поэтому вместо того, чтобы рисовать всю строку за один раз, я теперь рисую каждое слово отдельно.

Кажется расточительным постоянно звонить DrawString() для каждого слова (когда он может справиться с целыми многострочными блоками за один раз), но программа остается довольно быстрой.

Теперь, если только я мог понять, почему он, кажется, хочет изменить кернинг для отдельных букв в слове, как слово растет ...