netlib.narod.ru | < Назад | Оглавление | Далее > |
Мы уже ознакомились с шестью вариантами метода DrawString:
Методы DrawString класса Graphics
void DrawString(string str, Font font, Brush brush, PointF ptf) |
void DrawString(string str, Font font, Brush brush, float x, float y) |
void DrawString(string str, Font font, Brush brush, RectangleF rectf) |
void DrawString(string str, Font font, Brush brush, PointF ptf, StringFormat sf) |
void DrawString(string str, Font font, Brush brush, float x, float y, StringFormat sf) |
void DrawString(string str, Font font, Brush brush, RectangleF rectf, StringFormat sf) |
Версии, использующие структуру PointF, идентичны версиям, которые применяют пару значений с плавающей запятой. Это просто два разных способа задания координат начальной точки новой строки. Все четыре перегруженных метода DrawString, которые применяют PointF или пару чисел с плавающей запятой, обычно выводят одну строку текста. Однако если текст содержит знак перевода каретки ('\n' или '\x000A'), последующий текст отображается на новой строке.
Две версии DrawString, в которых есть аргумент RectangleF, переносят слишком широкий текст на новую строку, чтобы он уместился в прямоугольнике. Если одно слово не помещается в прямоугольник, метод разместит столько знаков слова, сколько поместится, а остальные перенесет на следующую строку. Эти версии свойства DrawString распознают знак Unicode '\x00A0' — неразрывный пробел. Он используется вместо нормального пробела, когда перенос текста в этом месте будет выглядеть неуместным, например, в строке:
"World War\x00A0I"
В этом случае, если знак I не помещается на строке, метод DrawString перенесет строку после слова World.
Эти версии DrawString не обрабатывают корректно знак '\x00AD' (мягкий перенос). Обычно он вставляется в местах возможного переноса в длинных словах:
"ex\x00ADtraor\x00ADdi\x00ADnary"
Теоретически формирователь текста должен переносить строку в этих местах и отобразить знак переноса — дефис. Если в переносе нет нужды, дефис не отображается. Однако метод DrawString показывает эти дефисы всегда и даже переносит строку перед дефисом.
Эти версии метода DrawString также неправильным образом обрабатывают знак '\х2011' в кодировке Unicode (неразрывный дефис), используемый в таких словах, как, например:
"T\x2011shirt"
Буква Т с дефисом в конце строчки будет выглядеть странно. В некоторых шрифтах TrueType этого знака нет. Для шрифтов, включающих его (таких как Lucida Sans Unicode), метод DrawString стремится избежать переноса строки на знаке «неразрывный дефис», но за дефисом вставляет пробел.
Хотя DrawString может переносить слова, он имеет свои ограничения. Так, DrawString способен вывести на монитор фрагмент текста в вашем приложении, но он не сможет выделить отдельное слово во фрагменте курсивом или полужирным начертанием, так как аргумент Font метода DrawString определяет шрифт для всего фрагмента. (Заметим, что существует способ выделить часть текста подчеркиванием при вызове DrawString. Я покажу как это сделать, в программе UnderlinedText.)
Следующее ограничение. Как вы знаете, свойство Alignment класса StringFormat позволяет управлять горизонтальным выравниванием текста в прямоугольнике. Можно выровнять абзац по центру, по левому или правому краю прямоугольника, но не по ширине. DrawString не способен вставить пустые места между словами так, чтобы левый край и правый край были выровнены.
Эту проблему можно решить двумя способами: либо написать собственную программу форматирования текста, либо использовать элемент управления RichTextBox, у которого больше возможностей форматирования, чем у DrawString. Мы рассмотрим RichTextBox в главе 18.
netlib.narod.ru | < Назад | Оглавление | Далее > |