実現したいこと
C++ MFCでの韓国語のダイアログの文字化けを解消したい。
前提
Visual Studio2008 C++ MFCで32ビットアプリの開発を行っています。
今回アプリを韓国語に対応させた所、ダイアログ上の文言が?に文字化けします。
対処方法はないでしょうか?
前提 本体プロジェクトの文字セットはマルチバイト、韓国語リソースのプロジェクトを文字セットunicodeで追加した。フォント"Malgun Gothic"もインストールされている。
リソースファイル.rcの冒頭部分の記述
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#endif //_WIN32
ダイアログの定義部分
IDD_CONFIG_XXX DIALOGEX 0, 0, 346, 340
STYLE DS_SETFONT | WS_CHILD | WS_CAPTION
FONT 8, "Malgun Gothic", 400, 0, 0x1
CAPTION "스프레이콘 설정"
BEGIN
|
GROUPBOX "스프레이콘 설정",IDC_STATIC_GROUP_NAME,2,2,341,128
END
文字列定義部分
STRINGTABLE
BEGIN
|
IDS_STATIC_GROUP_NAME L"스프레이콘 설정"
END
.rc2の記述
|
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041204b0" // 言語ID 0x412(韓国語)、文字コード 0x04b0 (1200) unicode
BEGIN
|
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x412, 1200
END
END
エラーメッセージの表示は以下のように表示文字列を従来のCStringからCStringWに変更してAfxMessageBox()⇒MessageBoxW()に変更することで
韓国語のメッセージを正しく表示することができた。
CStringW csErrMsgW(L"");
if(! csErrMsgW.LoadString(IDS_STRING10226)){
csErrMsgW = _T("新規作成の前に保存しますか?");
}
//ret = AfxMessageBox(csErrMsg, MB_YESNOCANCEL | MB_ICONQUESTION);
ret = MessageBoxW(NULL, csErrMsgW, L"タイトル", MB_YESNOCANCEL | MB_ICONQUESTION);
一方ダイアログの表示ではそのままでは文字化けしてしまう為、ダイアログのOnInitDialog()にて以下のように記述したところ、デバッグ実行するとLoadStringで文字列は正しく取得されており、SetDlgItemTextW()の戻り値も正常でしたが、ダイアログ上の表示は????などと文字化けしています。
// リソースから文字列をロードしてCStringWに格納
CStringW csText;
csText.LoadString(IDS_STATIC_GROUP_NAME);
SetDlgItemTextW(m_hWnd, IDC_STATIC_GROUP_NAME, csText);
尚、SetDlgItemTextW()の代わりにSetWindowTextW()を用いて
HWND hWnd = m_groupBox.GetSafeHwnd();
BOOL ret = SetWindowTextW(hWnd, csText);
ダイアログのヘッダファイルの記述
// グループボックスのコントロール変数
CButton m_groupBox;
ダイアログのDoDataExchangeの記述
void ConfigXXX::DoDataExchange(CDataExchange* pDX)
{
|
// IDC_STATIC_GROUP_NAMEに対応する変数と関連付け
DDX_Control(pDX, IDC_STATIC_GROUP_NAME, m_groupBox);
}
と変更するとSetWindowTextW()の戻り値も正常でしたが現象は変わらずでした。
良い対処方法が有れば教えて下さい。
尚、本体プロジェクトの文字セットをunicodeにする対処は本体プロジェクトの記述がunicodeを意識した記述になっていないことで、ビルドエラーが大量に出て対処が大変な為一番最後の手段にしたいと思っています。
よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー