SOFTIST 编程方法筆記 →目录

CFileDialog的个性化(VC++)

本文是为标准的文件选择对话框添加控件以扩展它的功能。为了做到这点,要把CFileDialog类派生,还要准备粘贴控件用的对话框模板,把控件的消息响应入口追加到MESSAGE-MAP中。

例程。文件选择对话框在选择文本文件时,可以预览这个文件的内容。

1.生成对话框模板。作一个对话框的资源,比如ID为IDD_DIALOG1。其属性如下设定。

IDD_DIALOG1 DIALOG DISCARDABLE  0, 0, 187, 128
STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
FONT 9, "MS Sans Serif"
BEGIN
    LTEXT           "Static",stc32,7,7,173,114
    EDITTEXT        IDC_EDIT_PREVIEW,7,18,102,30,ES_MULTILINE | 
                    ES_AUTOHSCROLL | ES_WANTRETURN
    PUSHBUTTON      "Button1",IDC_BUTTON_PREVIEW,143,36,37,23
END

2.追加控件。首先追加一个ID为stc32的大一点的静态文字控件(Static)。然后在它的下面,追加预览用的多行编辑框(ID=IDC_EDIT_PREVIEW)和起动预览用的按钮(ID=IDC_BUTTON_PREVIEW)

3.生成CFileDialog的派生类,比如叫CFileDlg。为了指定资源ID,追加如下的代码到CFileDlg里。这个追加还有一个意义,那就是可以用MFC的类精灵工具(MFC ClassWizard)来作相应的处理。

// Dialog Data
    //{{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)的响应函数。从CFileDlg类的实体对话框取得文件的全路径,打开文件,把其内容显示在编辑框(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();
    }
}

6.结果测试。

CFileDlg dlg(TRUE);
dlg.DoModal();