Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
108
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Манипулирование шрифтами

Теперь давайте выясним, как можно программно манипулировать шрифтами. Тип System.Drawing.Font представляет шрифт, установленный на машине пользователя, Типы шрифта могут определяться с помощью любого числа перегруженных конструкторов. Вот вам несколько примеров.

// Создание Font с заданными именем типа и размером.

Font f = new Font("Times New Roman", 12);

// Создание Font, с заданными именем типа, размером и начертанием.

Font f2 = new Font("WingDings", 50, FontStyle.Bold | FontStyle.Underline);

При создании f2 здесь используются связанные с помощью операции OR значения из перечня FontStyle.

public enum FontStyle {

 Regular, Bold,

 Italic, Underline, Strikeout

}

После установки параметров объекта Font следующей вашей задачей должна быть передача этого объекта методу Graphics.DrawString() в виде параметра. Хотя метод DrawString() перегружен, каждая из его вариаций требует одну и ту же информацию: отображаемый текст, шрифт для отображения этого текста, кисть, с помощью которой выполняется визуализация, и место, в которое нужно текст поместить.

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 // Аргументы (String, Font, Brush, Point).

 g.DrawString("Моя строка", new Font("WingDings", 25), Brushes.Black, new Point(0,0));

 // Аргументы (String, Font, Brush, int, int)

 g.DrawString("Другая строка", new Font("Times New Roman", 16), Brushes.Red, 40, 40);

}

Работа с семействами шрифтов

Пространство имен System.Drawing определяет также тип FontFamily, предлагающий абстракцию для группы гарнитур, имеющих одинаковый базовый дизайн, но с определенными вариациями стиля. Семейство шрифтов, например, такое как Verdana, может включить в себя несколько шрифтов, отличающихся по стилю и размеру. Например, Verdana Bold (полужирный) 12 пунктов и Verdana Italic (курсив) 24 пункта являются разными шрифтами в рамках одного семейства шрифтов Verdana.

Конструктор типа FontFamily получает на вход строку с именем семейства шрифтов, которое вы пытаетесь представить. После создания "общего семейства" вы можете создать более специфичный объект Font.

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 // Создание семейства шрифтов.

 FontFamily myFamily = new FontFamilу("Verdana");

 // Передача семейства конструктору Font.

 Font myFont = new Font(myFamily, 12);

 g.Drawstring("Привет!", myFont, "Brushes.Blue, 1010);

}

Больший интерес представляет собой возможность сбора статистики в отношении данного семейства шрифтов. Скажем, вы создаете приложение текстового редактора и хотите определить среднюю ширину символа в конкретном объекте FontFamily. Или, например, вам нужна информация о надстрочных и подстрочных значениях для данного символа. Для получения такой информации тип FontFamily предлагает использовать специальные члены, описания которых приведены в табл. 20.5.

Таблица 20.5. Члены типа FontFamily

Член

Описание

GetCellAscent()

Возвращает метрику надстрочного элемента для членов данного семейства

SetCellDescent()

Возвращает метрику подстрочного элемента для членов данного семейства

GetLineSpacing()

Возвращает расстояние между двумя последовательными строками текста для данного FontFamily с указанным FontStyle

GetName()

Возвращает имя данного FontFamily на указанном языке

IsStyleAvailable()

Индикатор доступности указанного FontStyle

Для примера рассмотрите следующий обработчик события Paint, выводящий на печать ряд характеристик семейства шрифтов Verdana.

private void MainForm_Paint(object sender, PaintEventArgs e) {

 Graphics g e.Graphics;

 FontFamily myFamily = new FontFamily("Verdana");

 Font myFont = new Font(myFamily, 12);

 int у = 0;

 int fontHeight = myFont.Height;

 // Отображение единицы измерения для членов FontFamily.

 this.Text = "Единица измерения: GraphicsUnit." + myFont.Unit;

 g.DrawString("Семейство Verdana.", myFont, Brushes.Blue, 10, y);

 у += 20;

 // Характеристики связей нашего семейства.

 g.DrawString("Надстрочные для Verdana Bold: " + myFamily.GetCellAscent(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);

 у += 20;

 g.DrawString("Подстрочные для Verdana Bold: " + myFamily.GetCellDescent(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);

 у += 20;

 g.DrawString("Интерлиньяж для Verdana Bold: " + myFamily.GetLineSpacing(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);

 у += 20;

 g.DrawString("Высота для Verdana Bold: " + myFamily.GetEmHeight(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);

 у += 20;

}

На рис. 20.8 показан результат.

Рис. 20.8. Сбор статистики для семейства шрифтов Verdana

Заметьте, что указанные члены типа Font Family возвращают значения с использованием в качестве единицы измерения GraphicsUnit.Point (а не Pixel), что соответствует 1/72 дюйма. Вы можете преобразовать эти значения в те единицы, которые вам подходят лучше всего.

Исходный код. Проект FontFamilyApp размещен в подкаталоге, соответствующем главе 20.