複数選択リスト ボックスを作成する方法
このトピックでは、複数選択リスト ボックスでディレクトリの内容を表示したりアクセスしたりする方法について説明します。 複数選択リスト ボックスでは、ユーザーは一度に複数の項目を選択できます。
このトピックの C++ コード例を使用すると、ユーザーは現在のディレクトリ内のファイルの一覧を表示し、一覧からファイルのグループを選択して削除できます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
ディレクトリ一覧アプリケーションでは、以下のリスト ボックス関連のタスクを実行する必要があります。
- リスト ボックスを初期化します。
- リスト ボックスからユーザーの選択内容を取得します。
- 選択されたファイルが削除された後で、リスト ボックスからそれらのファイル名を削除します。
次の C++ コード例では、ダイアログ ボックス プロシージャが DlgDirList 関数を使用して複数選択リスト ボックス (IDC_FILELIST) を初期化し、現在のディレクトリ内のすべてのファイルの名前をリスト ボックスに表示します。
ユーザーがファイルのグループを選択して [削除] ボタンをクリックすると、ダイアログ ボックス プロシージャは LB_GETSELCOUNT メッセージを送信して、選択したファイル数を取得します。さらに、LB_GETSELITEMS メッセージを送信して、選択されたリスト ボックス項目の配列を取得します。 ファイルを削除した後、ダイアログ ボックス プロシージャは、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;
}
}
関連トピック