Partager via


Comment créer une zone de liste Multiple-Selection

Cette rubrique montre comment afficher et accéder au contenu d’un répertoire dans une zone de liste à sélection multiple. Dans une zone de liste à sélection multiple, l’utilisateur peut sélectionner plusieurs éléments à la fois.

L’exemple de code C++ de cette rubrique permet à un utilisateur d’afficher une liste de fichiers dans le répertoire actif, de sélectionner un groupe de fichiers dans la liste et de les supprimer.

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Programmation de l’interface utilisateur Windows

Instructions

L’application de liste d’annuaires doit effectuer les tâches suivantes liées à la zone de liste :

  • Initialisez la zone de liste.
  • Récupérez les sélections de l’utilisateur à partir de la zone de liste.
  • Supprimez les noms de fichiers de la zone de liste une fois les fichiers sélectionnés supprimés.

Dans l’exemple de code C++ suivant, la procédure de boîte de dialogue initialise la zone de liste à sélection multiple (IDC_FILELIST) à l’aide de la fonction DlgDirList pour remplir la zone de liste avec les noms de tous les fichiers du répertoire actif.

Lorsque l’utilisateur sélectionne un groupe de fichiers et choisit le bouton Supprimer , la procédure de boîte de dialogue envoie le LB_GETSELCOUNT message, pour récupérer le nombre de fichiers sélectionnés, et le LB_GETSELITEMS message, pour récupérer un tableau d’éléments de zone de liste sélectionnés. Après avoir supprimé un fichier, la procédure de boîte de dialogue supprime l’élément correspondant de la zone de liste en envoyant le message LB_DELETESTRING .

#define BIGBUFF 8192 
 
INT_PTR CALLBACK DlgDelFilesProc(HWND hDlg, UINT message, 
        UINT wParam, LONG lParam) 
{ 
    PTSTR pszCurDir; 
    PTSTR pszFileToDelete; 
    int cSelItems; 
    int cSelItemsInBuffer; 
    TCHAR achBuffer[MAX_PATH]; 
    int aSelItems[BIGBUFF]; 
    int i; 
    BOOL fResult; 
    HWND hListBox;
    int iRet;
 
    switch (message) { 
 
        case WM_INITDIALOG: 
 
            // Initialize the list box by filling it with files from 
            // the current directory. 
            pszCurDir = achBuffer; 
            GetCurrentDirectory(MAX_PATH, pszCurDir);
            DlgDirList(hDlg, pszCurDir, IDC_FILELIST, IDS_PATHTOFILL, 0); 
            SetFocus(GetDlgItem(hDlg, IDC_FILELIST)); 
 
            return FALSE; 
 
        case WM_COMMAND: 
 
            switch (LOWORD(wParam)) 
            { 
                case IDOK: 
 
                    // When the user presses the DEL (IDOK) button, 
                    // first retrieve the list of selected files. 
                    pszFileToDelete = achBuffer; 
                    hListBox = GetDlgItem(hDlg, IDC_FILELIST); 
                    cSelItems = SendMessage(hListBox, 
                            LB_GETSELCOUNT, 0, 0); 
 
                    cSelItemsInBuffer = SendMessage(hListBox, 
                            LB_GETSELITEMS, 512, (LPARAM) aSelItems); 
 
                    if (cSelItems > cSelItemsInBuffer) 
                    { 
                        MessageBox(hDlg, L"Too many items selected.", 
                                NULL, MB_OK); 
                    } 
                    else 
                    { 

                        // Make sure the user really wants to delete the files.
                        iRet = MessageBox(hDlg, 
                            L"Are you sure you want to delete these files?", 
                            L"Deleting Files", MB_YESNO | MB_ICONEXCLAMATION);
                        if (iRet == IDNO)
                            return TRUE;

                        // Go through the list backward because after deleting
                        // an item the indices change for every subsequent 
                        // item. By going backward, the indices are never 
                        // invalidated. 
                        for (i = cSelItemsInBuffer - 1; i >= 0; i--) 
                        { 
                            SendMessage(hListBox, LB_GETTEXT, 
                                        aSelItems[i], 
                                        (LPARAM) pszFileToDelete); 
 
                            fResult = DeleteFile(pszFileToDelete); 
                            if (!fResult) 
                            {                     
                                MessageBox(hDlg, L"Could not delete file.", 
                                    NULL, MB_OK);     
                            } 
                            else 
                            { 
                                SendMessage(hListBox, LB_DELETESTRING, 
                                        aSelItems[i], 0); 
                            } 
                        } 
                        SendMessage(hListBox, LB_SETCARETINDEX, 0, 0); 
                    } 
                    return TRUE; 
 
                case IDCANCEL: 
 
                    // Destroy the dialog box. 
                    EndDialog(hDlg, TRUE); 
                    return TRUE; 
 
                default: 
                    return FALSE; 
            } 
 
        default: 
                return FALSE; 
    } 
} 

Informations de référence sur les contrôles de zone de liste

À propos des zones de liste

Utilisation de zones de liste