다음을 통해 공유


다중 선택 목록 상자를 만드는 방법

이 항목에서는 다중 선택 목록 상자에서 디렉터리의 콘텐츠를 표시하고 액세스하는 방법을 보여 줍니다. 다중 선택 목록 상자에서 사용자는 한 번에 둘 이상의 항목을 선택할 수 있습니다.

이 항목의 C++ 코드 예를 사용하면 사용자가 현재 디렉터리의 파일 목록을 보고 목록에서 파일의 그룹을 선택한 다음 삭제할 수 있습니다.

알아야 하는 작업

기술

필수 구성 요소

  • C/C++
  • Windows 사용자 인터페이스 프로그래밍

지침

디렉터리 목록 애플리케이션은 다음 목록 상자 관련 작업을 수행해야 합니다.

  • 목록 상자를 초기화합니다.
  • 목록 상자에서 사용자의 선택 항목을 검색합니다.
  • 선택한 파일이 삭제된 후 목록 상자에서 파일 이름을 제거합니다.

다음 C++ 코드 예에서 대화 상자 프로시저는 DlgDirList 함수를 사용하여 여러 선택 목록 상자(IDC_FILELIST)를 초기화하여 현재 디렉터리에 있는 모든 파일의 이름으로 목록 상자를 채웁니다.

사용자가 파일 그룹을 선택하고 삭제 단추를 선택하면 대화 상자 프로시저는 선택한 파일의 수와 LB_GETSELITEMS 메시지를 검색하기 위해 LB_GETSELCOUNT 메시지를 전송하여 선택한 목록 상자 항목의 배열을 검색합니다. 파일을 삭제한 후 대화 프로시저는 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; 
    } 
} 

목록 상자 컨트롤 참조

목록 상자 정보

목록 상자 사용