3

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

替代文字 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;
};

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

4

2 回答 2

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 接口。

于 2009-06-23T07:45:07.653 回答
0

也许其中的一些想法会做你想要的?

http://www.codeproject.com/KB/dialog/browse_for_folder_dialog.aspx

或这个

http://www.codeguru.com/cpp/wp/files/browserfunctionsdialogs/article.php/c4443

于 2009-06-23T01:37:51.377 回答