Énumération des polices installées

Dans certains cas, une application doit être en mesure d’énumérer les polices disponibles et de sélectionner celle qui convient le mieux pour une opération particulière. Une application peut énumérer les polices disponibles en appelant la fonction EnumFonts ou EnumFontFamilies . Ces fonctions envoient des informations sur les polices disponibles à une fonction de rappel que l’application fournit. La fonction de rappel reçoit des informations dans les structures LOGFONT et NEWTEXTMETRIC . (La structure NEWTEXTMETRIC contient des informations sur une police TrueType. Lorsque la fonction de rappel reçoit des informations sur une police non TrueType, les informations sont contenues dans une structure TEXTMETRIC .) En utilisant ces informations, une application peut limiter les choix de l’utilisateur aux seules polices disponibles.

La fonction EnumFontFamilies est similaire à la fonction EnumFonts , mais inclut des fonctionnalités supplémentaires. EnumFontFamilies permet à une application de tirer parti des styles disponibles avec les polices TrueType. Les applications nouvelles et mises à niveau doivent utiliser EnumFontFamilies au lieu d’EnumFonts.

Les polices TrueType sont organisées autour d’un nom de police (par exemple, Courier New) et de noms de style (par exemple, italique, gras et extra-gras). La fonction EnumFontFamilies énumère tous les styles associés à un nom de famille spécifié, et pas simplement les attributs gras et italiques. Par exemple, lorsque le système inclut une police TrueType appelée Courier New Extra-Bold, EnumFontFamilies la répertorie avec les autres polices Courier New. Les fonctionnalités d’EnumFontFamilies sont utiles pour les polices avec des styles nombreux ou inhabituels et pour les polices qui traversent les frontières internationales.

Si une application ne fournit pas de nom de police de type, les fonctions EnumFonts et EnumFontFamilies fournissent des informations sur une police dans chaque famille disponible. Pour énumérer toutes les polices dans un contexte d’appareil, l’application peut spécifier NULL pour le nom de police, compiler une liste des polices disponibles, puis énumérer chaque police dans chaque police.

L’exemple suivant utilise la fonction EnumFontFamilies pour récupérer le nombre de familles de polices raster, vector et 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 ); 
} 

Cet exemple utilise deux masques, RASTER_FONTTYPE et TRUETYPE_FONTTYPE, pour déterminer le type de police énuméré. Si le bit RASTER_FONTTYPE est défini, la police est une police raster. Si le bit TRUETYPE_FONTTYPE est défini, la police est une police TrueType. Si aucun bit n’est défini, la police est une police vectorielle. Un troisième masque, DEVICE_FONTTYPE, est défini lorsqu’un appareil (par exemple, une imprimante laser) prend en charge le téléchargement de polices TrueType ; elle est égale à zéro si l’appareil est un adaptateur d’affichage, une imprimante matricielle ou un autre périphérique raster. Une application peut également utiliser le masque DEVICE_FONTTYPE pour distinguer les polices raster fournies par GDI des polices fournies par l’appareil. Le système peut simuler des attributs gras, italiques, soulignés et barrés pour les polices raster fournies par GDI, mais pas pour les polices fournies par l’appareil.

Une application peut également case activée bits 1 et 2 dans le membre tmPitchAndFamily de la structure NEWTEXTMETRIC pour identifier une police TrueType. Si le bit 1 est 0 et le bit 2 est 1, la police est une police TrueType.

Les polices vectorielles sont classées comme OEM_CHARSET au lieu de ANSI_CHARSET. Certaines applications identifient les polices vectorielles à l’aide de ces informations, en vérifiant le membre tmCharSet de la structure NEWTEXTMETRIC . Cette catégorisation empêche généralement le mappeur de polices de choisir des polices vectorielles, sauf si elles sont spécifiquement demandées. (La plupart des applications n’utilisent plus de polices vectorielles, car leurs traits sont des lignes uniques et qu’elles prennent plus de temps à dessiner que les polices TrueType, qui offrent la plupart des mêmes fonctionnalités de mise à l’échelle et de rotation que celles requises pour les polices vectorielles.)