Учебное пособие: Семейства шрифтов в Windows
CF_NOFACESEL нельзя выбирать имя шрифта из списка
CF_NOSIMUALTIONS запрещена имитация шрифта с помощью GDI
CF_NOSIZESEL нельзя выбирать размер шрифта
CF_NOSTYLESEL нельзя выбирать стиль шрифта.
Дополнительные возможности этой функции связаны с возможностью видоизменять сам диалог, (в том числе самостоятельно спроектировать шаблон диалога), и функцию диалога, для выполнения дополнительных действий.
2. Шрифты в качестве ресурсов
2.1 Применение шрифтовых ресурсов
Сейчас мы рассмотрим последнюю тему, связанную со шрифтами, а именно - создание собственных шрифтовых ресурсов. Ранее мы встречались с одной из разновидностей ресурсов - битмапом. Тогда битмап включался в ресурс и становился доступным приложению. Для этого мы в файле описания ресурсов включали строку вида:
name BITMAP “file.bmp”
По аналогии хочется поступить также и со шрифтом, тем более, что существует такой вид ресурсов - FONT. Однако этот метод не работает. Это связано с тем, что все шрифты в Windows доступны всем приложениям. В этом случае включать шрифт в приложение становиться невозможным - так как в момент его завершения шрифт может использоваться другим приложением. Поэтому шрифтовые ресурсы в Windows оформляются в виде отдельных файлов.
Так как шрифты доступны всем приложениям, то мы сначала должны включить свой шрифт в системную таблицу шрифтов. При этом шрифт становится доступным всем приложениям Windows (в том числе и нашему). Теперь мы можем вызвать функцию CreateFont() или CreateFontIndirect() для получения хендла шрифта, а в конце работы, после уничтожения созданного шрифта, мы должны удалить его из системной таблицы.
В некоторых случаях может быть удобным добавление шрифта в список шрифтов, автоматически попадающих в системную таблицу при запуске Windows. Для этого Вы должны добавить строку в файл WIN.INI, секция [fonts] (как это делается - позже, когда будем рассматривать настройку приложений). При этом все последующие запуски Windows будет автоматически добавлять Ваш шрифт в системную таблицу. Однако в текущем сеансе этого автоматически не происходит, так что Вы должны сами добавить его в таблицу.
Для включения шрифта в системную таблицу надо воспользоваться функцией:
int AddFontResource( lpszFileName );
возвращаемое значение указывает число шрифтов, добавленных в системную таблицу из этого файла, значение 0 указывает на ошибку.
Обычно шрифтовые файлы имеют расширение .FON; Такой файл может содержать несколько шрифтов с общим именем, но разными размерами символов. Windows будет использовать шрифт того размера, который наиболее точно подходит к запрашиваемому.
Если добавленный шрифт не предназначен строго для внутреннего использования, то Вы должны послать всем приложениям сообщение о смене шрифта:
SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0L );
Для удаления шрифта из системной таблицы Вы должны воспользоваться функцией
BOOL RemoveFontResource( lpszFileName );
Как и при добавлении шрифта, если этот шрифт может применяться другими приложениями, то Вы должны послать сообщение WM_FONTCHANGE.
Добавлять или удалять шрифты из системной таблицы удобно либо в начале и конце приложения, либо при создании и удалении главного окна приложения.
2.2 Создание шрифтовых ресурсов
В этом разделе мы будем говорить только о создании собственных растровых шрифтовых ресурсов. Это связано с тем, что стандартные редакторы шрифтовых ресурсов (включаемые в SDK и компиляторы) позволяют создавать только растровые шрифты.
Для начала мы должны нарисовать требуемые нам шрифты с помощью какого-либо редактора ресурсов. Растровые шрифты обычно размещаются в файлах с расширением .FNT (это не шрифтовой файл, а отдельный ресурс, как, скажем, битмап). Нам может понадобится нарисовать несколько шрифтов разного размера, но имеющих общее начертание. Эти шрифты будут сохранены в разных .FNT файлах.
Далее мы должны построить шрифтовой файл .FON, содержащий наши шрифты. Этот файл являться библиотекой ресурсов. Практически он оформлен как обычное Windows приложение, которое содержит только ресурсы. Мы можем описать такое приложение, как приложение вообще не имеющее сегмента кода, или как библиотеку.
Так как наша библиотека должна содержать шрифтовые ресурсы, то мы должны задать файл описания ресурсов .RC, содержащий список нарисованных нами шрифтов, например:
1 FONT fonta.fnt
2 FONT fontb.fnt