В некоторых случаях, приложение должно получить возможность перечислить доступные шрифты и выбрать еще один подходящий для конкретной операции. Приложение может перечислять доступные шрифты путем вызова функции EnumFonts или EnumFontFamilies. Эти функции отправляют информацию о доступных шрифтах в функцию повторного вызова, которую предоставляет приложение. Функция повторного вызова получает информацию в структурах LOGFONT и NEWTEXTMETRIC. (Структура NEWTEXTMETRIC содержит информацию о масштабируемом (TrueType) шрифте. Когда функция повторного вызова получает информацию о шрифте не - TrueType, она содержится в структуре TEXTMETRIC.) При помощи использования этой информации, приложение может ограничивать выбор пользователя только теми шрифтами, которые являются доступными.
Функция EnumFontFamilies походит на функцию EnumFonts, но включает в себя некоторые дополнительные возможности. Функция EnumFontFamilies дает возможность приложению воспользоваться преимуществом стилей, доступных масштабируемым шрифтам TrueType. Новые и модернизированные прикладные программы должны использовать EnumFontFamilies вместо EnumFonts
Масштабируемые шрифты TrueType объединены вокруг имени гарнитуры шрифта (например, Courier New) и названия стиля (например, курсив, полужирный, и жирный). Функция EnumFontFamilies перечисляет все стили, связанные с заданным именем семейства, а не просто полужирные и курсивные атрибуты. Например, когда система включает в себя масштабируемый шрифт TrueType , по имени Courier New Extra-Bold, функция EnumFontFamilies вносит в список его с другим шрифтом Courier New. Возможности EnumFontFamilies полезны для шрифтов с многими или необычными стилями и для шрифтов, которые выходят за международные рамки.
Если приложение не предоставляет имя гарнитуры шрифта, функции EnumFonts и EnumFontFamilies предоставляют информацию об одном шрифте в каждом доступном семействе. Чтобы перечислить все шрифты в контексте устройства, приложение может задать значение ПУСТО (NULL) для имени гарнитуры шрифта, компилировать список доступных гарнитур шрифта, а затем перечислить каждый шрифт в каждой гарнитуре шрифта.
Нижеследующий пример использует функцию EnumFontFamilies, чтобы извлечь число доступных растровых, векторных и масштабируемых TrueType семейств шрифта.
UINT uAlignPrev; int aFontCount[] = { 0, 0, 0 }; char szCount[8]; EnumFontFamilies(hdc, (LPCTSTR) NULL, (FONTENUMPROC) EnumFamCallBack, (LPARAM) aFontCount); uAlignPrev = SetTextAlign(hdc, TA_UPDATECP); MoveToEx(hdc, 10, 50, (LPPOINT)NULL); TextOut(hdc, 0, 0, "Number of raster fonts: ", 24); itoa(aFontCount[0], szCount, 10); TextOut(hdc, 0, 0, szCount, strlen(szCount)); MoveToEx(hdc, 10, 75, (LPPOINT)NULL); TextOut(hdc, 0, 0, "Number of vector fonts: ", 24); itoa(aFontCount[1], szCount, 10); TextOut(hdc, 0, 0, szCount, strlen(szCount)); MoveToEx(hdc, 10, 100, (LPPOINT)NULL); TextOut(hdc, 0, 0, "Number of TrueType fonts: ", 26); itoa(aFontCount[2], szCount, 10); TextOut(hdc, 0, 0, szCount, strlen(szCount)); SetTextAlign(hdc, uAlignPrev); BOOL CALLBACK EnumFamCallBack(LPLOGFONT lplf, LPNEWTEXTMETRIC lpntm, DWORD FontType, LPVOID aFontCount) { int far * aiFontCount = (int far *) aFontCount; // Запишем число растровых, TrueType и векторных //
шрифтов в массиве подсчета шрифтов. |
Этот пример использует две маски, RASTER_FONTTYPE и TRUETYPE_FONTTYPE, чтобы выяснять тип перечисляемого шрифта. Если установлен бит RASTER_FONTTYPE , шрифт - растровый шрифт. Если установлен бит TRUETYPE_FONTTYPE, шрифт - масштабируемый шрифт TrueType. Если никакой бит не установлен, то это - векторный шрифт. Третья маска, DEVICE_FONTTYPE, устанавливается тогда, когда устройство (например, лазерный принтер) поддерживает загружающиеся масштабируемые шрифты TrueType; она обнуляется, если устройство - адаптер дисплея, матричный принтер, или другое растровое устройство. Приложение может также использовать маску DEVICE_FONTTYPE, чтобы различать поставляемые GDI растровые шрифты от поставляемых устройством шрифтов. Система может моделировать полужирный, курсивный, подчеркнутые, и зачеркнутые атрибуты для поставляемых GDI растровых шрифтов, но не для шрифтов поставляемых устройством.
Приложение может также проверить биты 1 и 2 в члене tmPitchAndFamily структуры NEWTEXTMETRIC, чтобы идентифицировать масштабируемый шрифт TrueType . Если бит 1 - 0, а бит 2 - 1, шрифт - масштабируемый TrueType.
Векторные шрифты классифицируются как OEM_CHARSET вместо ANSI_CHARSET. Некоторые прикладные программы идентифицируют векторные шрифты при помощи использования этой информации, проверяя член tmCharSet структуры NEWTEXTMETRIC. Эта классификация обычно не допускает механизм отображения логического шрифта в физический при выборе векторных шрифтов, если они специально не требуются. (Большинство прикладных программ больше не использует векторные шрифты, потому что их линии буквы - одиночные линии, и они рисуются дольше, чем рисуются масштабируемые шрифты TrueType, которые предлагают многое из тех же самых функций масштабирования и прокрутки, которые требовались для векторных шрифтов.)