Unicode文字列が SetWindowTextで反映されない謎
ウィンドウキャプションにUnicode文字列を表示しようとしたら、なかなかうまくいかなかったので解決までのメモ。
1. Unicode 文字セットを使用する(おまじない程度ですが)。
2. CreateWindowW / CreateDialogW で作成しないと反映されないことがある(どうやら、Resource File の形式に影響されるらしい?Unicodeになっていれば不要かも)
3. Resource File がUnicode で保存されていることを確認する。
リソースファイルをテキストエディタで開いて、Unicode 文字列を直接埋め込んで保存してみると、Unicodeで保存されていない場合は警告が出る。
注: VCのリソースエディタなどで埋め込んでもダメ。
4.LoadStringWやSetWindowTextWやSendMessageW を使っていること。(これは当たり前ですね、ちなみにプリプロセッサで UNICODE _UNICODE を #define しておくと 自動的に関数がwchar_t型になります)
int LoadStrResource(IN HINSTANCE hInst,IN UINT uID,wchar_t *str) { HRSRC hrSrc; HGLOBAL hRes; LPWSTR lpName, lpStr; lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1); hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING); if (hrSrc) { hRes = LoadResource(hInst, hrSrc); if (hRes) { lpStr = (LPWSTR)LockResource(hRes); if (lpStr) { UINT x; uID &= 0xF; for (x = 0; x < uID; x++) { lpStr += (*lpStr) + 1; } memcpy(str,lpStr+1,2*(int)*lpStr); str[2*(int)*lpStr]=0; return (int)(*lpStr); } } } *str=0; return -1; } |
サンプル関数
何で気づいたかというと、サンプル関数で 直接、LoadResourceでデータ拾ってきたらUnicode文字列が壊れて格納されていたので、バイナリ開いたらちゃんとコンパイルできてなかったことに気付いたという訳です。
関連サイト:
Win32APIでのエディットボックスの文字化け - C&C++ - 教えて!goo
MFCのキャプション変更 - BIGLOBEなんでも相談室
Comments