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

sta*_*tor 3 mfc dialog folderbrowserdialog

我目前在我的CDocManagerEx类中使用CFolderDialog类来处理文件操作,如下所示:

替代文字http://img268.yfrog.com/img268/9271/filedialog.png

我不知道是否需要显示此类的方法实现(我是从此处发布的项目中找到的),但是如果有帮助,请参见以下类定义:

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;
};
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*idK 5

如果只需要允许用户键入目录条目名称的编辑控件,则可以这样做。您使用的C ++类是Win32 SHBrowseForFolder()方法的包装器,该方法通过在BROWSEINFO结构的ulFlags成员中设置BIF_EDITBOX(或更佳的BIF_USENEWUI)来支持具有编辑框。

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

但是,请注意在MSDN中有关此标志的警告:在使用此标志打开对话框之前,必须已调用OleInitialize()或CoInitialize()。

更一般而言,如果您想要一个可用于自己目的的编辑控件,允许用户输入任何内容,那将是一个更大的问题:无法通过自定义控件扩展SHBrowseForFolder()使用的对话框。如果要这样做,最终将不得不重新实现整个对话框,这不是一个好主意。

另外,作为最后的说明,如果您可以限制自己使用Vista(或更高版本),那么还有另一种方法可以使用目录选择对话框:使用带有FOS_PICKFOLDERS标志的新IFileDialog COM界面。