Win32 API 日本語リファレンス
ホームGraphics.DirectWrite › IDWriteFontCollection

IDWriteFontCollection

COM
IIDa84cee02-3eea-4eee-a827-87c1a02a0fcc継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

システムにインストールされているフォントの集合や、特定のディレクトリ内のフォントの集合など、フォントの集合をカプセル化するオブジェクトです。(IDWriteFontCollection)

解説(Remarks)

IDWriteFactory::GetSystemFontCollection メソッドを使用すると、次のコード例に示すように、システムにインストールされているフォントの集合をカプセル化した IDWriteFontCollection オブジェクトを取得できます。

IDWriteFontCollection* pFontCollection = NULL;

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

IDWriteTextFormatIDWriteTextLayout はいずれも、オブジェクトが使用しているフォントコレクションを返す GetFontCollection メソッドを備えています。これらのインターフェイスは既定でシステムフォントコレクションを使用しますが、代わりにカスタムフォントコレクションを使用することもできます。

システムで利用可能なフォントを調べるには、システムフォントコレクションへの参照を取得します。次に、IDWriteFontCollection::GetFontFamilyCount メソッドを使用してフォント数を取得し、一覧をループ処理できます。次の例では、システムフォントコレクション内のフォントを列挙し、フォントファミリ名をコンソールに出力します。


#include <dwrite.h>
#include <string.h>
#include <stdio.h>
#include <new>

// SafeRelease inline function.
template <class T> inline void SafeRelease(T **ppT)
{
    if (*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

void wmain()
{
    IDWriteFactory* pDWriteFactory = NULL;

    HRESULT hr = DWriteCreateFactory(
            DWRITE_FACTORY_TYPE_SHARED,
            __uuidof(IDWriteFactory),
            reinterpret_cast<IUnknown**>(&pDWriteFactory)
            );

    IDWriteFontCollection* pFontCollection = NULL;

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

    UINT32 familyCount = 0;

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

    for (UINT32 i = 0; i < familyCount; ++i)
    {
        IDWriteFontFamily* pFontFamily = NULL;

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

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

        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;

        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);
        }
        if (SUCCEEDED(hr))
        {
            // Print out the family name.
            wprintf(L"%s\n", name);
        }

        SafeRelease(&pFontFamily);
        SafeRelease(&pFamilyNames);

        delete [] name;
    }

    SafeRelease(&pFontCollection);
    SafeRelease(&pDWriteFactory);
}

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 DWORD GetFontFamilyCount()

コレクション内のフォントファミリの数を取得します。

戻り値

型: UINT32

コレクション内のフォントファミリの数。

vtbl 4 HRESULT GetFontFamily(DWORD index, IDWriteFontFamily** fontFamily)

0 から始まるフォントファミリのインデックスを指定して、フォントファミリオブジェクトを作成します。

indexDWORDin0 から始まるフォントファミリのインデックス。
fontFamilyIDWriteFontFamily**outこのメソッドが返されるとき、新しく作成されたフォントファミリオブジェクトへのポインターのアドレスが格納されます。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

vtbl 5 HRESULT FindFamilyName(LPWSTR familyName, DWORD* index, BOOL* exists)

指定したファミリ名を持つフォントファミリを検索します。

familyNameLPWSTRinフォントファミリの名前を含む、null 終端の文字配列。名前の大文字と小文字は区別されませんが、それ以外はコレクション内のファミリ名と完全に一致する必要があります。
indexDWORD*outこのメソッドが返されるとき、ファミリ名が見つかった場合は一致するフォントファミリの 0 から始まるインデックスが格納されます。見つからなかった場合は UINT_MAX が格納されます。
existsBOOL*outこのメソッドが返されるとき、ファミリ名が存在する場合は TRUE、存在しない場合は FALSE が格納されます。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

vtbl 6 HRESULT GetFontFromFontFace(IDWriteFontFace* fontFace, IDWriteFont** font)

指定したフォントフェイスオブジェクトと同じ物理フォントに対応するフォントオブジェクトを取得します。指定した物理フォントは、このフォントコレクションに属している必要があります。

fontFaceIDWriteFontFace*in物理フォントを指定するフォントフェイスオブジェクト。
fontIDWriteFont**outこのメソッドが返されるとき、成功した場合は新しく作成されたフォントオブジェクトへのポインターのアドレスが格納されます。それ以外の場合は NULL が格納されます。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IDWriteFontCollection "{A84CEE02-3EEA-4EEE-A827-87C1A02A0FCC}"
#usecom global IDWriteFontCollection IID_IDWriteFontCollection "{}"
#comfunc global IDWriteFontCollection_GetFontFamilyCount   3
#comfunc global IDWriteFontCollection_GetFontFamily        4 int,sptr
#comfunc global IDWriteFontCollection_FindFamilyName       5 wstr,var,var
#comfunc global IDWriteFontCollection_GetFontFromFontFace  6 sptr,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。