IDWriteFontFamily
COM公式ドキュメント
関連するフォントのファミリーを表します。(IDWriteFontFamily)
解説(Remarks)
フォントファミリーとは、"Times New Roman" のように同じファミリー名を共有しながらも、特徴が異なるフォントの集合です。こうした特徴の違いには、italic のようなスタイルや、bold のような太さ (weight) が含まれます。
次の図は、"Times New Roman" フォントファミリーに属するフォントの例を示しています。
IDWriteFontFamily オブジェクトは、次の例に示す IDWriteFontCollection::GetFontFamily メソッドを使用して、フォントコレクションから取得できます。 GetFontFamily は UINT32 のインデックスを受け取り、そのインデックスにあるフォントのフォントファミリーを返します。
IDWriteFontFamily* pFontFamily = NULL;
// Get the font family.
if (SUCCEEDED(hr))
{
hr = pFontCollection->GetFontFamily(i, &pFontFamily);
}
フォントファミリー名は、テキストレイアウトオブジェクトやテキストフォーマットオブジェクトのフォントファミリーを指定するために使用されます。 IDWriteFontFamily::GetFamilyNames メソッドを使用すると、次のコードに示すように、IDWriteFontFamily オブジェクトからローカライズされたフォントファミリー名の一覧を IDWriteLocalizedStrings オブジェクトの形で取得できます。
IDWriteLocalizedStrings* pFamilyNames = NULL;
// Get a list of localized strings for the family name.
if (SUCCEEDED(hr))
{
hr = pFontFamily->GetFamilyNames(&pFamilyNames);
}
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
フォントファミリーのファミリー名を、ロケール名をインデックスとして格納したローカライズ文字列オブジェクトを作成します。(IDWriteFontFamily.GetFamilyNames)
| names | IDWriteLocalizedStrings** | out | 新しく作成された IDWriteLocalizedStrings オブジェクトへのポインターのアドレス。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
次のコード例は、IDWriteFontFamily オブジェクトからフォントファミリー名を取得する方法を示しています。
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);
}
指定したプロパティに最も一致するフォントを取得します。
| weight | DWRITE_FONT_WEIGHT | in | 要求されたフォントの太さ (weight) を一致させるために使用される値。 |
| stretch | DWRITE_FONT_STRETCH | in | 要求されたフォントの幅 (stretch) を一致させるために使用される値。 |
| style | DWRITE_FONT_STYLE | in | 要求されたフォントのスタイルを一致させるために使用される値。 |
| matchingFont | IDWriteFont** | out | このメソッドが返るときに、新しく作成された IDWriteFont オブジェクトへのポインターのアドレスが格納されます。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
フォントファミリー内のフォントを、指定したプロパティにどれだけ一致するかの順にランク付けした一覧を取得します。
| weight | DWRITE_FONT_WEIGHT | in | 要求されたフォントの太さ (weight) を一致させるために使用される値。 |
| stretch | DWRITE_FONT_STRETCH | in | 要求されたフォントの幅 (stretch) を一致させるために使用される値。 |
| style | DWRITE_FONT_STYLE | in | 要求されたフォントのスタイルを一致させるために使用される値。 |
| matchingFonts | IDWriteFontList** | out | 新しく作成された IDWriteFontList オブジェクトへのポインターのアドレス。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDWriteFontFamily "{DA20D8EF-812A-4C43-9802-62EC4ABD7ADD}"
#usecom global IDWriteFontFamily IID_IDWriteFontFamily "{}"
#comfunc global IDWriteFontFamily_GetFamilyNames 6 sptr
#comfunc global IDWriteFontFamily_GetFirstMatchingFont 7 int,int,int,sptr
#comfunc global IDWriteFontFamily_GetMatchingFonts 8 int,int,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。