Delen via


Hoe lettertypen te enumereren

In dit overzicht ziet u hoe u de lettertypen in de systeemlettertypeverzameling op familienaam kunt inventariseren.

Dit overzicht bestaat uit de volgende onderdelen:

Stap 1: Haal de systeemlettertypeverzameling op.

Gebruik de methode GetSystemFontCollection die wordt geleverd door de DirectWrite Factory om een IDWriteFontCollection- met alle systeemlettertypen erin te retourneren.

IDWriteFontCollection* pFontCollection = NULL;

// Get the system font collection.
if (SUCCEEDED(hr))
{
    hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}

Stap 2: Het aantal lettertypefamilies ophalen.

Haal vervolgens het aantal lettertypefamilies op uit de lettertypeverzameling met behulp van IDWriteFontCollection::GetFontFamilyCount. We gebruiken dit om elke lettertypefamilie in de verzameling te doorlopen.

UINT32 familyCount = 0;

// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
    familyCount = pFontCollection->GetFontFamilyCount();
}

Maak een For Loop.

for (UINT32 i = 0; i < familyCount; ++i)

Nu u de lettertypeverzameling en het aantal lettertypen hebt, worden de resterende stappen doorlopen voor elke lettertypefamilie, waarbij u de IDWriteFontFamily object opvraagt en er query's op uitvoert.

Stap 3: Haal de lettertypefamilie op.

Haal een IDWriteFontFamily-object op met behulp van IDWriteFontCollection::GetFontFamily en geef deze door aan de huidige index, i.

IDWriteFontFamily* pFontFamily = NULL;

// Get the font family.
if (SUCCEEDED(hr))
{
    hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}

Stap 4: Haal de familienamen op.

Haal de namen van de lettertypefamilies op met behulp van de IDWriteFontFamily::GetFamilyNames. Dit is een IDWriteLocalizedStrings-object. Het kan meerdere gelokaliseerde versies van de familienaam voor de lettertypefamilie hebben.

IDWriteLocalizedStrings* pFamilyNames = NULL;

// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
    hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}

Stap 5: Zoek de localenaam.

Haal de lettertypefamilienaam op in de gewenste landinstelling met behulp van de IDWriteLocalizedStrings::FindLocaleName methode. In dit geval wordt eerst de standaardlandinstelling opgehaald en aangevraagd. Als dat niet werkt, wordt de landinstelling 'en-us' aangevraagd. Als een van de opgegeven landinstellingen niet wordt gevonden, valt dit voorbeeld gewoon terug op index 0, de eerste beschikbare landinstelling.

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;

Stap 6: De lengte van de familienaamtekenreeks en de tekenreeks ophalen.

Haal ten slotte de lengte van de familienaamtekenreeks op met behulp van IDWriteLocalizedStrings::GetStringLength. Gebruik deze lengte om een tekenreeks toe te wijzen die groot genoeg is om de naam op te geven en de naam van de lettertypefamilie op te halen met behulp van 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);
}

Conclusie

Zodra u de familienaam of -namen in de landinstelling hebt, kunt u deze weergeven waaruit de gebruiker kan kiezen, of deze doorgeven aan CreateTextFormat om tekst te gaan opmaken met de opgegeven lettertypefamilie, enzovoort.

Voorbeeldcode

Als u de volledige broncode voor dit voorbeeld wilt zien, raadpleegt u het Voorbeeld van opsomming lettertype.