MBCS を使用して大規模なレガシ アプリケーション ビルドを維持しています。
システム ロケールが日本語で UI ロケールが英語の Windows 7 システムで、編集コントロールの選択位置が正しく返されないという問題があります。日本語でインストールされた XP と Windows 7 でテストしましたが、結果は同じでした。
[codesnippet]
CEdit* pEdit = state->GetEdit() ;
auto hWnd = pEdit->GetSafeHwnd() ;
if ( hWnd )
{
::SendMessageA(hWnd, EM_GETSEL, (WPARAM)&nStart, (LPARAM)&nEnd) ;
TCHAR buffer[128];
::SendMessageA(hWnd, WM_GETTEXT, (WPARAM)_countof(buffer), (LPARAM)&buffer);
_RPT4(_CRT_WARN,
"String '%s' selection [%d,%d], unicode? %s",
buffer,
nStart,
nEnd,
(::IsWindowUnicode(hWnd)) ? "True" : "False");
[/codesnippet]
文字列の末尾にある Carat を使用すると、次の出力が生成されます。
文字列「未定義」選択 [3,3]、ユニコード? 間違い
一体何が起こっているのでしょうか?私は小さなテストアプリケーションを構築しましたが、それは期待通りに動作し、出力を生成します
文字列「未定義」選択 [6,6]、ユニコード? 間違い
これは としてビルドされた MBCSsizeof(TCHAR) == 1
であり、レガシー アプリケーションであるため UNICODE に切り替えることはできません。