Freigeben über


Auflisten der installierten Schriftarten

In einigen Fällen muss eine Anwendung in der Lage sein, die verfügbaren Schriftarten aufzulisten und die für einen bestimmten Vorgang am besten geeignete Schriftart auszuwählen. Eine Anwendung kann die verfügbaren Schriftarten auflisten, indem sie die Funktion EnumFonts oder EnumFontFamilies aufruft . Diese Funktionen senden Informationen zu den verfügbaren Schriftarten an eine Rückruffunktion, die die Anwendung bereitstellt. Die Rückruffunktion empfängt Informationen in LOGFONT - und NEWTEXTMETRIC-Strukturen . (Die NEWTEXTMETRIC-Struktur enthält Informationen zu einer TrueType-Schriftart. Wenn die Rückruffunktion Informationen zu einer Nicht-TrueType-Schriftart empfängt, sind die Informationen in einer TEXTMETRIC-Struktur enthalten.) Mithilfe dieser Informationen kann eine Anwendung die Auswahlmöglichkeiten des Benutzers auf die verfügbaren Schriftarten beschränken.

Die EnumFontFamilies-Funktion ähnelt der EnumFonts-Funktion , enthält jedoch einige zusätzliche Funktionen. Mit EnumFontFamilies kann eine Anwendung die mit TrueType-Schriftarten verfügbaren Stile nutzen. Neue und aktualisierte Anwendungen sollten EnumFontFamilies anstelle von EnumFonts verwenden.

TrueType-Schriftarten sind um einen Schriftartnamen (z. B. Courier New) und Formatvorlagennamen (z. B. kursiv, fett und extra fett) angeordnet. Die EnumFontFamilies-Funktion listet alle Stile auf, die einem angegebenen Familiennamen zugeordnet sind, nicht nur die fetten und kursiv geschriebenen Attribute. Wenn das System beispielsweise eine TrueType-Schriftart namens Courier New Extra-Bold enthält, listet EnumFontFamilies sie mit den anderen Courier New-Schriftarten auf. Die Funktionen von EnumFontFamilies sind hilfreich für Schriftarten mit vielen oder ungewöhnlichen Stilen und für Schriftarten, die internationale Grenzen überschreiten.

Wenn eine Anwendung keinen Schriftartnamen angibt, geben die Funktionen EnumFonts und EnumFontFamilies Informationen zu einer Schriftart in jeder verfügbaren Familie an. Um alle Schriftarten in einem Gerätekontext aufzulisten, kann die Anwendung NULL für den Schriftartnamen angeben, eine Liste der verfügbaren Schriftarten kompilieren und dann jede Schriftart in jeder Schriftart aufzählen.

Im folgenden Beispiel wird die EnumFontFamilies-Funktion verwendet, um die Anzahl der verfügbaren Raster-, Vektor- und TrueType-Schriftfamilien abzurufen.

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

In diesem Beispiel werden zwei Masken verwendet, RASTER_FONTTYPE und TRUETYPE_FONTTYPE, um den Typ der aufgezählten Schriftart zu bestimmen. Wenn das RASTER_FONTTYPE Bit festgelegt ist, ist die Schriftart eine Rasterschriftart. Wenn das TRUETYPE_FONTTYPE Bit festgelegt ist, ist die Schriftart eine TrueType-Schriftart. Wenn kein Bit festgelegt ist, ist die Schriftart eine Vektorschriftart. Eine dritte Maske, DEVICE_FONTTYPE, wird festgelegt, wenn ein Gerät (z. B. ein Laserdrucker) das Herunterladen von TrueType-Schriftarten unterstützt. sie ist null, wenn es sich bei dem Gerät um eine Grafikkarte, einen Dot-Matrix-Drucker oder ein anderes Rastergerät handelt. Eine Anwendung kann auch die DEVICE_FONTTYPE-Maske verwenden, um von GDI bereitgestellte Rasterschriftarten von geräteseitig bereitgestellten Schriftarten zu unterscheiden. Das System kann Fett-, Kursiv-, Unterstrichen- und Streichattribute für von GDI bereitgestellte Rasterschriftarten simulieren, nicht jedoch für vom Gerät bereitgestellte Schriftarten.

Eine Anwendung kann auch die Bits 1 und 2 im Element tmPitchAndFamily der NEWTEXTMETRIC-Struktur überprüfen, um eine TrueType-Schriftart zu identifizieren. Wenn Bit 1 0 und Bit 2 1 ist, ist die Schriftart eine TrueType-Schriftart.

Vektorschriftarten werden als OEM_CHARSET anstatt als ANSI_CHARSET kategorisiert. Einige Anwendungen identifizieren Vektorschriftarten mithilfe dieser Informationen und überprüfen das element tmCharSet der NEWTEXTMETRIC-Struktur . Diese Kategorisierung verhindert in der Regel, dass der Schriftartenzuordnungser Vektorschriftarten wählt, es sei denn, sie werden ausdrücklich angefordert. (Die meisten Anwendungen verwenden keine Vektorschriftarten mehr, da ihre Striche einzelne Linien sind und das Zeichnen länger dauert als TrueType-Schriftarten, die viele der gleichen Skalierungs- und Rotationsfeatures bieten, die Vektorschriftarten erforderten.)