CFileDialogをカスタマイズ。

投稿者: | 2021年1月6日

MFCにおいて、ファイルの入力を行うため、CFileDialogをカスタマイズしました。応用機能やビジュアルを実装するために使用したコードです。(結局思い通りのビジュアルにはなりませんでした。)

目次

  1. CFileDialogとは
  2. OnInitDialogの廃止
  3. CFileDialogのカスタマイズ
  4. 所感
CFileDialogとは

CFileDialogクラスは、ファイルを開いたり保存したりする時に使用するダイアログに関するクラスです。詳細はMicrosoftの以下のページをご覧ください。

https://docs.microsoft.com/ja-jp/cpp/mfc/reference/cfiledialog-class?view=msvc-160

以下のコードでダイアログが表示されます。

CFileDialog dlg;
dlg.DoModal();

OnInitDialogの廃止

これまでは、CFileDialogにボタンなどのコントロールを追加する場合、OnInitDialogにコードを記述していました。しかし、OnInitDialogはWindows Vista以降ではサポートされていません。以下をご参照ください。

https://docs.microsoft.com/ja-jp/cpp/mfc/reference/cfiledialog-class?view=msvc-160#cfiledialog

代わりに、用意されたCFileDialog::AddXXX(XXXはコントロール名)メソッド(関数)を追加することによってコントロールを追加します。

CFileDialogのカスタマイズ

このダイアログを表示させるため、CFileDialogを基底クラスとした新しいクラスを作成します。ここでは、COpenFileDialogとし、CFileDialogの以下のメソッド(関数)を使用します。

目的メソッド
コンボボックス追加CFileDialog::AddComboBox
テキスト追加CFileDialog::AddText
エディットボックス追加CFileDialog::CFileDialog::AddEditBox

これらのメソッドをCOpenFileDialogのコンストラクタに実装します。

COpenFileDialog::COpenFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
 StartVisualGroup(ID_SERIES_VIS_GROUP, L"");
 // コンボボックス追加
 AddComboBox(ID_COMBO_INPUT_TYPE);
 AddControlItem(ID_COMBO_INPUT_TYPE, ID_COMBO_TYPE_FILE, L"ファイル読み込み");
 AddControlItem(ID_COMBO_INPUT_TYPE, ID_COMBO_TYPE_SERIES, L"シリーズ一括読み込み");
 SetSelectedControlItem(ID_COMBO_INPUT_TYPE, ID_COMBO_TYPE_SERIES);
 // テキスト追加
 AddText(ID_TEXT_SERIES_FOLDER, L"シリーズ格納フォルダ");
// テキストボックス追加
 AddEditBox(ID_EDIT_SERIES_FOLDER, L"");
 EndVisualGroup();
}

後は、呼び出したい場所で、以下を実装すればダイアログが表示されます。

COpenFileDialog dlg;
dlg.DoModal();

所感
  • MFCはビジュアルの変更に関して融通が利かない
  • C#のほうがスタイリッシュなビジュアルにできると専ら言われている。

ビジュアルを操作する関数がガチガチに準備されているので、MFCは正直融通がきかなくて辛いです。以前作成したMFCのアプリケーションをC#に移植している方も中にはいらっしゃるみたいなのですが、自分がやると考えるとなんだかクラクラしてきます。最初からC#等で作るのが一番良い気がします。(筆者はC#出来ませんが)

カテゴリー: MFC

コメントを残す

メールアドレスが公開されることはありません。