CFileDialog クラス
ファイルを開く操作または保存する操作に使用されるコモン ダイアログ ボックスをカプセル化します。
class CFileDialog : public CCommonDialog
解説
コモン ダイアログ ボックスを使用すると、[ファイルを開く] や [名前を付けて保存] などのファイルの選択ダイアログ ボックスを、Windows の標準に沿った方法で実装できます。
用意されているコンストラクターでそのまま CFileDialog を使用することも、CFileDialog から独自のダイアログ ボックス クラスを派生させて、要件に応じたコンストラクターを記述することもできます。 どちらの場合も、これらのダイアログ ボックスは CCommonDialog クラスから派生しているため、標準の MFC のダイアログ ボックスと同様の動作をします。 CFileDialog は、Windows に含まれている COMMDLG.DLL ファイルを使用します。
Windows Vista の CFileDialog の外観と機能は、以前のバージョンの Windows から変更されています。 既定の CFileDialog は、コードを変更しなくても、プログラムが Windows Vista でコンパイルおよび実行されると、自動的に新しい Windows Vista スタイルを使用するようになっています。 この自動更新機能を手動でオーバーライドする場合は、コンストラクターで bVistaStyle パラメーターを使用します。 この自動更新機能が適用されないのは、カスタマイズしたダイアログ ボックスです。 カスタマイズしたダイアログ ボックスは、新しいスタイルに変換されません。 コンストラクターの詳細については、「CFileDialog::CFileDialog」を参照してください。
注意
Windows Vista では、CFileDialog を使用する場合のコントロール ID のシステムが以前のバージョンの Windows から変更されています。 以前のバージョンの Windows からプロジェクトを移植するには、CFileDialog コントロールへのすべての参照をまず更新する必要があります。
CFileDialog のいくつかのメソッドは、Windows Vista ではサポートされません。 メソッドがサポートされるかどうかについては、それぞれのメソッドのトピックを参照してください。 さらに、Windows Vista では、以下の継承された関数はサポートされません。
CFileDialog クラスのウィンドウ メッセージは、使用しているオペレーティング システムによって異なります。 たとえば、Windows XP では、CFileDialog クラスに対して CDialog::OnCancel と CDialog::OnOK はサポートされません。 一方、Windows Vista ではこれらがサポートされます。 生成される各種のメッセージとそれぞれの生成順序の詳細については、「CFileDialog サンプル:ログ イベントの順序」を参照してください。
CFileDialog オブジェクトを使うには、まず CFileDialog コンストラクターを使ってオブジェクトを作成します。 ダイアログ ボックスが構築されたら、CFileDialog::m_ofn 構造体の値を設定または変更して、ダイアログ ボックスのコントロールの値や状態を初期化できます。 m_ofn 構造体の型は、OPENFILENAME です。 詳細については、Windows SDK の OPENFILENAME 構造体を参照してください。
ダイアログ ボックスのコントロールを初期化したら、ユーザーがパスとファイル名を入力できるように、CFileDialog::DoModal メソッドを呼び出してダイアログ ボックスを表示します。 DoModal は、ユーザーが [OK] (IDOK) ボタンと [キャンセル] (IDCANCEL) ボタンのどちらをクリックしたかを返します。 DoModal が IDOK を返したときは、CFileDialog のパブリック メンバー関数を使用して、入力された情報を取得できます。
注意
Windows Vista では、IFileDialog::SetFileTypes を複数回呼び出すとエラーが発生します。 Windows Vista では、CFileDialog のどのインスタンスでも、SetFileTypes の 2 回目の呼び出しからは E_UNEXPECTED が返されます。 CFileDialog の一部のメソッド関数は、SetFileTypes を呼び出します。 たとえば、CFileDialog の同じインスタンスで CFileDialog::DoModal を 2 回呼び出すと、ASSERT が生成されます。
CFileDialog には、共有違反、ファイル名の検証、およびリスト ボックスの変更通知に対してカスタム処理を実行できる、いくつかのプロテクト メンバーが含まれています。 これらのプロテクト メンバーはコールバック関数ですが、通常は既定の処理が自動的に実行されるため、ほとんどのアプリケーションでは使用する必要がありません。 これらは標準の仮想関数なので、これらの関数に対するメッセージ マップ エントリも必要ありません。
Windows の CommDlgExtendedError 関数を使用すると、ダイアログ ボックスの初期化中にエラーが発生したかどうかを確認し、そのエラーについての情報を取得できます。
CFileDialog オブジェクトの破棄は自動的に処理されます。 CDialog::EndDialog を呼び出す必要はありません。
ユーザーが複数のファイルを選択できるようにするには、DoModal を呼び出す前に OFN_ALLOWMULTISELECT フラグを設定します。 この場合、複数のファイル名のリストを格納できるバッファーを指定する必要があります。 そのためには、CFileDialog を構築した後、DoModal を呼び出す前に、独自に割り当てたバッファーへのポインターを m_ofn.lpstrFile に設定します。
さらに、設定する必要がありますm_ofn.nMaxFileが指すバッファー内の文字数を使用してm_ofn.lpstrFile。 選択するファイルの最大数を n に設定するとしたら、必要なバッファー サイズは n*(_MAX_PATH + 1) + 1 になります。
次の例は、バッファーを使用して複数のファイル名を取得する方法を示しています。
CFileDialog dlgFile(TRUE);
CString fileName;
const int c_cMaxFiles = 100;
const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
dlgFile.GetOFN().nMaxFile = c_cbBuffSize;
dlgFile.DoModal();
fileName.ReleaseBuffer();
ユーザーが複数のファイル名を選択するのに応じてバッファー サイズを変更するには、CFileDialog から新しいクラスを派生させ、CFileDialog::OnFileNameChange メソッドをオーバーライドする必要があります。
CFileDialog から新しいクラスを派生するとき、メッセージ マップを使用してメッセージを処理できます。 既定のメッセージ処理を拡張するには、CFileDialog から派生クラスを作成し、そのクラスにメッセージ マップを追加し、新しいメッセージを処理するためのメンバー関数を用意します。 ダイアログ ボックスをカスタマイズするために、フック関数を用意する必要はありません。
ダイアログ ボックスをカスタマイズするには、CFileDialog からクラスを派生させ、独自のダイアログ ボックス テンプレートを作成します。さらに、拡張コントロールからの通知メッセージを処理するメッセージ マップを追加します。 処理されないメッセージは基本クラスに渡します。 フック関数をカスタマイズする必要はありません。
Windows Vista スタイルの CFileDialog を使用する場合、メッセージ マップとダイアログ ボックス テンプレートは使用できません。 代わりに、同様の機能を持つ COM インターフェイスを使用する必要があります。
CFileDialog の使用方法の詳細については、「コモン ダイアログ クラス」を参照してください。
必要条件
ヘッダー: afxdlgs.h