Menghitung Font terinstal

Dalam beberapa kasus, aplikasi harus dapat menghitung font yang tersedia dan memilih yang paling sesuai untuk operasi tertentu. Aplikasi dapat menghitung font yang tersedia dengan memanggil fungsi EnumFonts atau EnumFontFamilies . Fungsi-fungsi ini mengirim informasi tentang font yang tersedia ke fungsi panggilan balik yang disediakan aplikasi. Fungsi panggilan balik menerima informasi dalam struktur LOGFONT dan NEWTEXTMETRIC . (Struktur NEWTEXTMETRIC berisi informasi tentang font TrueType. Ketika fungsi panggilan balik menerima informasi tentang font non-TrueType, informasi tersebut terkandung dalam struktur TEXTMETRIC .) Dengan menggunakan informasi ini, aplikasi dapat membatasi pilihan pengguna hanya untuk font yang tersedia.

Fungsi EnumFontFamilies mirip dengan fungsi EnumFonts tetapi mencakup beberapa fungsi tambahan. EnumFontFamilies memungkinkan aplikasi untuk memanfaatkan gaya yang tersedia dengan font TrueType. Aplikasi baru dan yang ditingkatkan harus menggunakan EnumFontFamilies alih-alih EnumFonts.

Font TrueType diatur di sekitar nama typeface (misalnya, Courier New) dan nama gaya (misalnya, miring, tebal, dan ekstra-tebal). Fungsi EnumFontFamilies menghitung semua gaya yang terkait dengan nama keluarga tertentu, tidak hanya atribut tebal dan miring. Misalnya, ketika sistem menyertakan font TrueType yang disebut Courier New Extra-Bold, EnumFontFamilies mencantumkannya dengan font Kurir Baru lainnya. Kemampuan EnumFontFamilies sangat membantu untuk font dengan banyak atau gaya yang tidak biasa dan untuk font yang melintasi perbatasan internasional.

Jika aplikasi tidak memberikan nama typeface, fungsi EnumFonts dan EnumFontFamilies menyediakan informasi tentang satu font di setiap keluarga yang tersedia. Untuk menghitung semua font dalam konteks perangkat, aplikasi dapat menentukan NULL untuk nama typeface, mengkompilasi daftar typeface yang tersedia, lalu menghitung setiap font di setiap typeface.

Contoh berikut menggunakan fungsi EnumFontFamilies untuk mengambil jumlah keluarga font raster, vektor, dan TrueType yang tersedia.

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

Contoh ini menggunakan dua masker, RASTER_FONTTYPE dan TRUETYPE_FONTTYPE, untuk menentukan jenis font yang dijumlahkan. Jika bit RASTER_FONTTYPE diatur, font adalah font raster. Jika bit TRUETYPE_FONTTYPE diatur, font adalah font TrueType. Jika tidak ada bit yang diatur, font adalah font vektor. Masker ketiga, DEVICE_FONTTYPE, diatur ketika perangkat (misalnya, printer laser) mendukung pengunduhan font TrueType; nol jika perangkat adalah adaptor tampilan, printer dot-matrix, atau perangkat raster lainnya. Aplikasi juga dapat menggunakan masker DEVICE_FONTTYPE untuk membedakan font raster yang disediakan GDI dari font yang disediakan perangkat. Sistem dapat mensimulasikan atribut tebal, miring, garis bawah, dan strikeout untuk font raster yang disediakan GDI, tetapi tidak untuk font yang disediakan perangkat.

Aplikasi juga dapat memeriksa bit 1 dan 2 di anggota tmPitchAndFamily dari struktur NEWTEXTMETRIC untuk mengidentifikasi font TrueType. Jika bit 1 adalah 0 dan bit 2 adalah 1, font adalah font TrueType.

Font vektor dikategorikan sebagai OEM_CHARSET alih-alih ANSI_CHARSET. Beberapa aplikasi mengidentifikasi font vektor dengan menggunakan informasi ini, memeriksa anggota tmCharSet dari struktur NEWTEXTMETRIC . Kategorisasi ini biasanya mencegah pemeta font memilih font vektor kecuali diminta secara khusus. (Sebagian besar aplikasi tidak lagi menggunakan font vektor karena goresannya adalah baris tunggal dan mereka membutuhkan waktu lebih lama untuk menggambar daripada font TrueType, yang menawarkan banyak fitur penskalaan dan rotasi yang sama yang memerlukan font vektor.)