Comment ajouter une boîte d'édition à Molder CFolderDialog (& # 8220; rechercher le dossier & # 8221;)?

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai actuellement une classe CFolderDialog utilisée dans ma classe CDocManagerEx pour gérer les opérations sur les fichiers comme suit:

texte de remplacement http://img268.yfrog.com/img268/9271/filedialog .png

Je ne sais pas si j'ai besoin de montrer l'implémentation de la méthode de cette classe (j'ai trouvé cela à partir d'un projet publié ici ), mais voici la définition de la classe si cela vous aide:

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

Mon objectif de cette question est d’ajouter un contrôle de saisie à la fenêtre située juste en dessous de l’espace de travail dans lequel le répertoire est sélectionné. Quel serait le moyen le plus simple d'y parvenir?

Était-ce utile?

La solution

Si vous souhaitez simplement un contrôle de saisie permettant à l'utilisateur de saisir le nom d'une entrée de répertoire, c'est possible. La classe C ++ que vous utilisez est un wrapper autour de la méthode Win32 SHBrowseForFolder (). Cette méthode prend en charge l’utilisation d’une zone d’édition en définissant BIF_EDITBOX (ou mieux, BIF_USENEWUI) dans le membre ulFlags de la structure BROWSEINFO.

En regardant la classe C ++, il semble que le moyen le plus simple d'y parvenir consiste à passer BIF_USENEWUI en tant que membre dwFlags dans l'appel de constructeur. (Bien que je serais tenté d'appeler SHBrowseForFolder directement et de ne pas m'embêter avec la classe C ++.)

Notez l'avertissement concernant cet indicateur dans MSDN, cependant: OleInitialize () ou CoInitialize () doit avoir été appelé avant d'afficher le dialogue avec cet indicateur.

Plus généralement, si vous voulez un contrôle de montage pouvant être utilisé à vos propres fins, permettant à l'utilisateur de saisir n'importe quoi, c'est plus un problème: il n'y a aucun moyen d'étendre le dialogue utilisé par SHBrowseForFolder () avec des contrôles personnalisés. Si vous voulez faire cela, vous finirez par devoir ré-implémenter tout le dialogue, ce qui n’est pas une bonne idée.

Enfin, si vous pouvez vous limiter à Vista (et au-delà), il existe un autre moyen d’avoir une boîte de dialogue de sélection de répertoire: utilisez la nouvelle interface COM IFileDialog, avec l’indicateur FOS_PICKFOLDERS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top