Как добавить поле редактирования в MFC CFolderDialog (& # 8220; диалоговое окно для поиска папки & # 8221;)?

StackOverflow https://stackoverflow.com/questions/1030159

  •  06-07-2019
  •  | 
  •  

Вопрос

В настоящее время у меня есть класс CFolderDialog, который используется в моем классе CDocManagerEx для обработки файловых операций следующим образом:

alt text 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;
};

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

или это

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top