MFCにおいて、ファイルの入力を行うため、CFileDialogをカスタマイズしました。応用機能やビジュアルを実装するために使用したコードです。(結局思い通りのビジュアルにはなりませんでした。)
目次
CFileDialogクラスは、ファイルを開いたり保存したりする時に使用するダイアログに関するクラスです。詳細はMicrosoftの以下のページをご覧ください。
https://docs.microsoft.com/ja-jp/cpp/mfc/reference/cfiledialog-class?view=msvc-160
以下のコードでダイアログが表示されます。
CFileDialog dlg; dlg.DoModal();
これまでは、CFileDialogにボタンなどのコントロールを追加する場合、OnInitDialogにコードを記述していました。しかし、OnInitDialogはWindows Vista以降ではサポートされていません。以下をご参照ください。
https://docs.microsoft.com/ja-jp/cpp/mfc/reference/cfiledialog-class?view=msvc-160#cfiledialog
代わりに、用意されたCFileDialog::AddXXX(XXXはコントロール名)メソッド(関数)を追加することによってコントロールを追加します。
このダイアログを表示させるため、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#出来ませんが)