プログラミングメモ →目次

CFileDialogのカスタマイズ(VC++)

ファイル ダイアログ ボックスをカスタマイズするには、CFileDialog の派生クラスを作成し、カスタマイズの為にダイアログ テンプレートを用意し、コントロールを貼り付けて、ClassWizardで、メッセージハンドルを追加します。

プログラミングのメモとして、テキストファイルを選択しながら、ファイルの中身のプレビューをできるようなファイル ダイアログ ボックスを作ります。

1.テンプレートを作ります。リソースエディターで、IDD_DIALOG1というダイアログを追加します。「スタイル」は、下記のように設定します。

2.コントロールを追加します。まず、IDをstc32とする大きなスタティック テキストをダイアログの上部に貼り付けます。次はスタティック テキストの下に、プレビュー用のエディット ボックス(ID=IDC_EDIT_PREVIEW)とボタン(ID=IDC_BUTTON_PREVIEW)を追加します。

3.CFileDialogから派生クラスを作成します。例え、CFileDlgとします。リソースIDを指定する為に、下記のコードをCFileDlgに追加します。こうすることで、MFCクラスウィザード(MFC ClassWizard)が使えるようになります。

// ダイアログ データ
    //{{AFX_DATA(CFileDlg)
    enum { IDD = IDD_DIALOG1 };
    //}}AFX_DATA

4.テンプレートを使うために、CFileDlgのコンストラクタ関数に下記のコードを実装します。

CFileDlg::CFileDlg(BOOL bOpenFileDialog, ...) : CFileDialog(bOpenFileDialog, ...)
{
    m_ofn.Flags |= dwFlags;
    m_ofn.Flags |= OFN_EXPLORER;
    m_ofn.Flags |= OFN_ENABLETEMPLATE;
    SetTemplate(0, IDD_DIALOG1);
}

5.ボタン(ID=IDC_BUTTON_PREVIEW)のハンドルを実装します。CFileDialogクラスからファイルパスを取得して、ファイルを開いて、中身をエディット ボックス(ID=IDC_EDIT_PREVIEW)に表示させます。

void CFileDlg::OnPreview() 
{
    CString strPathName = GetPathName();
    if (strPathName != "")
    {
        CFile file;
        file.Open(strPathName, CFile::modeRead);
        char buff[1024];
        memset(buff, 0, 1024);
        file.Read(buff, 1024);
        GetDlgItem(IDC_EDIT_PREVIEW)->SetWindowText(buff);
        file.Close();
    }
}

例のファイル ダイアログ ボックスは、下記のようです。