Share via


列舉已安裝的字型

在某些情況下,應用程式必須能夠列舉可用的字型,並選取最適合特定作業的字型。 應用程式可以呼叫 EnumFontsEnumFontFamilies 函式來列舉可用的字型。 這些函式會將可用字型的相關資訊傳送至應用程式所提供的回呼函式。 回呼函式會接收 LOGFONTNEWTEXTMETRIC 結構中的資訊。 (NEWTEXTMETRIC 結構包含 TrueType 字型的相關資訊。當回呼函式收到非 TrueType 字型的相關資訊時,資訊會包含在 TEXTMETRIC 結構中。) 透過使用此資訊,應用程式可以將使用者的選擇限制為僅可使用的字型。

EnumFontFamilies函式類似于EnumFonts函式,但包含一些額外的功能。 EnumFontFamilies 可讓應用程式利用 TrueType 字型所提供的樣式。 新的和升級的應用程式應該使用 EnumFontFamilies ,而不是 EnumFonts

TrueType 字型是以字樣名稱 (來組織,例如,Courier New) 和樣式名稱 (例如斜體、粗體和超粗體) 。 EnumFontFamilies函式會列舉與指定系列名稱相關聯的所有樣式,而不只是粗體和斜體屬性。 例如,當系統包含名為 Courier New Extra-Bold 的 TrueType 字型時, EnumFontFamilies 會將它與其他 Courier New 字型一起列出。 EnumFontFamilies的功能對於具有許多或不尋常的樣式的字型以及跨國際框線的字型很有説明。

如果應用程式未提供字樣名稱, EnumFontsEnumFontFamilies 函式會提供每個可用系列中一個字型的相關資訊。 若要列舉裝置內容中的所有字型,應用程式可以為字樣名稱指定 Null 、編譯可用字樣的清單,然後列舉每個字樣中的每個字型。

下列範例會使用 EnumFontFamilies 函式來擷取可用點陣、向量和 TrueType 字型系列的數目。

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

此範例使用兩個遮罩,RASTER_FONTTYPE和TRUETYPE_FONTTYPE來判斷要列舉的字型類型。 如果設定RASTER_FONTTYPE位,字型就是點陣字型。 如果已設定TRUETYPE_FONTTYPE位,字型會是 TrueType 字型。 如果兩個位都未設定,字型就是向量字型。 例如,當裝置 (支援下載 TrueType 字型時,會設定第三) 個遮罩DEVICE_FONTTYPE;如果裝置是顯示器介面卡、點矩陣印表機或其他點陣裝置,則為零。 應用程式也可以使用DEVICE_FONTTYPE遮罩來區分 GDI 提供的點陣字型與裝置提供的字型。 系統可以模擬 GDI 提供的點陣字型的粗體、斜體、底線和刪除線屬性,但不適用於裝置提供的字型。

應用程式也可以在NEWTEXTMETRIC結構的tmPitchAndFamily成員中檢查位 1 和 2,以識別 TrueType 字型。 如果位 1 為 0 且位 2 為 1,則字型為 TrueType 字型。

向量字型會分類為OEM_CHARSET,而不是ANSI_CHARSET。 有些應用程式會使用這項資訊來識別向量字型,並檢查NEWTEXTMETRIC結構的tmCharSet成員。 此分類通常可防止字型對應程式選擇向量字型,除非特別要求它們。 (大部分的應用程式都不再使用向量字型,因為其筆劃是單行,而且繪製時間比 TrueType 字型更長,這提供許多需要向量字型的相同縮放和旋轉功能。)