Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
91
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

2. Логические шрифты Создание логических шрифтов

Разрабатывая изобразительные детали приложения, естественно воспользоваться богатыми возможностями, предоставляемыми системой Windows в части шрифтового оформления документов. Для того чтобы создать красивый и наглядный документ или экранный кадр, приходится использовать шрифты с различным начертанием, оформлением (курсив, жирный, подчеркнутый), размером и пространственной ориентацией. В зависимости от принципа хранения в памяти компьютера формы символов различают растровые (точечные) и масштабируемые шрифты, которые еще называют шрифтами TrueType. Достоинство шрифтов TrueType заключается в том, что они позволяют изменять в широких пределах раз­мер и другие характеристики символов (например, ширину букв) без снижения качества изображения, что и обусловило их широкое применение.

Операционная система Windows поставляется с базовым набором растровых и масштабируемых шрифтов с разнообразными начертаниями и характеристиками. Среди них имеются как шрифты с равной шириной всех символов (они традиционно используются, например, в исходных текстах программ), так и более приятные для глаза пропорциональные шрифты, у которых ширина символа зависит от его формы (буква “Ш”, например, шире символа “1”). Многие прикладные программы при их установке расширяют базовый набор Windows, добавляя свои шрифты; наконец, можно приобрести и установить в системе наборы шрифтов независимых разработчиков.

Работая с какой-либо коммерческой прикладной программой, использующей шрифты, например с текстовым редактором MicrosoftWordили графическим редакторомCorelDraw, пользователь может выбирать для оформления документа любые шрифты из установленных в системе, назначая им требуемые характеристики (размер, интервал между символами и строками т. д.) с помощью средств используемого редактора. Сложнее обстоит дело при разработке собственного приложения Windows. На экран можно вывести только тот шрифт, дескриптор которого загружен в контекст устройства; при необходимости изменить характеристики шрифта надо сначаласоздатьновый шрифт, хотя под этим обманчивым термином понимается не разработка собственного шрифта, а выбор одного из шрифтов, установленных в системе, и придание ему требуемых характеристик.

Правда, в системе имеется несколько готовых шрифтов, дескрипторы которых можно получить со “склада” Windows с помощью макроса SelectFont()или обобщенной функцииSelect­Object(). Дескриптор одного из них по умолчанию загружается в контекст устройства при его создании. Однако возможности таких шрифтов ограничены, так как они не допускают изменения своих характеристик (кроме цвета).

Процедура создания нового шрифта довольно проста. Для этого нужно объявить в программе структурную переменную типа LOGFONT, заполнить ее поля требуемыми значениями и вызвать функцию WindowsCreateFontIndirect(). Эта функция вернет дескриптор нового шрифта; после выбора полученного дескриптора в контекст устройства любая функция вывода на экран текста будет использовать именно этот шрифт. Если в приложении желательно использовать разные шрифты, их можно создать заранее и выбирать в контекст устройства по мере необходимости. ФункцияCreateFontIndirect()использует в качестве исходного материалафизический шрифт, хранящийся на диске в виде файла; результатом работы этой функции будетлогический шрифт, дескриптор которого и загружается в контекст устройства. Вывести на экран текст непосредственно физическим шрифтом нельзя, так как функции GDI работают только с логическими шрифтами. Даже если мы хотим иметь шрифт с характеристиками, в точности соответствующими физическому шрифту, все равно из него сначала надо образовать логический шрифт (обнулив все члены структурыLOGFONT, кроме имени шрифта) и лишь затем им пользоваться.

Структура LOGFONTсодержит много членов, однако обычно можно ограничиться заданием лишь небольшой их части. Следует только иметь в виду, что неправильная установка того или иного члена этой структуры может привести к весьма неприятным последствиям, так как Windows, не сумев создать в точности заказанный вами шрифт, будет пытаться подобрать наиболее подходящий; часто в этом случае подбирается шрифт, весьма далекий от заказанного.

Структуру LOGFONTцелесообразно использовать для задания характеристик масштабируемых (TrueType) шрифтов; только в этом случае будут действовать такие, например, характеристики шрифта, как угол наклона или размер (растровые шрифты допускают изменение размера, но лишь в обусловленных пределах или при низком качестве увеличения).

Структура LOGFONTимеет следующий состав членов:

typedef struct tagLOGFONT

int lfHeight;//Высота

int lfWidth;//Средняя ширина; если=0, то по умолчанию

int lfEscapement;//Угол наклона в единицах 1/10 градуса

int lfOrientation;//Не используется

intlfWeight;//Насыщенность: FW_NORMAL (нормальная),

FW_BOLD (полужирный шрифт)

BYTE lfItalic;//Если=1, то курсив

BYTE lfUnderline;//Если=1, то подчеркивание

BYTE lfStrikeOut;//Если=1, то перечеркивание

BYTE lfCharSet;//Набор символов; обычно=0

BYTE lfOutPrecision;//Точность соответствия; обычно=0

BYTE lfClipPrecision;//Способ вырезки части символа;

//обычно=0

BYTE lfQuality;//Качество; обычно=0

BYTE lfPitchAndFamily;//Шаг и семейство; обычно=0

BYTE lfFaceName[LF_FACESIZE];//Имя начертания шрифта

} LOGFONT;

Наиболее важным является последний член описанной выше структуры, символьный массив lfFaceName. В него надо скопировать полное имя шрифта из числа шрифтов, установленных в Windows, напримерTimes New Roman Cyr,Arial Cyr,Cou­rier New Cyrи т. д. Если в имени шрифта будет допущена хотя бы незначительная ошибка, Windows, скорее всего, создаст шрифт с совершенно другим начертанием. Обратите также внимание на то, что членlfFaceNameописан в структуреLOGFONT, как символьный массив длинойLF_FACESIZEсимволов. В эту переменную следует занести не адрес имени шрифта, а саму символьную строку с именем шрифта. Поэтому этот член нельзя инициализировать оператором присваивания; придется воспользоваться функцией C++strcpy()для копирования строк.

После того, как новые шрифты использованы для вывода на экран текстовых строк и необходимость в них отпала, их следует удалить, чтобы освободить занимаемую ими память. Это можно сделать и перед завершением приложения в функции OnDe­stroy()обработки сообщенияWM_DESTROYс помощью макросаDeleteFont() или обобщенной функцииDeleteObject(). Практически при завершении приложения Windows удаляет все созданные в нем объекты.