Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você 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.
Essa visão geral consiste nas seguintes partes:
- Etapa 1: obter a coleção de fontes do sistema.
- Etapa 2: obter a contagem da família de fontes.
- Faça um Loop For.
- Conclusão
- Código de exemplo
Etapa 1: obter a coleção de fontes do sistema.
Use o método GetSystemFontCollection fornecido pelo DirectWrite Factory para retornar um IDWriteFontCollection com todas as fontes do sistema.
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
Etapa 2: obter a contagem da família de fontes.
Em seguida, obtenha a contagem da família de fontes da coleção de fontes usando IDWriteFontCollection::GetFontFamilyCount. Usaremos isso para executar um loop sobre cada família de fontes na 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 fazem um loop sobre cada família de fontes, recuperando o objeto IDWriteFontFamily e consultando-o.
Etapa 3: Obter a família de fontes.
Obtenha um objeto IDWriteFontFamily usando IDWriteFontCollection::GetFontFamily e passando-o para o índice atual, i.
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
Etapa 4: Obter os Nomes de Família.
Obtenha os nomes de família de fontes usando IDWriteFontFamily::GetFamilyNames. Este é um objeto IDWriteLocalizedStrings . 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: Localizar o Nome da Localidade.
Obtenha o nome famliy da fonte na localidade desejada usando o método IDWriteLocalizedStrings::FindLocaleName . Nesse caso, primeiro a localidade padrão é recuperada e solicitada. Se isso não funcionar, a localidade "en-us" será 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: obter o comprimento do comprimento da cadeia de caracteres de nome da família e a cadeia de caracteres.
Por fim, obtenha o comprimento da cadeia de caracteres de nome da família usando IDWriteLocalizedStrings::GetStringLength. Use esse comprimento para alocar uma cadeia de caracteres grande o suficiente para manter o nome e obter o nome da família de fontes 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 da família ou os nomes na localidade, você poderá 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 Fonte.