単一選択リスト ボックスにディレクトリ一覧を作成する方法
このトピックでは、単一選択リスト ボックスを使用してディレクトリの内容を表示したりアクセスしたりする方法について説明します。 単一選択リスト ボックスは、既定のリスト ボックスの種類です。 単一選択リスト ボックスからユーザーが選択できるのは、一度に 1 つの項目のみです。
このトピックの C++ コード例を使用すると、ユーザーは現在のディレクトリ内のファイルの一覧を表示し、一覧から 1 つのファイルを選択して削除できます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
ディレクトリ一覧アプリケーションでは、以下のリスト ボックス関連のタスクを実行する必要があります。
- リスト ボックスを初期化します。
- リスト ボックスからユーザーの選択内容を取得します。
- 選択されたファイルが削除された後で、リスト ボックスからそのファイル名を削除します。
次の C++ コード例では、ダイアログ ボックス プロシージャが DlgDirList 関数を使用して単一選択リスト ボックス (IDC_FILELIST) を初期化し、現在のディレクトリ内のすべてのファイルの名前をリスト ボックスに表示します。 ユーザーがファイルを選択して [削除] ボタンをクリックすると、DlgDirSelectEx 関数によって、選択されたファイルの名前が取得されます。 このコードでは、DeleteFile 関数を使用してファイルを削除し、LB_DELETESTRING メッセージを送信してディレクトリ リスト ボックスを更新します。
INT_PTR CALLBACK DlgDelFileProc(HWND hDlg, UINT message,
UINT wParam, LONG lParam)
{
PTSTR pszCurDir;
PTSTR pszFileToDelete;
int iLBItem;
int cStringsRemaining;
int iRet;
TCHAR achBuffer[MAX_PATH];
TCHAR achTemp[MAX_PATH];
BOOL fResult;
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 selected file.
pszFileToDelete = achBuffer;
DlgDirSelectEx(hDlg, pszFileToDelete, MAX_PATH,
IDC_FILELIST);
// Make sure the user really wants to delete the file.
achTemp[MAX_PATH];
StringCbPrintf (achTemp, ARRAYSIZE(achTemp),
TEXT("Are you sure you want to delete %s?"),
pszFileToDelete);
iRet = MessageBox(hDlg, achTemp, L"Deleting Files",
MB_YESNO | MB_ICONEXCLAMATION);
if (iRet == IDNO)
return TRUE;;
// Delete the file.
fResult = DeleteFile(pszFileToDelete);
if (!fResult)
{
MessageBox(hDlg, L"Could not delete file.",
NULL, MB_OK);
}
else // Remove the filename from the list box.
{
// Get the selected item.
iLBItem = SendMessage(GetDlgItem(hDlg, IDC_FILELIST),
LB_GETCURSEL, 0, 0);
// Delete the selected item.
cStringsRemaining = SendMessage(GetDlgItem(hDlg, IDC_FILELIST),
LB_DELETESTRING, iLBItem, 0);
// If this is not the last item, set the selection to
// the item immediately following the one just deleted.
// Otherwise, set the selection to the last item.
if (cStringsRemaining > iLBItem)
{
SendMessage(GetDlgItem(hDlg, IDC_FILELIST),
LB_SETCURSEL, iLBItem, 0);
}
else
{
SendMessage(GetDlgItem(hDlg, IDC_FILELIST),
LB_SETCURSEL, cStringsRemaining, 0);
}
}
return TRUE;
case IDCANCEL:
// Destroy the dialog box.
EndDialog(hDlg, TRUE);
return TRUE;
default:
return FALSE;
}
default:
return FALSE;
}
}
関連トピック