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で作成されています。