Перечисление установленных шрифтов

В некоторых случаях, приложение должно получить возможность перечислить доступные шрифты и выбрать еще один подходящий для конкретной операции. Приложение может перечислять доступные шрифты путем вызова функции 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 и векторных

    // шрифтов в массиве подсчета шрифтов. 
 
    if (FontType & RASTER_FONTTYPE) 
        aiFontCount[0]++
    else if (FontType & TRUETYPE_FONTTYPE) 
        aiFontCount[2]++
    else  
        aiFontCount[1]++
 
    if (aiFontCount[0] || aiFontCount[1] || aiFontCount[2]) 
        return TRUE; 
    else  
        return FALSE; 
 
    UNREFERENCED_PARAMETER( lplf ); 
    UNREFERENCED_PARAMETER( lpntm ); 
} 

Этот пример использует две маски, 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, которые предлагают многое из тех же самых функций масштабирования и прокрутки, которые требовались для векторных шрифтов.)

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz