Aracılığıyla paylaş


Yazı Tiplerini Numaralandırma

Bu genel bakış, sistem yazı tipi koleksiyonundaki yazı tiplerinin aile adına göre nasıl numaralandırılacağını gösterir.

Bu genel bakış aşağıdaki bölümlerden oluşur:

1. Adım: Sistem Yazı Tipi Koleksiyonunu Alma.

DirectWrite Factory tarafından sağlanan GetSystemFontCollection yöntemini kullanarak, içinde tüm sistem yazı tiplerini içeren bir IDWriteFontCollection döndürür.

IDWriteFontCollection* pFontCollection = NULL;

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

2. Adım: Yazı Tipi Aile Sayısını Alma.

Ardından, IDWriteFontCollection::GetFontFamilyCountkullanarak yazı tipi koleksiyonundan yazı tipi ailesi sayısını alın. Bunu koleksiyondaki her yazı tipi ailesi üzerinde döngü yapmak için kullanacağız.

UINT32 familyCount = 0;

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

For Döngüsü yapın.

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

Artık yazı tipi koleksiyonuna ve yazı tipi sayısına sahip olduğunuza göre, kalan adımlar her yazı tipi ailesi üzerinde döngü yaparak IDWriteFontFamily nesnesini alır ve sorgular.

3. Adım: Yazı Tipi Ailesi'ni edinin.

IDWriteFontCollection::GetFontFamily kullanarak ve geçerli dizine geçirerek idwriteFontFamily nesnesini alın i.

IDWriteFontFamily* pFontFamily = NULL;

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

4. Adım: Aile Adlarını Alma.

IDWriteFontFamily::GetFamilyNameskullanarak yazı tipi aile adlarını alın. Bu bir IDWriteLocalizedStrings nesnesidir. Yazı tipi ailesi için aile adının birden çok yerelleştirilmiş sürümü olabilir.

IDWriteLocalizedStrings* pFamilyNames = NULL;

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

5. Adım: Bölge Adını bulmaya çalışın.

İstediğiniz yerel ayarda yazı tipi ailesi adını almak için IDWriteLocalizedStrings::FindLocaleName yöntemini kullanın. Bu durumda, önce varsayılan yerel ayar elde edilir ve talep edilir. Bu işe yaramazsa, "en-us" yerel ayarı istenir. Belirtilen yerel ayarlardan biri bulunamazsa, bu örnek yalnızca kullanılabilir ilk yerel ayar olan dizin 0'a geri döner.

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;

6. Adım: Aile Adı Dize Uzunluğunu ve Dizeyi Alın.

Son olarak, IDWriteLocalizedStrings::GetStringLengthkullanarak aile adı dizesinin uzunluğunu alın. Bu uzunluğu, adı barındıracak kadar büyük bir dize ayırmak için kullanın ve ardından yazı tipi ailesi adını almak için IDWriteLocalizedStrings::GetStringkullanın.

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

Sonuç

Yerel ayarda aile adına veya adlara sahip olduktan sonra, bunları kullanıcının seçebileceği şekilde listeleyebilir veya metni belirtilen yazı tipi ailesi ile biçimlendirmeye başlamak için CreateTextFormat'a geçirebilirsiniz.

Örnek Kod

Bu örneğin tam kaynak kodunu görmek için Yazı Tipi Numaralandırma Örneğibakın.