Как добавить поле редактирования в MFC CFolderDialog (диалоговое окно «Обзор папок»)? - PullRequest
3 голосов
/ 23 июня 2009

В настоящее время у меня есть класс 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;
};

Моя цель этого вопроса - добавить элемент управления для редактирования в окно чуть ниже рабочей области, где выбран каталог. Какой самый простой способ сделать это?

Ответы [ 2 ]

5 голосов
/ 23 июня 2009

Если вам просто нужен элемент управления для редактирования, который позволяет пользователю вводить имя записи каталога, это возможно. Используемый вами класс C ++ является оболочкой для метода Win32 SHBrowseForFolder (), и этот метод поддерживает наличие поля для редактирования, устанавливая BIF_EDITBOX (или лучше BIF_USENEWUI) в элементе ulFlags структуры BROWSEINFO.

Глядя на класс C ++, кажется, что самый простой способ добиться этого - передать BIF_USENEWUI в качестве члена dwFlags в вызове конструктора. (Хотя я хотел бы просто вызвать SHBrowseForFolder напрямую и не беспокоиться о классе C ++.)

Обратите внимание на предупреждение об этом флаге в MSDN, однако: OleInitialize () или CoInitialize () должны быть вызваны до вызова диалога с этим флагом.

В более общем плане, если вам нужен элемент управления для редактирования, который вы можете использовать для своих собственных целей, позволяющий пользователю вводить что-либо, это более проблемная задача: нет способа расширить диалог, используемый SHBrowseForFolder (), с помощью пользовательских элементов управления. Если вы захотите это сделать, вам придется заново реализовать весь диалог, что не очень хорошая идея.

Кроме того, в качестве заключительного замечания, если вы можете ограничить себя Vista (и более поздними версиями), то есть другой способ открыть диалоговое окно выбора каталога: используйте новый интерфейс COM IFileDialog с флагом FOS_PICKFOLDERS.

0 голосов
/ 23 июня 2009

Может быть, некоторые идеи из этого сделают то, что вы хотите?

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

или это

http://www.codeguru.com/cpp/w-p/files/browserfunctionsdialogs/article.php/c4443

...