Comment créer une liste d’annuaires dans un ListBox à sélection unique
Cette rubrique montre comment utiliser une zone de liste à sélection unique pour afficher et accéder au contenu d’un répertoire. La zone de liste à sélection unique est le type de zone de liste par défaut. Un utilisateur ne peut sélectionner qu’un seul élément à la fois à partir d’une zone de liste à sélection unique.
L’exemple de code C++ de cette rubrique permet à un utilisateur d’afficher une liste de fichiers dans le répertoire actif, de sélectionner un fichier dans la liste et de le supprimer.
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
L’application de liste d’annuaires doit effectuer les tâches liées à la zone de liste suivantes :
- Initialisez la zone de liste.
- Récupérez la sélection de l’utilisateur à partir de la zone de liste.
- Supprimez le nom du fichier de la zone de liste une fois le fichier sélectionné supprimé.
Dans l’exemple de code C++ suivant, la procédure de boîte de dialogue initialise la zone de liste à sélection unique (IDC_FILELIST) à l’aide de la fonction DlgDirList pour remplir la zone de liste avec les noms de tous les fichiers du répertoire actif. Lorsque l’utilisateur sélectionne un fichier et choisit le bouton Supprimer , la fonction DlgDirSelectEx récupère le nom du fichier sélectionné. Le code supprime le fichier à l’aide de la fonction DeleteFile et met à jour la zone de liste du répertoire en envoyant le message 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;
}
}
Rubriques connexes