フォントを列挙する方法
この概要では、システム フォント コレクション内のフォントをファミリ名で列挙する方法について説明します。
この概要は、次の部分で構成されます。
手順 1: システム フォント コレクションを取得します。
DirectWrite Factory によって提供される GetSystemFontCollection メソッドを使用して、すべてのシステム フォントを含む IDWriteFontCollection を返します。
IDWriteFontCollection* pFontCollection = NULL;
// Get the system font collection.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
}
手順 2: フォント ファミリ数を取得します。
次に、 IDWriteFontCollection::GetFontFamilyCount を使用して、フォント コレクションからフォント ファミリ数を取得します。 これを使用して、コレクション内の各フォント ファミリをループします。
UINT32 familyCount = 0;
// Get the number of font families in the collection.
if (SUCCEEDED(hr))
{
familyCount = pFontCollection->GetFontFamilyCount();
}
For Loopを作成します。
for (UINT32 i = 0; i < familyCount; ++i)
フォント コレクションとフォント数が取得されたので、残りの手順は各フォント ファミリをループし、 IDWriteFontFamily オブジェクトを取得してクエリを実行します。
手順 3: フォント ファミリを取得します。
IDWriteFontCollection::GetFontFamily を使用して IDWriteFontFamily オブジェクトを取得し、現在のインデックス i を渡します。
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
手順 4: ファミリ名を取得します。
IDWriteFontFamily::GetFamilyNames を使用してフォント ファミリ名を取得します。 これは IDWriteLocalizedStrings オブジェクトです 。 フォント ファミリのファミリ名には、ローカライズされた複数のバージョンを含めることができます。
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
手順 5: ロケール名を見つけます。
IDWriteLocalizedStrings::FindLocaleName メソッドを使用して、目的のロケールでフォント名を取得します。 この場合、最初に既定のロケールが取得され、要求されます。 それが機能しない場合は、"en-us" ロケールが要求されます。 指定したロケールのいずれかが見つからない場合、この例では、最初に使用可能なロケールであるインデックス 0 にフォールバックするだけです。
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: ファミリ名の文字列の長さと文字列の長さを取得します。
最後に、 IDWriteLocalizedStrings::GetStringLength を使用して、ファミリ名文字列の長さを取得します。 この長さを使用して、名前を保持するのに十分な大きさの文字列を割り当て、 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);
}
まとめ
ロケールでファミリ名または名前を取得したら、ユーザーが選択できるようにリストしたり、CreateTextFormat に渡して、指定したフォント ファミリでテキストの書式設定を開始したりできます。
コード例
この例の完全なソース コードについては、 フォント列挙サンプルを参照してください。