Рисование форматированного текста
Обновлен: Ноябрь 2007
В этом разделе представлены общие сведения о функциях объекта FormattedText. Данный объект предоставляет элемент управления нижнего уровня, предназначенные для рисования текста в приложениях Windows Presentation Foundation (WPF).
В этом разделе содержатся следующие подразделы.
- Общие сведения о технологии
- Использование объекта FormattedText
- Миграция Win32
- Связанные разделы
Общие сведения о технологии
Объект FormattedText предназначен для рисования многострочного текста, в котором каждый символ можно форматировать отдельно. В следующем примере показан текст, к которому применены несколько форматов.
Текст, отображенный с помощью метода FormattedText
![]() |
---|
Для разработчиков, выполняющих задачи по миграции с Win32 API, в таблице раздела Миграция Win32 перечислены флаги Win32 DrawText и их приблизительные эквиваленты в Windows Presentation Foundation (WPF). |
Причины использования форматированного текста
В WPF представлен ряд элементов управления для рисования текста на экране. Каждый элемент управления предназначен для различных сценариев и содержит собственный список функций и ограничений. В общем случае объект TextBlock следует применять, если требуется ограниченная поддержка текста, например при использовании коротких предложений в пользовательский интерфейс. Объект Label может использоваться, когда требуется минимальная поддержка текста. Дополнительные сведения см. в разделе Документы в Windows Presentation Foundation.
Объект FormattedText предоставляет более широкие возможности форматирования текста, чем текстовый элемент управления Windows Presentation Foundation (WPF), и может применяться в тех случаях, когда требуется использовать текст как декоративный элемент. Дополнительные сведения содержатся в следующем разделе Преобразование форматированного текста к геометрическому объекту.
Кроме того, объект FormattedText используется для создания ориентированных на текст производных объектов DrawingVisual. Объект DrawingVisual представляет собой упрощенный класс рисования, который используется для отображения фигур, рисунков или текста. Дополнительные сведения см. в разделе Пример проверки нажатия с помощью DrawingVisuals.
Использование объекта FormattedText
Чтобы создать форматированный текст, вызовите конструктор FormattedText для создания объекта FormattedText. После создания первоначально отформатированной текстовой строки можно применить весь диапазон стилей форматирования.
Используйте свойство MaxTextWidth, чтобы ограничить ширину текста. В соответствии с заданной шириной в тексте используется автоматический перенос слов. Используйте свойство MaxTextHeight, чтобы ограничить высоту текста. Для текста, выходящего за пределы заданного значения высоты, отображается многоточие «…».
Отображенный текст с переносом слов и многоточием
Можно применить несколько стилей форматирования к одному или нескольким знакам. Например, можно вызвать как метод SetFontSize, так и метод SetForegroundBrush для изменения форматирования первых пяти знаков текста.
В следующем примере кода создается объект FormattedText, к которому применяется несколько стилей форматирования.
protected override void OnRender(DrawingContext drawingContext)
{
string testString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor";
// Create the initial formatted text string.
FormattedText formattedText = new FormattedText(
testString,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Verdana"),
32,
Brushes.Black);
// Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
formattedText.MaxTextWidth = 300;
formattedText.MaxTextHeight = 240;
// Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
// Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
formattedText.SetFontWeight(FontWeights.Bold, 6, 11);
// Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
formattedText.SetForegroundBrush(
new LinearGradientBrush(
Colors.Orange,
Colors.Teal,
90.0),
6, 11);
// Use an Italic font style beginning at the 28th character and continuing for 28 characters.
formattedText.SetFontStyle(FontStyles.Italic, 28, 28);
// Draw the formatted text string to the DrawingContext of the control.
drawingContext.DrawText(formattedText, new Point(10, 0));
}
Единица измерения размера шрифта
Как и для других текстовых объектов в приложениях Windows Presentation Foundation (WPF), в качестве единиц измерения для объекта FormattedText используются аппаратно-независимые точки. Однако в большинстве приложений Win32 в качестве единиц измерения используются точки. Если в приложениях Windows Presentation Foundation (WPF) необходимо использовать отображение текста в единицах точек, следует преобразовать аппаратно-независимые единицы (1/96 дюйма на единицу) к точкам. В следующем примере показано, как выполнить данное преобразование.
// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
Преобразование форматированного текста к геометрическому объекту
Можно преобразовать форматированный текст в объекты Geometry, что позволит создавать другие типы наглядного текста. Например, можно создать объект Geometry, основанный на контуре строки текста.
Оконтуривание текста с использованием кисти линейного градиента
В следующих примерах показаны несколько способов создания визуальных эффектов посредством изменения штриха, заливки и выделения преобразованного текста.
Пример установки разного цвета для штриха и заливки
Пример применения кисти к штриху
Пример применения кисти к штриху и выделению
Текст, преобразованный в объект Geometry, не является набором символов, для которого изменение символов в текстовой строке невозможно. Тем не менее, внешний вид преобразованного текста можно изменять с помощью свойств штриха и заливки. Штрих — это контур преобразованного текста, а заливка — область внутри контура преобразованного текста. Дополнительные сведения см. в разделе Практическое руководство. Вывод текста по контуру.
Можно также преобразовать форматированный текст в объект PathGeometry, который можно использовать для выделения текста. Например, можно применить анимацию к объекту PathGeometry так, что анимация будет следовать за контуром форматированного текста.
В следующем примере показан форматированный текст, который был преобразован в объект PathGeometry. Анимированный эллипс следует по пути штрихов отображенного текста.
Сфера, следующая по геометрическому пути текста
Дополнительные сведения см. в разделе Практическое руководство. Создание анимации PathGeometry для текста.
Можно создать другие интересные применения форматированного текста после преобразования его в объект PathGeometry. Например, можно вырезать видео для отображения внутри него. Дополнительные сведения см. в разделе Пример наложения текста на видео.
Отображение видео по геометрическому пути текста
Миграция Win32
Возможности FormattedText для рисования текста похожи на возможности функции Win32 DrawText. Для разработчиков, выполняющих задачи по миграции с Win32 API, в следующей таблице перечислены флаги Win32 DrawText и их приблизительные эквиваленты в Windows Presentation Foundation (WPF).
Флаг DrawText |
Эквивалент в WPF |
Примечания |
---|---|---|
DT_BOTTOM |
Используйте свойство Height для вычисления соответствующей y-позиции Win32 DrawText. |
|
DT_CALCRECT |
Используйте свойства Height и Width для вычисления выходного прямоугольника. |
|
DT_CENTER |
Используйте свойство TextAlignment со значением Center. |
|
DT_EDITCONTROL |
Нет |
Не требуется. Отрисовка последней строки и пустого места соответствует элементу управления редактированием в Framework. |
DT_END_ELLIPSIS |
Используйте свойство Trimming со значением CharacterEllipsis. Используйте WordEllipsis для получения DT_END_ELLIPSIS Win32 с заключительным многоточием DT_WORD_ELIPSIS. В этом случае знак многоточия отображается только в словах, которые не помещаются на одной строке. |
|
DT_EXPAND_TABS |
Нет |
Не требуется. Символы табуляции автоматически развертываются на четыре длинных пробела, что по ширине приблизительно равно восьми независимым от языка символам. |
DT_EXTERNALLEADING |
Нет |
Не требуется. Внешнее межстрочное расстояние всегда включается в межстрочный интервал. Используйте свойство LineHeight для создания пользовательского межстрочного интервала. |
DT_HIDEPREFIX |
Нет |
Не поддерживается. Удалите знак «&» из строки перед созданием объекта FormattedText. |
DT_LEFT |
Это выравнивание текста по умолчанию. Используйте свойство TextAlignment со значением Left. (Только для WPF) |
|
DT_MODIFYSTRING |
Нет |
Не поддерживается. |
DT_NOCLIP |
Отсечение не происходит автоматически. Чтобы вырезать текст, используйте свойство VisualClip. |
|
DT_NOFULLWIDTHCHARBREAK |
Нет |
Не поддерживается. |
DT_NOPREFIX |
Нет |
Не требуется. Знак «&» в строке всегда рассматривается как обычный символ. |
DT_PATHELLIPSIS |
Нет |
Используйте свойство Trimming со значением WordEllipsis. |
DT_PREFIX |
Нет |
Не поддерживается. Чтобы использовать подчеркивание текста, например для клавиш быстрого вызова или ссылок, используйте метод SetTextDecorations. |
DT_PREFIXONLY |
Нет |
Не поддерживается. |
DT_RIGHT |
Используйте свойство TextAlignment со значением Right. (Только для WPF) |
|
DT_RTLREADING |
Установите для свойства FlowDirection значение RightToLeft. |
|
DT_SINGLELINE |
Нет |
Не требуется. Объекты FormattedText используются как однострочные элементы управления до тех пор, пока не установлено свойство MaxTextWidth или в тексте не встречается символ возврата каретки или перевода строки (CR/LF). |
DT_TABSTOP |
Нет |
Не поддерживается для пользовательских позиций табуляции. |
DT_TOP |
Не требуется. По умолчанию используется выравнивание по верхнему краю. Другие значения вертикального расположения могут определяться с помощью свойства Height для вычисления соответствующей y-позиции Win32 DrawText. |
|
DT_VCENTER |
Используйте свойство Height для вычисления соответствующей y-позиции Win32 DrawText. |
|
DT_WORDBREAK |
Нет |
Не требуется. Для объектов FormattedText перенос слов выполняется автоматически. Отключить эту функцию нельзя. |
DT_WORD_ELLIPSIS |
Используйте свойство Trimming со значением WordEllipsis. |
См. также
Задачи
Пример наложения текста на видео
Практическое руководство. Вывод текста по контуру
Основные понятия
Документы в Windows Presentation Foundation
Типография в Windows Presentation Foundation
Практическое руководство. Создание анимации PathGeometry для текста