CFileDialogをカスタマイズする


VC6.0でCFileDialogをカスタマイズするための手順を示します。

1.CFileDialogクラスを基本クラスとした派生クラスをClasswizardを使用して作成します。

2.ダイアログ・リソースを作成。プロパティの設定は、以下のようにします。

プロパティ設定
スタイルチャイルド
境界線しない
兄弟ウィンドウをクリップTrue
子ウィンドウをクリップTrue
3.派生クラスのコンストラクタへCFileDialogとダイアログ・リソースを関連付ける。 [例:] ::SetTemplate(0,ダイアログ・リソースのID); 4.派生クラスを呼び出す。  (注意)カスタマイズするためには、OFN_EXPLORER タイプを設定する必要があります。 5.Spy++で操作したいCFileDialog上のコントロールIDを調べる。  [備考:] このIDは、MFCのDLGS.Hで定義されているものです。 6.5で調べたIDを使ってカスタマイズして下さい。 (PS.関数のオーバーライトなどに付いての詳細は、MSDNを参照して下さい。) 【サンプル】 ここでは、ファイル選択部分を非表示にして、ディレクトリのみを選択させるDialogを作ってみました。 @"上記の1"で示した方法に従って、CFileDialogの派生クラス = CFileDialogEx を作成。 A"上記の2"で示した方法に従って、ID番号 = IDD_CMFILEHOOK_DLG のリソースを作成。 BFileDialogEx.hファイルへ追記 public: CString m_strFolderPath; //ホルダ名格納用変数 protected: virtual void OnFolderChange(); //選択ホルダが変更されると呼ばれるメソッドをオーバーライト CFileDialogEx.cppファイルへ追記 //コンストラクタの設定 CFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) { //CFileDialog操作用にリソースを関連付ける CFileDialogEx::SetTemplate(0,IDD_CMFILEHOOK_DLG); } //ダイアログの表示をカスタマイズ BOOL CFileDialogEx::OnInitDialog() { CFileDialog::OnInitDialog(); CWnd *pWD = this->GetParent(); pWD->SetWindowText("Select directory"); //IDは Spy++ を使って調べる(このIDは、DLGS.Hで定義されている) this->HideControl(0x0480); this->HideControl(0x0441); this->HideControl(0x0442); this->HideControl(0x0443); this->HideControl(0x0470); this->SetWindowPos(&pWD->wndTop,0,0,10,10,SWP_NOMOVE); return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります // 例外: OCX プロパティ ページの戻り値は FALSE となります } //ホルダが変更されるたびに、選択ホルダの情報をメモリへ設定 void CFileDialogEx::OnFolderChange() { m_strFolderPath = this->GetFolderPath(); CFileDialog::OnFolderChange(); } D派生クラスを呼び出して、CFileDialogをカスタマイズしたダイアログを生成 void CVc_ComFileDir2Dlg::OnButton1() { CString SetFPath; //ダイアログボックスを開く CFileDialogEx myDLG(true,NULL,"XXXXX", OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_ENABLESIZING ,NULL,NULL); //押されたボタンを判定 if( myDLG.DoModal() == IDOK){ //選択されたファイルのフルパスをエディットボックスへ出力 SetFPath = myDLG.m_strFolderPath; m_Edit1.SetWindowText(SetFPath); } else{ //エディットボックスをクリア m_Edit1.SetWindowText(NULL); } } [サンプル・プロジェクト] (注意) このサンプルは、Visual C++ 6.0で作成されています。