Enumerando as fontes instaladas

Em alguns casos, um aplicativo deve ser capaz de enumerar as fontes disponíveis e selecionar a mais apropriada para uma operação específica. Um aplicativo pode enumerar as fontes disponíveis chamando a função EnumFonts ou EnumFontFamilies . Essas funções enviam informações sobre as fontes disponíveis para uma função de retorno de chamada fornecida pelo aplicativo. A função de retorno de chamada recebe informações nas estruturas LOGFONT e NEWTEXTMETRIC . (A estrutura NEWTEXTMETRIC contém informações sobre uma fonte TrueType. Quando a função de retorno de chamada recebe informações sobre uma fonte não TrueType, as informações estão contidas em uma estrutura TEXTMETRIC .) Usando essas informações, um aplicativo pode limitar as opções do usuário apenas às fontes disponíveis.

A função EnumFontFamilies é semelhante à função EnumFonts , mas inclui algumas funcionalidades extras. EnumFontFamilies permite que um aplicativo aproveite os estilos disponíveis com fontes TrueType. Aplicativos novos e atualizados devem usar EnumFontFamilies em vez de EnumFonts.

As fontes TrueType são organizadas em torno de um nome de tipo (por exemplo, Courier New) e nomes de estilo (por exemplo, itálico, negrito e extrarrojado). A função EnumFontFamilies enumera todos os estilos associados a um nome de família especificado, não apenas os atributos negrito e itálico. Por exemplo, quando o sistema inclui uma fonte TrueType chamada Courier New Extra-Bold, EnumFontFamilies a lista com as outras fontes Courier New. Os recursos de EnumFontFamilies são úteis para fontes com muitos estilos ou estilos incomuns e para fontes que cruzam fronteiras internacionais.

Se um aplicativo não fornecer um nome de tipo, as funções EnumFonts e EnumFontFamilies fornecerão informações sobre uma fonte em cada família disponível. Para enumerar todas as fontes em um contexto de dispositivo, o aplicativo pode especificar NULL para o nome da face de tipo, compilar uma lista das faces de tipo disponíveis e enumerar cada fonte em cada typeface.

O exemplo a seguir usa a função EnumFontFamilies para recuperar o número de famílias de fontes raster, vetor e TrueType disponíveis.

    UINT uAlignPrev; 
    int aFontCount[] = { 0, 0, 0 }; 
    char szCount[8];
        HRESULT hr;
        size_t * pcch; 
 
    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); 
        
        hr = StringCchLength(szCount, 9, pcch);
        if (FAILED(hr))
        {
        // TODO: write error handler 
        }
    TextOut(hdc, 0, 0, szCount, *pcch); 
 
    MoveToEx(hdc, 10, 75, (LPPOINT)NULL); 
    TextOut(hdc, 0, 0, "Number of vector fonts: ", 24); 
    itoa(aFontCount[1], szCount, 10);
        hr = StringCchLength(szCount, 9, pcch);
        if (FAILED(hr))
        {
        // TODO: write error handler 
        } 
    TextOut(hdc, 0, 0, szCount, *pcch); 
 
    MoveToEx(hdc, 10, 100, (LPPOINT)NULL); 
    TextOut(hdc, 0, 0, "Number of TrueType fonts: ", 26); 
    itoa(aFontCount[2], szCount, 10);
        hr = StringCchLength(szCount, 9, pcch);
        if (FAILED(hr))
        {
        // TODO: write error handler 
        }
    TextOut(hdc, 0, 0, szCount, *pcch); 
 
    SetTextAlign(hdc, uAlignPrev); 
 
BOOL CALLBACK EnumFamCallBack(LPLOGFONT lplf, LPNEWTEXTMETRIC lpntm, DWORD FontType, LPVOID aFontCount) 
{ 
    int far * aiFontCount = (int far *) aFontCount; 
 
    // Record the number of raster, TrueType, and vector  
    // fonts in the font-count array.  
 
    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 ); 
} 

Este exemplo usa duas máscaras, RASTER_FONTTYPE e TRUETYPE_FONTTYPE, para determinar o tipo de fonte que está sendo enumerada. Se o RASTER_FONTTYPE bit estiver definido, a fonte será uma fonte raster. Se o TRUETYPE_FONTTYPE bit estiver definido, a fonte será uma fonte TrueType. Se nenhum dos bits estiver definido, a fonte será uma fonte vetor. Uma terceira máscara, DEVICE_FONTTYPE, é definida quando um dispositivo (por exemplo, uma impressora laser) dá suporte ao download de fontes TrueType; será zero se o dispositivo for um adaptador de exibição, uma impressora de matriz de pontos ou outro dispositivo raster. Um aplicativo também pode usar a máscara de DEVICE_FONTTYPE para distinguir fontes de raster fornecidas por GDI de fontes fornecidas pelo dispositivo. O sistema pode simular atributos negrito, itálico, sublinhado e strikeout para fontes de raster fornecidas por GDI, mas não para fontes fornecidas pelo dispositivo.

Um aplicativo também pode marcar bits 1 e 2 no membro tmPitchAndFamily da estrutura NEWTEXTMETRIC para identificar uma fonte TrueType. Se o bit 1 for 0 e o bit 2 for 1, a fonte será uma fonte TrueType.

Fontes vetoriais são categorizadas como OEM_CHARSET em vez de ANSI_CHARSET. Alguns aplicativos identificam fontes vetoriais usando essas informações, verificando o membro tmCharSet da estrutura NEWTEXTMETRIC . Essa categorização geralmente impede que o mapeador de fontes escolha fontes vetoriais, a menos que sejam solicitadas especificamente. (A maioria dos aplicativos não usa mais fontes de vetor porque seus traços são linhas únicas e levam mais tempo para serem desenhados do que fontes TrueType, que oferecem muitos dos mesmos recursos de escala e rotação que exigiam fontes de vetor.)