Comment ajouter une boîte d'édition à Molder CFolderDialog (& # 8220; rechercher le dossier & # 8221;)?
-
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?
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.
Autres conseils
Peut-être que certaines des idées présentées feront ce que vous voulez?
http://www.codeproject.com/KB/dialog/bracing_for_folder_dialog.aspx
ou ceci
http://www.codeguru.com/cpp /wp/files/browserfunctionsdialogs/article.php/c4443