Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Esta visão geral mostrará como enumerar as fontes na coleção de fontes do sistema, por nome de família.
Esta visão geral consiste nas seguintes partes:
- Etapa 1: Obter a coleção de fontes do sistema.
- Etapa 2: Obter o número de famílias tipográficas.
- Faça um loop for.
- Conclusão
- Exemplo de código
Etapa 1: Obtenha a coleção de fontes do sistema.
Use o GetSystemFontCollection método fornecido pelo DirectWrite Factory para retornar um IDWriteFontCollection com todas as fontes do sistema nele.
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
Etapa 2: Obter o número de famílias de fontes.
Em seguida, obtenha a contagem da família de fontes da coleção de fontes usando IDWriteFontCollection::GetFontFamilyCount. Usaremos isso para fazer um loop em cada família de fontes da coleção.
UINT32 familyCount = 0;
// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
familyCount = pFontCollection->GetFontFamilyCount();
}
Faça um loop 'for'.
for (UINT32 i = 0; i < familyCount; ++i)
Agora que você tem a coleção de fontes e a contagem de fontes, as etapas restantes percorrem cada família de fontes, recuperando o objetoIDWriteFontFamilye consultando-o.
Etapa 3: Obter a família de fontes.
Obtenha um objeto IDWriteFontFamily usando IDWriteFontCollection::GetFontFamily e passando-lhe o índice atual, i.
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
Passo 4: Obter os nomes de família.
Obtenha os nomes de família de fontes usando o IDWriteFontFamily::GetFamilyNames. Este é um IDWriteLocalizedStrings objeto. Ele pode ter várias versões localizadas do nome da família para a família de fontes.
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
Etapa 5: Encontre o nome da localidade.
Obtenha o nome da família de fontes na localização desejada usando o método IDWriteLocalizedStrings::FindLocaleName. Nesse caso, primeiro a localidade padrão é recuperada e solicitada. Se isso não funcionar, a configuração regional "en-us" é solicitada. Se uma das localidades especificadas não for encontrada, este exemplo simplesmente retornará ao índice 0, a primeira localidade disponível.
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;
Etapa 6: Obtenha o comprimento da cadeia de caracteres do nome de família e o comprimento da própria cadeia.
Finalmente, obtenha o comprimento da cadeia de caracteres do nome da família usando IDWriteLocalizedStrings::GetStringLength. Use esse comprimento para alocar uma cadeia de caracteres grande o suficiente para manter o nome e, em seguida, obter o nome da família da fonte usando 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);
}
Conclusão
Depois de ter o nome ou nomes da família na localidade, você pode listá-los para o usuário escolher, ou passá-lo para CreateTextFormat para começar a formatar o texto com a família de fontes especificada e assim por diante.
Código de exemplo
Para ver o código-fonte completo deste exemplo, consulte o Exemplo de enumeração de fontes.