Измерьте позиции символов при рисовании длинных строк в C#

Пример Измерение позиций символов в нарисованном строка в C# использует метод Graphics класса GraphicsCharacterRanges для поиска позиций, в которых будут рисоваться символы в строке. К сожалению, этот метод требует, чтобы вы вызывали метод StringFormat объекта SetMeasurableCharacterRanges, и этот метод может устанавливать не более 32 диапазонов. Это означает, что вы не можете найти позиции более чем для 32 символов. Если вы попытаетесь, метод выдает неинформативное исключение «Ошибка переполнения».

Этот пример разбивает длинную строку на куски длиной не более 32 символов, а затем измеряет фрагменты отдельно. Есть несколько небольших проблем с этим подходом, который работает в этом примере.

Следующий метод MeasureCharactersInWord находит позиции символов в строке длиной не более 32 символов.

Этот метод создает List & lt; RectangleF & gt;, чтобы удерживать результаты.

Затем он создает объект StringFormat, чтобы указать, как текст будет отформатирован при рисовании. Он устанавливает свойства объекта Alignment и LineAlignment, чтобы текст отображался в верхнем левом углу области рисования.

Обычно, когда вы рисуете или измеряете символы, методы рисования или измерения игнорируют конечное пространство. В этом примере некоторые части длинной строки могут заканчиваться таким пространством, и программа не может игнорировать ширину этого пространства. Чтобы метод измерения не игнорировал пробел, код устанавливает свойство StringFormat объекта FormatFlags в MeasureTrailingSpaces.

Далее метод MeasureCharactersInWord создает массив объектов CharacterRange и инициализирует их для представления диапазонов в строке, которая должна быть измерена, в данном случае отдельных символов. Код вызывает SetMeasurableCharacterRanges, чтобы сообщить объекту StringFormat о диапазонах.

Затем метод вызывает MeasureCharacterRanges, чтобы получить области, где будут рисоваться символы. Метод заканчивается путем преобразования областей в значения RectangleF и возвращает результат.

Следующий метод MeasureCharacters использует предыдущий метод для измерения строк длиной более 32 символов.

Этот метод использует переменную x, чтобы отслеживать координату X прямоугольника следующего символа. Метод инициализирует x до 0.

Далее код разбивает строку на части, содержащие не более 32 символов, и вызывает метод MeasureCharactersInWord для каждой части.

Когда вы на самом деле рисуете строку, метод DrawString, кажется, добавляет немного места перед первым символом, чтобы начать все. Этот метод обрабатывает это путем добавления этого бита дополнительного пространства (сохраненного в свойстве Left прямоугольника первого символа) к x. Когда он рисует последующие фрагменты более длинной строки, DrawString не добавляет лишнее пространство, поэтому оно добавляется только для первой части.

Затем метод использует ширины возвращаемых значений RectangleF для создания прямоугольников для символов и добавления их к результату метода.

Следующий метод DrawTextInBoxes рисует строку с полями вокруг каждого символа.

Этот метод вызывает MeasureCharacters, чтобы получить прямоугольники, представляющие позиции символов. Если затем прокручивается через прямоугольники, каждый из которых смещается на сумму, переданную в этот метод. Наконец, метод рисует строку.

Последней частью программы является следующий обработчик событий Form_Load.

Этот метод создает Bitmap, очищает его и вызывает метод DrawTextInBoxes для рисования текста и прямоугольников вокруг символов.

В этом коде есть только одна тонкая вещь. Обычно я устанавливаю свойство TextRenderingHint объекта Graphics объекта AntiAliasGridFit для создания наилучшего вида текста. Однако, если вы это сделаете, метод DrawString может корректировать интервал между текстами для получения лучшего результата. К сожалению, метод MeasureCharacterRanges не учитывает эту настройку, поэтому прямоугольники не выравниваются правильно над их символами.

Источник: http://csharphelper.com/blog/2015/02/measure-character-positions-when-drawing-long-strings-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *