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

IDWriteLocalizedStrings

COM
IID08256209-099a-4b34-b86d-c22b110e7771継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

ロケール名でインデックス付けされた文字列のコレクションを表します。

解説(Remarks)

IDWriteLocalizedStrings が表す文字列の集合は、ロケールに対応付けられる 0 から始まる UINT32 番号でインデックス付けされます。特定のロケールに対応する数値インデックスは、FindLocaleName メソッドを使用して取得します。

IDWriteLocalizedStrings インターフェースの一般的な用途は、IDWriteFontFamily::GetFamilyNames メソッドを使用して作成された、ローカライズ済みフォントファミリ名のリストを保持することです。次の例は、"en-us" ロケールのファミリ名を取得する方法を示しています。

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

メソッド 6

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

vtbl 3 DWORD GetCount()

言語と文字列のペアの数を取得します。

戻り値

型: UINT32

言語と文字列のペアの数。

vtbl 4 HRESULT FindLocaleName(LPWSTR localeName, DWORD* index, BOOL* exists)

指定したロケール名を持つ、ロケール名と文字列のペアの 0 から始まるインデックスを取得します。

localeNameLPWSTRin検索するロケール名を含む、null で終端された文字配列。
indexDWORD*outロケール名と文字列のペアの 0 から始まるインデックス。このメソッドは indexUINT_MAX に初期化します。
existsBOOL*outこのメソッドが返るとき、ロケール名が存在する場合は TRUE、存在しない場合は FALSE が格納されます。このメソッドは existsFALSE に初期化します。

戻り値

型: HRESULT

指定したロケール名が存在しない場合、戻り値は S_OK ですが、 indexUINT_MAXexistsFALSE になります。

解説(Remarks)

ロケール名が存在しない場合でも、戻り値は成功であり、exists パラメーターが FALSE になる点に注意してください。フォントのフォントファミリ名を取得していて、指定したロケール名が存在しない場合の 1 つの方法は、次に示すようにインデックスを 0 に設定することです。フォントファミリには常に少なくとも 1 つのロケールが存在します。

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;
vtbl 5 HRESULT GetLocaleNameLength(DWORD index, DWORD* length)

指定したインデックスのロケール名の長さ(null 終端文字を含まない)を文字数で取得します。(IDWriteLocalizedStrings.GetLocaleNameLength)

indexDWORDin取得するロケール名の 0 から始まるインデックス。
lengthDWORD*outこのメソッドが返るとき、null 終端文字を含まないロケール名の長さが文字数で格納されます。

戻り値

型: HRESULT

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

vtbl 6 HRESULT GetLocaleName(DWORD index, LPWSTR localeName, DWORD size)

指定したインデックスのロケール名を、指定した配列にコピーします。(IDWriteLocalizedStrings.GetLocaleName)

indexDWORDin取得するロケール名の 0 から始まるインデックス。
localeNameLPWSTRoutこのメソッドが返るとき、言語と文字列のペアからロケール名を受け取る、null で終端された文字配列が格納されます。この配列に割り当てるバッファーは、要素数で少なくとも size のサイズが必要です。
sizeDWORDin配列のサイズ(文字数)。このサイズには終端の null 文字用の領域を含める必要があります。

戻り値

型: HRESULT

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

vtbl 7 HRESULT GetStringLength(DWORD index, DWORD* length)

指定したインデックスの文字列の長さ(null 終端文字を含まない)を文字数で取得します。(IDWriteLocalizedStrings.GetStringLength)

indexDWORDin言語と文字列のペアの 0 から始まるインデックス。
lengthDWORD*out言語と文字列のペアから得られる、null 終端文字を含まない文字列の長さ(文字数)。

戻り値

型: HRESULT

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

解説(Remarks)

次のコードに示すように、IDWriteLocalizedStrings::GetString メソッドを呼び出す前に GetStringLength を使用して文字列の長さを取得します。

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);
}
vtbl 8 HRESULT GetString(DWORD index, LPWSTR stringBuffer, DWORD size)

指定したインデックスの文字列を、指定した配列にコピーします。(IDWriteLocalizedStrings.GetString)

indexDWORDin調べる言語と文字列のペアの 0 から始まるインデックス。
stringBufferLPWSTRout言語と文字列のペアから文字列を受け取る、null で終端された文字配列。この配列に割り当てるバッファーは、少なくとも size のサイズが必要です。このメソッドを使用する前に GetStringLength を使用して配列のサイズを取得できます。
sizeDWORDin配列のサイズ(文字数)。このサイズには終端の null 文字用の領域を含める必要があります。このメソッドを使用する前に GetStringLength を使用して配列のサイズを取得できます。

戻り値

型: HRESULT

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

解説(Remarks)

返される文字列は呼び出し側で割り当てる必要があります。次の例に示すように、GetString を呼び出す前に GetStringLength メソッドを使用して文字列のサイズを取得できます。

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);
}
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IDWriteLocalizedStrings "{08256209-099A-4B34-B86D-C22B110E7771}"
#usecom global IDWriteLocalizedStrings IID_IDWriteLocalizedStrings "{}"
#comfunc global IDWriteLocalizedStrings_GetCount             3
#comfunc global IDWriteLocalizedStrings_FindLocaleName       4 wstr,var,var
#comfunc global IDWriteLocalizedStrings_GetLocaleNameLength  5 int,var
#comfunc global IDWriteLocalizedStrings_GetLocaleName        6 int,var,int
#comfunc global IDWriteLocalizedStrings_GetStringLength      7 int,var
#comfunc global IDWriteLocalizedStrings_GetString            8 int,var,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。