Tutorial d'initiation A la programmation avec l'API Windows
Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
Chapitre 2Les boîtes de dialogue12. Parcourir l'arborescence
Cours théorique :
Pour permettre à l'utilisateur de sélectionner un dossier ou un fichier, on utilisera respectivement les fonctions SHBrowseForFolder() et GetOpenFileName(). Ces deux fonctions affichent les boîtes de dialogue standard de Windows pour parcourir l'arborescence à la recherche d'un dossier ou d'un fichier. Notons que la constante MAX_PATH désigne la longueur standard pour un chemin. Les buffers chargés de recevoir les noms de fichiers ou les chemins sont supposés faire au moins cette taille.
Voici un exemple d'utilisation de la fonction SHBrowseForFolder() :
BROWSEINFO bi; LPITEMIDLIST Item; // Ici, la taille du buffer ne peut pas être passée // buffer est supposé être de taille MAX_PATH (ou plus) char buffer[MAX_PATH];
// On met tous les champs inutilisés à 0 memset(&bi,0,sizeof(BROWSEINFO)); // hDlg est le HWND de la boite de dialogue qui demande l'ouverture // Ou NULL si la boite de dialogue n'a pas de fenêtre parent bi.hwndOwner=Dlg; // Contient le répertoire initial ou NULL bi.pidlRoot=NULL; bi.pszDisplayName=buffer; bi.lpszTitle="Répertoire courant"; bi.ulFlags=NULL; bi.lParam=NULL; Item=SHBrowseForFolder(&bi); if(Item!=NULL) { // buffer contient le nom du répertoire sélectionné SHGetPathFromIDList(Item,buffer); // buffer contient le chemin complet de la sélection }
Voici un exemple d'utilisation de la fonction GetOpenFileName() :
OPENFILENAME st; char buffer[MAX_PATH];
// Pas de fichier par défaut buf[0]=' '; // On met tous les champs inutilisés à 0 memset(&st,0,sizeof(OPENFILENAME)); st.lStructSize=sizeof(OPENFILENAME); // hDlg est le HWND de la boite de dialogue qui demande l'ouverture // Ou NULL si la boite de dialogue n'a pas de fenêtre parent st.hwndOwner=hDlg; // La syntaxe est : Description1 Filtre1 Description2 Filtre2 st.lpstrFilter="Executables - Fichiers de commandes *.exe;*.bat "; st.lpstrFile=buffer; st.nMaxFile=MAX_PATH; st.lpstrTitle="Recherche de l'exécutable"; st.Flags=NULL; // Contient le répertoire initial ou NULL st.lpstrInitialDir=NULL; if(GetOpenFileName(&st)) // buffer contient notre chemin
|