Share via


Erstellen eines Multiple-Selection Listenfelds

In diesem Thema wird veranschaulicht, wie Sie den Inhalt eines Verzeichnisses in einem Listenfeld mit mehrfacher Auswahl anzeigen und darauf zugreifen. In einem Listenfeld mit mehrfacher Auswahl kann der Benutzer mehrere Elemente gleichzeitig auswählen.

Das C++-Codebeispiel in diesem Thema ermöglicht es einem Benutzer, eine Liste der Dateien im aktuellen Verzeichnis anzuzeigen, eine Gruppe von Dateien aus der Liste auszuwählen und sie zu löschen.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Programmierung der Windows-Benutzeroberfläche

Anweisungen

Die Verzeichnisauflistungsanwendung muss die folgenden Listenfeld-bezogenen Aufgaben ausführen:

  • Initialisieren Sie das Listenfeld.
  • Rufen Sie die Auswahl des Benutzers aus dem Listenfeld ab.
  • Entfernen Sie die Dateinamen aus dem Listenfeld, nachdem die ausgewählten Dateien gelöscht wurden.

Im folgenden C++-Codebeispiel initialisiert die Dialogfeldprozedur das Mehrfachauswahllistenfeld (IDC_FILELIST), indem die DlgDirList-Funktion verwendet wird, um das Listenfeld mit den Namen aller Dateien im aktuellen Verzeichnis zu füllen.

Wenn der Benutzer eine Gruppe von Dateien auswählt und die Schaltfläche Löschen auswählt, sendet die Dialogfeldprozedur die LB_GETSELCOUNT Nachricht, um die Anzahl der ausgewählten Dateien und die LB_GETSELITEMS Nachricht abzurufen, um ein Array ausgewählter Listenfeldelemente abzurufen. Nach dem Löschen einer Datei entfernt die Dialogprozedur das entsprechende Element aus dem Listenfeld, indem die LB_DELETESTRING Nachricht gesendet wird.

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

List Box-Steuerelementreferenz

Info-Listenfelder

Verwenden von Listenfeldern