Freigeben über


Aufzählen von Schriftarten

In dieser Übersicht wird gezeigt, wie Sie die Schriftarten in der Systemschriftartsammlung nach Familiennamen aufzählen.

Diese Übersicht besteht aus den folgenden Teilen:

Schritt 1: Abrufen der Systemschriftartsammlung.

Verwenden Sie die GetSystemFontCollection-Methode, die von der DirectWrite Factory bereitgestellt wird, um eine IDWriteFontCollection mit allen Systemschriftarten zurückzugeben.

IDWriteFontCollection* pFontCollection = NULL;

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

Schritt 2: Abrufen der Schriftfamilienanzahl.

Rufen Sie als Nächstes die Anzahl der Schriftartenfamilien aus der Schriftartsammlung mithilfe von IDWriteFontCollection::GetFontFamilyCount ab. Wir verwenden dies, um die einzelnen Schriftartenfamilien in der Auflistung zu durchlaufen.

UINT32 familyCount = 0;

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

Machen Sie einen Für Loop.

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

Nachdem Sie nun über die Schriftartsammlung und die Schriftanzahl verfügen, durchlaufen die verbleibenden Schritte jede Schriftartfamilie, das Abrufen des IDWriteFontFamily-Objekts und die Abfrage.

Schritt 3: Abrufen der Schriftartfamilie.

Rufen Sie ein IDWriteFontFamily-Objekt mithilfe von IDWriteFontCollection::GetFontFamily ab und übergeben Sie es den aktuellen Index, i.

IDWriteFontFamily* pFontFamily = NULL;

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

Schritt 4: Abrufen der Familiennamen.

Rufen Sie die Schriftartfamiliennamen mithilfe der IDWriteFontFamily::GetFamilyNames ab. Dies ist ein IDWriteLocalizedStrings-Objekt . Es kann mehrere lokalisierte Versionen des Familiennamens für die Schriftartfamilie haben.

IDWriteLocalizedStrings* pFamilyNames = NULL;

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

Schritt 5: Suchen Sie den Gebietsschemanamen.

Rufen Sie den Namen der Schriftart im gewünschten Gebietsschema mithilfe der IDWriteLocalizedStrings::FindLocaleName-Methode ab. In diesem Fall wird zuerst das Standardgebietsschema abgerufen und angefordert. Wenn dies nicht funktioniert, wird das Gebietsschema "en-us" angefordert. Wenn eines der angegebenen Gebietsschemas nicht gefunden wird, fällt dieses Beispiel einfach auf Index 0 zurück, das erste verfügbare Gebietsschema.

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;

Schritt 6: Abrufen der Länge der Familiennamenzeichenfolge und der Zeichenfolge.

Rufen Sie schließlich die Länge der Familiennamenzeichenfolge mithilfe von IDWriteLocalizedStrings::GetStringLength ab. Verwenden Sie diese Länge, um eine Zeichenfolge groß genug zuzuweisen, um den Namen zu halten und dann den Namen der Schriftartfamilien mithilfe von IDWriteLocalizedStrings::GetString abzurufen.

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);
}

Schlussbemerkung

Nachdem Sie über den Familiennamen oder die Namen im Gebietsschema verfügen, können Sie sie für den Benutzer auflisten, aus dem Sie auswählen können, oder übergeben Sie ihn an CreateTextFormat, um mit dem Formatieren von Text mit der angegebenen Schriftartfamilie usw. zu beginnen.

Beispielcode

Informationen zum vollständigen Quellcode für dieses Beispiel finden Sie im Beispiel für die Schriftartenaufzählung.