如何向MFC CFolderDialog添加编辑框(“浏览文件夹”对话框)?

时间:2009-06-23 01:04:10

标签: mfc dialog folderbrowserdialog

我目前有一个CFolderDialog类,在我的CDocManagerEx类中用于处理文件操作,如下所示:

alt text http://img268.yfrog.com/img268/9271/filedialog.png

我不知道是否需要显示此类的方法实现(我从发布的here项目中找到了这个),但如果它有帮助,这里是类定义:

class CFolderDialog  
{
    friend static int CALLBACK BrowseDirectoryCallback(
        HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData);

public:
    CFolderDialog(  LPCTSTR lpszFolderName = NULL, 
        DWORD dwFlags = NULL/*BIF_RETURNONLYFSDIRS*/, 
        CWnd* pParentWnd = NULL);
    virtual ~CFolderDialog();
    virtual int DoModal();
    CString GetPathName() const;

protected:
    virtual void OnInitDialog();
    virtual void OnSelChanged(ITEMIDLIST* pIdl);
    virtual void CallbackFunction(HWND hWnd, UINT uMsg, LPARAM lParam);

    void EnableOK(BOOL bEnable = TRUE);
    void SetSelection(LPCTSTR pszSelection);
    void SetSelection(ITEMIDLIST* pIdl);
    void SetStatusText(LPCTSTR pszStatusText);
    CString ShortName(const CString& strName);

public:
    BROWSEINFO m_bi;

protected:
    CString m_strInitialFolderName;
    CString m_strFinalFolderName;

    TCHAR m_szDisplayName[MAX_PATH];
    TCHAR m_szPath[MAX_PATH];

    HWND m_hDialogBox;
};

class CMyFolderDialog : public CFolderDialog  
{
public:
    CMyFolderDialog(LPCTSTR lpszFolderName = NULL, 
        DWORD dwFlags = NULL, 
        CWnd* pParentWnd = NULL,
        LPCTSTR pszFileFilter = NULL);
    virtual ~CMyFolderDialog();
protected:
    virtual void OnSelChanged(ITEMIDLIST* pIdl);

protected:
    CString m_strFileFilter;
};

我这个问题的目标是在选择目录的工作区正下方的窗口中添加一个编辑控件。最简单的方法是什么?

2 个答案:

答案 0 :(得分:5)

如果您只想要一个允许用户输入目录条目名称的编辑控件,那么这是可能的。您正在使用的C ++类是Win32 SHBrowseForFolder()方法的包装器,并且该方法通过在BROWSEINFO结构的ulFlags成员中设置BIF_EDITBOX(或更好,BIF_USENEWUI)来支持编辑框。

查看C ++类,看起来最简单的方法是将BIF_USENEWUI作为构造函数调用中的dwFlags成员传递。 (虽然我很想直接调用SHBrowseForFolder而不是打扰C ++类。)

请注意MSDN中有关此标志的警告:在启动带有此标志的对话框之前,必须先调用OleInitialize()或CoInitialize()。

更一般地说,如果你想要一个可以用于自己目的的编辑控件,允许用户输入任何内容,那就更有问题了:没有办法扩展SHBrowseForFolder()使用自定义控件的对话框。如果你想这样做,你最终不得不重新实现整个对话框,这不是一个好主意。

另外,作为最后一点,如果您可以将自己限制在Vista(及更高版本),那么还有另一种方法可以使用目录选择对话框:使用新的IFileDialog COM接口和FOS_PICKFOLDERS标志。

答案 1 :(得分:0)