Sdílet prostřednictvím


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í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ů.