IDWriteLocalizedStrings
COM公式ドキュメント
ロケール名でインデックス付けされた文字列のコレクションを表します。
解説(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。
言語と文字列のペアの数を取得します。
戻り値
型: UINT32
言語と文字列のペアの数。
指定したロケール名を持つ、ロケール名と文字列のペアの 0 から始まるインデックスを取得します。
| localeName | LPWSTR | in | 検索するロケール名を含む、null で終端された文字配列。 |
| index | DWORD* | out | ロケール名と文字列のペアの 0 から始まるインデックス。このメソッドは index を UINT_MAX に初期化します。 |
| exists | BOOL* | out | このメソッドが返るとき、ロケール名が存在する場合は TRUE、存在しない場合は FALSE が格納されます。このメソッドは exists を FALSE に初期化します。 |
戻り値
型: HRESULT
指定したロケール名が存在しない場合、戻り値は S_OK ですが、 index は UINT_MAX、exists は FALSE になります。
解説(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;
指定したインデックスのロケール名の長さ(null 終端文字を含まない)を文字数で取得します。(IDWriteLocalizedStrings.GetLocaleNameLength)
| index | DWORD | in | 取得するロケール名の 0 から始まるインデックス。 |
| length | DWORD* | out | このメソッドが返るとき、null 終端文字を含まないロケール名の長さが文字数で格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
指定したインデックスのロケール名を、指定した配列にコピーします。(IDWriteLocalizedStrings.GetLocaleName)
| index | DWORD | in | 取得するロケール名の 0 から始まるインデックス。 |
| localeName | LPWSTR | out | このメソッドが返るとき、言語と文字列のペアからロケール名を受け取る、null で終端された文字配列が格納されます。この配列に割り当てるバッファーは、要素数で少なくとも size のサイズが必要です。 |
| size | DWORD | in | 配列のサイズ(文字数)。このサイズには終端の null 文字用の領域を含める必要があります。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
指定したインデックスの文字列の長さ(null 終端文字を含まない)を文字数で取得します。(IDWriteLocalizedStrings.GetStringLength)
| index | DWORD | in | 言語と文字列のペアの 0 から始まるインデックス。 |
| length | DWORD* | 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);
}
指定したインデックスの文字列を、指定した配列にコピーします。(IDWriteLocalizedStrings.GetString)
| index | DWORD | in | 調べる言語と文字列のペアの 0 から始まるインデックス。 |
| stringBuffer | LPWSTR | out | 言語と文字列のペアから文字列を受け取る、null で終端された文字配列。この配列に割り当てるバッファーは、少なくとも size のサイズが必要です。このメソッドを使用する前に GetStringLength を使用して配列のサイズを取得できます。 |
| size | DWORD | in | 配列のサイズ(文字数)。このサイズには終端の 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 公式リファレンス: 英語 (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 方式にも切替可。#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,sptr,sptr #comfunc global IDWriteLocalizedStrings_GetLocaleNameLength 5 int,sptr #comfunc global IDWriteLocalizedStrings_GetLocaleName 6 int,sptr,int #comfunc global IDWriteLocalizedStrings_GetStringLength 7 int,sptr #comfunc global IDWriteLocalizedStrings_GetString 8 int,sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。