Правильное рисование текста с использованием DrawString () - PullRequest
3 голосов
/ 19 декабря 2011

У меня проблемы с методом Graphics.DrawString ().Мой UserControl использует моноширинный шрифт для рисования на панели, и, очевидно, DrawString () форматирует текст таким образом, что он больше не является моноширинным.Я использовал StringFormat в надежде исправить это, но безуспешно:

StringFormat sf = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox | StringFormatFlags.LineLimit | StringFormatFlags.MeasureTrailingSpaces);

Код для рисования текста:

for (int i = 0; i < document.Text.Count; i++)
                g.DrawString(document.Text[i], Font, Brushes.Black, new PointF(offset - 2, offset + Font.Height * i), sf);

Например, при рисовании "eeeeeeee"в Consolas 9 время от времени два e будут на 1 пиксель ближе к другому.Есть ли способ правильно отобразить текст в моноширинном пространстве?

(Моя актуальная проблема: я создаю свой собственный элемент управления текстовым полем с нуля, в качестве упражнения и для развлечения. На самом деле все идет довольно хорошо, но панельпри отображении текста должна быть возможность позиционирования каретки в соответствии с положением щелчка мыши. Найти правильную строку легко благодаря свойству высоты шрифта. Однако найти текущий индекс в этой строке нельзя. Для шрифтов, не имеющих моноширинного пространства, я могуНе представляю способ определения индекса каретки, но для моноширинных шрифтов это должно быть выполнимо, поскольку ширина символа фиксирована. Так, может быть, есть лучший способ определить это?)

С уважениемJacco

1 Ответ

4 голосов
/ 19 декабря 2011

Это - это рисунок моноширинный.Просто ширина каждого символа не является целым числом пикселей - каждый символ, вероятно, примерно 9,9 пикселей в ширину.(Чтобы символы были разборчивы, они привязывают каждый к ближайшему пикселю, когда рисуют его, поэтому иногда вы видите два ближе друг к другу.)

Один из вариантов - использовать AntiAlias ​​* 1006флаг, который прекратит попытки привязать каждый символ к ближайшему пикселю - он будет просто размыть градации серого, чтобы интервал в целом выглядел относительно равномерным.Тем не менее, сглаживание не выглядит хорошо при небольших размерах шрифта.

Или вы можете использовать TextRenderer вместо Graphics.DrawString.TextRenderer использует старый рендеринг GDI (вместо GDI +, как это делает класс Graphics), поэтому он вообще не выполняет субпиксельное рендеринг - либо каждый символ имеет ширину 9 пикселей, либо каждый символ имеет ширину 10 пикселей.Иногда старые технологии лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...