|
Программирование >> Вывод графики
Строго говоря, измерение высоты шрифта не так-то просто, потому что существует несколько разных высот, которсе следует учитывать. Например, есть высота заглавных букв, таких как A или F (именно об их высоте идет речь, когда говорят о высоте шрифта), есть дополнительная высота, занятая знаками акцентирования в таких буквах, как А или N, а также дополнительная высота под базовой линией, необходимая для отображения букв вроде y или q. Однако в этой главе мы не будем обращать внимание на это. Когда вы указываете семейство шрифтов и основную высоту, то все остальные высоты определяются автоматически. Имея дело со шрифтами, можно столкнуться также с другими часто используемыми терминами, описывающими определенные их семейства. □ Serif - это семейство шрифтов характеризуется наличием на многих кончиках букв небольших засечек (эти засечки и называются serif). Классический пример такого шрифта - Times New Roman. □ Sans serif - в отличие от предыдущего семейства, засечек не имеет. Хорошим примером могут служить шрифты Arial или Verdana. Отсутствие засечек часто делает текст резким, бросающимся в глаза, поэтому часто такие шрифты используются для выделения наиболее важного текста. □ True Type - семейство шрифтов, символы которых точно описываются математически как состоящие из отрезков прямых и кривых линий. Это значит, что одно и то же определение может быть использовано для вычисления отображения шрифтов любого размера в пределах семейства. В наше время почти все шрифты, которые вы можете применять, относятся к этой группе. Только некоторые старые семейства шрифтов, унаследованные еще от Windows 3.1, определены как отдельные битовые изображения для каждого символа каждого из возможных размеров. Использовать их в настоящее время не рекомендуется. Для выбора и манипуляций шрифтами Microsoft предоставляет два основнгх класса: □ System.Drawing.Font □ System.Drawing.FontFamily Вы уже видели основное применение класса Font. Когда требуется нарисовать текст, создается экземпляр Font и передается методу DrawString() для указания того, как он должен быть нарисован. Экземпляр FontFamily используется для представления семейства шрифтов. Один из случаев применения класса FontFamily - это когда вам известно, какой нужен шрифт определенного типа (Serif, Sans Serif или Monospace), но не известно конкретное семейство. Статические свойства GenericSerif, GenericSansSerif и GenericMonospace возвращают шрифты по умолчанию, удовлетворяющие заданным критериям: FontFamily sansSerifFont = FontFamily.GenericSansSerif; Вообще говоря, если вы разрабатываете профессиональное приложение, то вам следует выбирать шрифты более изощренным способом. Скорее всего, вы реализуете код рисования так, чтобы он проверял доступные семейства шрифтов и выбирал из них наиболее подходящие - возможно, выбирая первый доступный из списка предпочитаемых. И если вы хотите, чтобы ваше приложение было дружественным к пользователю, то первым выбором в списке должен быть тот шрифт, который пользователь выбирал во время предыдущего запуска приложения. Обычно, если вы имеете дело с наиболее популярными семействами шрифтов, такими как Arial и Times New Roman, то вы - в безопасности. Однако если вы пытаетесь отобразить текст, используя не- существующие шрифты, результат не всегда предсказуем, и, скорее всего, вы обнаружите, что операционная система Windows самостоятельно подставляет вместо них стандартный системный шрифт, который ей очень легко отображать, но который выглядит не особенно привлекательно - и когда он появится в документе, у пользователя возникнет впечатление, что он имеет дело с программным обеспечением низкого качества. Для того чтобы получить список доступных в системе шрифтов, необходимо воспользоваться классом InstalledFontCollection, определенным в пространстве имен System.Drawing.Text. Этот класс реализует свойство Families, представляющее собой массив всех шрифтов, доступных в системе: InstalledFontCollection insFont = new InstalledFontCollection(); FontFamily [] families = insFont.Families; foreach (FontFamily family in families) выполнить обработку с даннхм семейством шрифтов Пример: перечисление семейств шрифтов В этом разделе мы разработаем небольшой пример EnumFontFamilies, который перечислит все семейства шрифтов, доступные в системе, и проиллюстрирует их, отображая имя каждого семейства с помощью соответствующего шрифта (в его стандартной 10-точечной версии). На рис. 33.16 показан результат выполнения этого примера. Естественно, конкретный результат, который вы получите на своем компьютере, зависит от перечня установленных у вас шрифтов. Как обычно, для этого примера создадим Windows-приложение на C# под названием EnumFontFamilies. Начнем с добавления ссылки на необходимое пространство имен. Мы будем использовать класс InstalledFontCollection, который определен в System.Drawing.Text: using System.Drawing; using System.Drawing.Text; using System.Windows.Forms; Затем добавим следующую константу в класс Form1: private const int margin = 10; margin - это размер левого и верхнего отступов текста Рис 33.16. Результат от края документа; он предотвращает появление текста выполнения примера прямо на границе клиентской области. EnumFontFamilies Этот пример предназначен для простого и быстрого показа наименований семейств шрифтов, поэтому код его достаточно сырой и во многих отношениях работает не так, как должно работать реальное приложение. Например, здесь мы жестко кодируем предполагаемый размер документа (200,1500) и устанавливаем это значение свойству AutoScrollMinSize в окне свойств интегрированной среды разработки Visual Studio 2008. По большому счету следовало бы проверить размер отображаемого текста, чтобы определить реальный размер документа. Это мы сделаем в следующем разделе. Вот метод OnPaint() : protected override void OnPaint(PaintEventArgs e) base.OnPaint(e); int verticalCoordinate = margin; Point topLeftCorner; InstalledFontCollection insFont = new InstalledFontCollection(); FontFamily [] families = insFont.Families; e.Graphics.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y); foreach (FontFamily family in families) if (family.IsStyleAvailable(FontStyle.Regular)) Font f = new Font(family.Name, 12); Point topLeftCorner = new Point(margin, verticalCoordinate); verticalCoordinate += f.Height; e.Graphics.DrawString (family.Name, f, Brushes.Black,topLeftCorner); f.Dispose(); Код начинается с использования объекта InstalledFontCollection для получения массива, содержащего всю информацию относительно доступных семейств шрифтов. Для каждого семейства создается экземпляр 12-точечного шрифта. Для этого применяется самый простой конструктор Font (существует множество других с дополнительными опциями). Этот конструктор принимает два параметра - имя семейства и размер шрифта: Font f = new Font(family.Name, 12); Конструктор создает шрифт стандартного стиля. Чтобы подстраховаться, однако, сначала мы проверяем, существует ли шрифт такого стиля в каждом из семейств, прежде чем пытаться что-то выводить с помощью этого шрифта. Проверка осуществляется с помощью метода FontFamily.IsStyleAvailable(). Проверка важна, потому что не все шрифты представлены во всех стилях: if (family.IsStyleAvailable(FontStyle.Regular)) FontFamily.IsStyleAvailable() принимает один параметр - перечисление FontStyle. Перечисление содержит множество флагов, которые могут быть скомбинированы битовой операцией ИЛИ . Возможные флаги таковы: Bold, Italic, Regular, Strikeout и Underline. И, наконец, обратите внимание на использование свойства Height класса Font, которое возвращает высоту отображения текста в данном шрифте, чтобы определить пропуск между строками: Font f = new Font(family.Name, 12); Point topLeftCorner = new Point(margin, verticalCoordinate); verticalCoordinate += f.Height; Опять-таки, для простоты в этой версии OnPaint() допущены некоторые примеры плохого стиля программирования. Например, мы не заботимся о проверке того, какая именно часть документа нуждается в перерисовке - мы просто отображаем все подряд. Вдобавок к этому создание экземпляра Font, как отмечалось ранее - достаточно дорогостоящий по используемым ресурсам процесс, поэтому нам стоило бы сохранять шрифты, а не создавать их новые копии при каждом вызове OnPaint(). В результате всех этих небрежностей можно заметить, что данный пример приложения требует заметного времени для того, чтобы перерисовать себя. Дабы сэкономить
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |