다중 선택 목록 상자를 만드는 방법
이 항목에서는 다중 선택 목록 상자에서 디렉터리의 콘텐츠를 표시하고 액세스하는 방법을 보여 줍니다. 다중 선택 목록 상자에서 사용자는 한 번에 둘 이상의 항목을 선택할 수 있습니다.
이 항목의 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;
}
}
관련 항목