Guide pratique pour énumérer des polices
Cette vue d’ensemble montre comment énumérer les polices de la collection de polices système, par nom de famille.
Cette vue d’ensemble se compose des parties suivantes :
- Étape 1 : Obtenir la collection de polices système.
- Étape 2 : Obtenir le nombre de familles de polices.
- Créez une boucle For.
- Conclusion
- Exemple de code
Étape 1 : Obtenir la collection de polices système.
Utilisez la méthode GetSystemFontCollection fournie par le DirectWrite Factory 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, obtenez le nombre de familles de polices 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éez 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 bouclent sur chaque famille de polices, récupérant l’objet IDWriteFontFamily et l’interrogeant.
Étape 3 : Obtenir la famille de polices.
Obtenez un objet IDWriteFontFamily en utilisant IDWriteFontCollection::GetFontFamily et en lui transmettant 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.
Obtenez les noms de famille 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 : Recherchez le nom des paramètres régionaux.
Obtenez le nom de famille de police dans les paramètres régionaux souhaités à 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 de la chaîne.
Enfin, obtenez 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 la famille de police à 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 la famille dans les paramètres régionaux, vous pouvez les lister pour l’utilisateur, ou le transmettre à 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 de polices.