Vytvoření výčtu písem
Tento přehled vám ukáže, jak zobrazit výčet písem v systémové kolekci písem podle názvu rodiny.
Tento přehled se skládá z následujících částí:
- krok 1: Získejte kolekci systémových písem.
- krok 2: Získejte počet rodin písem.
- Vytvořte smyčku For.
- závěr
- Ukázkový kód
Krok 1: Získání kolekce systémových písem
Použijte metodu GetSystemFontCollection, kterou poskytuje DirectWrite Factory, k získání objektu IDWriteFontCollection obsahujícího všechna systémová písma.
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
Krok 2: Získání počtu rodin písem
Dále získejte počet rodin písem z kolekce písem pomocí IDWriteFontCollection::GetFontFamilyCount. Toto použijeme k procházení jednotlivých rodin písem v kolekci.
UINT32 familyCount = 0;
// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
familyCount = pFontCollection->GetFontFamilyCount();
}
Vytvořte smyčku For.
for (UINT32 i = 0; i < familyCount; ++i)
Teď, když máte kolekci písem a počet písem, zbývající kroky prochází každou rodinu písem, načítají objekt IDWriteFontFamily a provádějí na něm dotazy.
Krok 3: Získejte fontovou rodinu.
Získejte objekt IDWriteFontFamily pomocí IDWriteFontCollection::GetFontFamily a předáním aktuálního indexu i.
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
Krok 4: Získání rodinných jmen
Získejte názvy písmových rodin pomocí IDWriteFontFamily::GetFamilyNames. Toto je IDWriteLocalizedStrings objekt. Může mít více lokalizovaných verzí názvu písmové rodiny.
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
Krok 5: Vyhledání názvu místního nastavení
Pomocí metody IDWriteLocalizedStrings::FindLocaleName získejte název rodiny písem v požadovaném národním prostředí. V tomto případě se nejprve načte a vyžádá výchozí národní prostředí. Pokud to nepomůže, vyžaduje se národní prostředíen-us. Pokud se některé z zadaných národních prostředí nenajde, tento příklad se jednoduše vrátí k indexu 0, což je první dostupné národní prostředí.
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;
Krok 6: Získejte délku řetězce rodinného jména a samotný řetězec.
Nakonec získejte délku řetězce rodinného jména pomocí IDWriteLocalizedStrings::GetStringLength. Tuto délku použijte k přidělení řetězce dostatečně velkého pro uložení názvu a poté získání názvu fontové rodiny pomocí 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);
}
Závěr
Jakmile budete mít jméno nebo jména rodiny v národním prostředí, můžete je zobrazit, ze kterých si uživatel může vybrat, nebo ho předat createTextFormat, abyste mohli začít formátovat text se zadanou rodinou písem atd.
Příklad kódu
Pokud chcete zobrazit úplný zdrojový kód pro tento příklad, podívejte se na ukázku enumerace fontů.