Comment énumérer les polices

Cette vue d’ensemble indique comment énumérer les polices de la collection de polices système, par nom de famille.

Cette vue d’ensemble se compose des éléments suivants :

Étape 1 : obtenir la collection de polices système.

utilisez la méthode GetSystemFontCollection fournie par la fabrique DirectWrite pour retourner un IDWriteFontCollection avec toutes les polices système qu’il contient.

IDWriteFontCollection* pFontCollection = NULL;

// Get the system font collection.
if (SUCCEEDED(hr))
{
    hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}

Étape 2 : obtenir le nombre de familles de polices.

Ensuite, récupérez le nombre de familles de polices à partir de la collection de polices à l’aide de IDWriteFontCollection :: GetFontFamilyCount. Nous allons l’utiliser pour effectuer une boucle sur chaque famille de polices de la collection.

UINT32 familyCount = 0;

// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
    familyCount = pFontCollection->GetFontFamilyCount();
}

Créer une boucle for.

for (UINT32 i = 0; i < familyCount; ++i)

Maintenant que vous disposez de la collection de polices et du nombre de polices, les étapes restantes sont en boucle sur chaque famille de polices, récupérant l’objet IDWriteFontFamily et interrogeant celui-ci.

Étape 3 : obtenir la famille de polices.

Obtenir un objet IDWriteFontFamily à l’aide de IDWriteFontCollection :: GetFontFamily et en lui passant l’index actuel, i.

IDWriteFontFamily* pFontFamily = NULL;

// Get the font family.
if (SUCCEEDED(hr))
{
    hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}

Étape 4 : obtenir les noms de famille.

Récupérez les noms des familles de polices à l’aide de IDWriteFontFamily :: GetFamilyNames. Il s’agit d’un objet IDWriteLocalizedStrings . Il peut avoir plusieurs versions localisées du nom de famille pour la famille de polices.

IDWriteLocalizedStrings* pFamilyNames = NULL;

// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
    hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}

Étape 5 : Rechercher le nom des paramètres régionaux.

Récupérez le nom de la police famliy dans les paramètres régionaux de votre choix à l’aide de la méthode IDWriteLocalizedStrings :: FindLocaleName . Dans ce cas, les paramètres régionaux par défaut sont d’abord récupérés et demandés. Si cela ne fonctionne pas, les paramètres régionaux « en-US » sont demandés. Si l’un des paramètres régionaux spécifiés est introuvable, cet exemple revient simplement à l’index 0, les premiers paramètres régionaux disponibles.

UINT32 index = 0;
BOOL exists = false;

wchar_t localeName[LOCALE_NAME_MAX_LENGTH];

if (SUCCEEDED(hr))
{
    // Get the default locale for this user.
    int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);

    // If the default locale is returned, find that locale name, otherwise use "en-us".
    if (defaultLocaleSuccess)
    {
        hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);
    }
    if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English
    {
        hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);
    }
}

// If the specified locale doesn't exist, select the first on the list.
if (!exists)
    index = 0;

Étape 6 : obtenir la longueur de la chaîne de nom de famille et la chaîne.

Enfin, récupérez la longueur de la chaîne de nom de famille à l’aide de IDWriteLocalizedStrings :: GetStringLength. Utilisez cette longueur pour allouer une chaîne suffisamment grande pour contenir le nom, puis obtenir le nom de famille de polices à l’aide de IDWriteLocalizedStrings :: GetString.

UINT32 length = 0;

// Get the string length.
if (SUCCEEDED(hr))
{
    hr = pFamilyNames->GetStringLength(index, &length);
}

// Allocate a string big enough to hold the name.
wchar_t* name = new (std::nothrow) wchar_t[length+1];
if (name == NULL)
{
    hr = E_OUTOFMEMORY;
}

// Get the family name.
if (SUCCEEDED(hr))
{
    hr = pFamilyNames->GetString(index, name, length+1);
}

Conclusion

Une fois que vous avez le ou les noms de famille dans les paramètres régionaux, vous pouvez les répertorier pour permettre à l’utilisateur de choisir ou de le passer à CreateTextFormat pour commencer la mise en forme du texte avec la famille de polices spécifiée, et ainsi de suite.

Exemple de code

Pour voir le code source complet de cet exemple, consultez l' exemple d’énumération font.