Compartir a través de


Cómo enumerar fuentes

En esta introducción se muestra cómo enumerar las fuentes de la colección de fuentes del sistema, por nombre de familia.

Esta información general consta de las siguientes partes:

Paso 1: Obtener la colección de fuentes del sistema.

Use el método GetSystemFontCollection proporcionado por el DirectWrite Factory para devolver un IDWriteFontCollection con todas las fuentes del sistema en ella.

IDWriteFontCollection* pFontCollection = NULL;

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

Paso 2: Obtener el recuento de familias de fuentes.

A continuación, obtenga el recuento de familias de fuentes de la colección de fuentes mediante IDWriteFontCollection::GetFontFamilyCount. Lo usaremos para recorrer en bucle cada familia de fuentes de la colección.

UINT32 familyCount = 0;

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

Cree un bucle For.

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

Ahora que tiene la colección de fuentes y el recuento de fuentes, los pasos restantes recorren en bucle cada familia de fuentes, recuperando el objeto IDWriteFontFamily y consultandolo.

Paso 3: Obtener la familia de fuentes.

Obtenga un objeto IDWriteFontFamily mediante IDWriteFontCollection::GetFontFamily y pasando el índice actual, i.

IDWriteFontFamily* pFontFamily = NULL;

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

Paso 4: Obtener los nombres de familia.

Obtenga los nombres de familia de fuentes mediante IDWriteFontFamily::GetFamilyNames. Se trata de un objeto IDWriteLocalizedStrings . Puede tener varias versiones localizadas del nombre de familia para la familia de fuentes.

IDWriteLocalizedStrings* pFamilyNames = NULL;

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

Paso 5: Buscar el nombre de la configuración regional.

Obtenga el nombre de la fuente famliy en la configuración regional que desee mediante el método IDWriteLocalizedStrings::FindLocaleName . En este caso, primero se recupera y solicita la configuración regional predeterminada. Si eso no funciona, se solicita la configuración regional "en-us". Si no se encuentra alguna de las configuraciones regionales especificadas, este ejemplo simplemente recurre al índice 0, la primera configuración regional disponible.

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;

Paso 6: Obtener la longitud de la longitud de la cadena de nombre de familia y la cadena.

Por último, obtenga la longitud de la cadena de nombre de familia mediante IDWriteLocalizedStrings::GetStringLength. Use esta longitud para asignar una cadena lo suficientemente grande como para contener el nombre y, a continuación, obtener el nombre de familia de fuentes mediante 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);
}

Conclusión

Una vez que tenga el nombre de familia o los nombres en la configuración regional, puede enumerarlos para que el usuario elija o pasarlo a CreateTextFormat para comenzar a dar formato al texto con la familia de fuentes especificada, etc.

Código de ejemplo

Para ver el código fuente completo de este ejemplo, consulte el ejemplo de enumeración de fuentes.