超シンプルなテキストエディタを作るの続きです。
元の記事では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処理以外にロケールを設定すべき処理が現れても、いちいちロケールを意識する必要がなくなります。
コメント