この記事ではMFCで作成したダイアログベースのアプリケーションで、ファイルを選択するダイアログを表示し、そのダイアログで選択したファイルを表示する実装を行います。
実装対象のアプリケーションは、以前作った超シンプルなテキストエディタです。このエディタもだんだんと機能が充実してきて、初出の記事とはだいぶ変わってきましたのでGitHubにでもソースを公開したほうがいいかも知んないですね。
GitHubの使い方は知らないのでまた勉強します。
実装
さて、例によってソースです。今回はファイルをオープンする際の変更ということで、「ファイルを開く」メニューを押下したときのイベントハンドラーに修正を加えます。
void CMyEditorDlg::OnMOpenfile()
{
// TODO: ここにコマンド ハンドラー コードを追加します。
CFileDialog FDlg(TRUE, _T("txt"), _T("無題"), OFN_FILEMUSTEXIST, "Text Files(*.txt)|*.txt|All Files(*.*)|*.*||");
CString ss;
CString ssall;
char c[256];
// OKが押されたらファイルを開く
if (FDlg.DoModal() == IDOK)
{
if (m_file.Open(FDlg.GetPathName(), CFile::modeReadWrite | CFile::typeText))
{
while (m_file.ReadString(c, 256))
{
ss = c;
ssall = ssall + ss;
}
m_edit.SetWindowText(ssall);
}
}
}
CFileDialogクラスを使う
大きな変更点はCFileDialogクラスの登場ですね。このクラスはファイルの選択ダイアログを簡単に実装できるすぐれものです。大変使いやすいので情報も出てきやすかったです。
まずはコンストラクタの引数を解説していきましょう。
第一引数 | TRUE:ファイルオープン、FALSE:名前をつけて保存 |
第二引数 | 標準の拡張子、ユーザーが入力しなかった場合に付加 |
第三引数 | 標準のファイル名 |
第四引数 | ダイアログボックスの設定パラメータ |
第五引数 | 選択するファイルのフィルタ |
以下、わかりにくそうなものについて説明していきます。
第一引数はファイルを開くためか、名前をつけて保存するためのどちらでファイル選択ダイアログを開くかの指定を行っています。
第四引数はダイアログボックスの設定用のパラメータで、様々な指定のもとにダイアログボックスを開くことができます。これはまだ全部は理解しきれていません。ここで指定しているのはファイルが存在していないと選択できないようにするものです。その他のパラメータについて知りたい場合はMicrosoftのドキュメントにあるFlagsパラメータの項を参照してください。
すべて英語なので少し難しいかもしれません。これもいつか訳して紹介したいです。
CFileDialogで選択したファイルを開く
CFileDialogを表示させてファイルを選択した後、OKを押したかどうかを最初のIF分でチェックしています。
if (FDlg.DoModal() == IDOK)
このif文が真の場合に、CFile::Open()を使ってファイルを開いています。ファイル選択ダイアログで選択したファイルのパスはCFileDialog::GetPathName()で取得しています。あとは普通のOpen処理なので簡単ですね。わからないかたは以前書いた以下の記事を参考にしてみてください。
動作確認
ビルドが通ったら、アプリケーションを起動して「ファイル -> ファイルを開く」と選択してみます。

ちゃんと表示することができました。
コメント