[MFC]エディットコントロールで日本語を扱えるようにする

MFC
この記事は約3分で読めます。

超シンプルなテキストエディタを作るの続きです。

元の記事ではsetlocale()をSAVEボタンを押したときに読んでいましたが、これだとファイルをセーブするまではロケールを日本語に設定できません。

例えばファイルのオープンを実装し、既存のファイルを編集できるようにする場合、起動後一度もセーブをしないままファイルをオープンするとロケールが日本語に設定されていないため文字化けが発生します。

本来であればテキストエディタ起動のタイミングで必ずロケールを日本語に設定する必要があります。

そのために、ダイアログ初期化処理で、ロケールを日本語に設定しましょう。また、本来であれば使用するwindowsの言語設定にあったものにロケールを設定し直すのが正解だと思うので、いずれそうしたいと思います。

BOOL CMyEditorDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// TODO: 初期化をここに追加します。

	// ロケールを日本語にする
	setlocale(LC_CTYPE, "jpn");
	
	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
void CMyEditorDlg::OnMSave()
{
	// TODO: ここにコマンド ハンドラー コードを追加します。
	CStdioFile	file;
	CString		ss;
	long		mode;
	
        // OnInitDialog()に移動
        // setlocale(LC_CTYPE, "jpn");
	
        mode = CFile::modeCreate | CFile::modeWrite | CFile::typeText;

	if (file.Open(TEXT("C:\\temp\\test.txt"), mode))
	{
		m_edit.GetWindowText(ss);
		file.WriteString(ss);
		file.Close();
	}
}

ダイアログの初期化時に呼ばれるイベントハンドラ内にsetlocale()を移動しました。これで今後SAVE処理以外にロケールを設定すべき処理が現れても、いちいちロケールを意識する必要がなくなります。

コメント

タイトルとURLをコピーしました