Compartir a través de


Enumeración de las fuentes instaladas

En algunos casos, una aplicación debe poder enumerar las fuentes disponibles y seleccionar la más adecuada para una operación determinada. Una aplicación puede enumerar las fuentes disponibles llamando a la función EnumFonts o EnumFontFamilies . Estas funciones envían información sobre las fuentes disponibles a una función de devolución de llamada que proporciona la aplicación. La función de devolución de llamada recibe información en las estructuras LOGFONT y NEWTEXTMETRIC . (La estructura NEWTEXTMETRIC contiene información sobre una fuente TrueType. Cuando la función de devolución de llamada recibe información sobre una fuente que no es TrueType, la información se incluye en una estructura TEXTMETRIC ). Al usar esta información, una aplicación puede limitar las opciones del usuario solo a las fuentes que están disponibles.

La función EnumFontFamilies es similar a la función EnumFonts , pero incluye alguna funcionalidad adicional. EnumFontFamilies permite que una aplicación aproveche los estilos disponibles con fuentes TrueType. Las aplicaciones nuevas y actualizadas deben usar EnumFontFamilies en lugar de EnumFonts.

Las fuentes TrueType se organizan en torno a un nombre de letra (por ejemplo, Courier New) y nombres de estilo (por ejemplo, cursiva, negrita y extra negrita). La función EnumFontFamilies enumera todos los estilos asociados a un nombre de familia especificado, no solo los atributos en negrita y cursiva. Por ejemplo, cuando el sistema incluye una fuente TrueType denominada Courier New Extra-Bold, EnumFontFamilies la enumera con las otras fuentes Courier New. Las funcionalidades de EnumFontFamilies son útiles para fuentes con muchos o estilos inusuales y para fuentes que cruzan fronteras internacionales.

Si una aplicación no proporciona un nombre de tipo de letra, las funciones EnumFonts y EnumFontFamilies proporcionan información sobre una fuente de cada familia disponible. Para enumerar todas las fuentes de un contexto de dispositivo, la aplicación puede especificar NULL para el nombre del tipo de letra, compilar una lista de los tipos de letra disponibles y, a continuación, enumerar cada fuente en cada tipo de letra.

En el ejemplo siguiente se usa la función EnumFontFamilies para recuperar el número de familias de fuentes raster, vector y TrueType disponibles.

    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 ); 
} 

En este ejemplo se usan dos máscaras, RASTER_FONTTYPE y TRUETYPE_FONTTYPE, para determinar el tipo de fuente que se enumera. Si se establece el bit de RASTER_FONTTYPE, la fuente es una fuente ráster. Si se establece el bit de TRUETYPE_FONTTYPE, la fuente es una fuente TrueType. Si no se establece ninguno de los bits, la fuente es una fuente vectorial. Una tercera máscara, DEVICE_FONTTYPE, se establece cuando un dispositivo (por ejemplo, una impresora láser) admite la descarga de fuentes TrueType; es cero si el dispositivo es un adaptador de pantalla, una impresora de matriz de puntos u otro dispositivo ráster. Una aplicación también puede usar la máscara de DEVICE_FONTTYPE para distinguir las fuentes ráster proporcionadas por GDI de fuentes proporcionadas por el dispositivo. El sistema puede simular atributos de negrita, cursiva, subrayado y tachado para fuentes ráster proporcionadas por GDI, pero no para fuentes proporcionadas por el dispositivo.

Una aplicación también puede comprobar los bits 1 y 2 en el miembro tmPitchAndFamily de la estructura NEWTEXTMETRIC para identificar una fuente TrueType. Si el bit 1 es 0 y 2 es 1, la fuente es una fuente TrueType.

Las fuentes vectoriales se clasifican como OEM_CHARSET en lugar de ANSI_CHARSET. Algunas aplicaciones identifican fuentes vectoriales mediante esta información, comprobando el miembro tmCharSet de la estructura NEWTEXTMETRIC . Esta categorización normalmente impide que el asignador de fuentes elija fuentes vectoriales a menos que se soliciten específicamente. (La mayoría de las aplicaciones ya no usan fuentes vectoriales porque sus trazos son líneas únicas y tardan más en dibujarse que las fuentes TrueType, que ofrecen muchas de las mismas características de escalado y rotación que requieren fuentes vectoriales).