Guide pratique pour créer une zone de liste simple
Cette rubrique montre comment initialiser et récupérer des éléments à partir d’une zone de liste simple.
L’exemple de code C++ de cette rubrique inclut une procédure de boîte de dialogue qui remplit une zone de liste avec des informations sur les joueurs d’une équipe sportive. Lorsque l’utilisateur sélectionne le nom d’un joueur dans la liste, des informations sur le lecteur s’affichent dans la boîte de dialogue. Le style de fenêtre de la zone de liste inclut LBS_SORT, ce qui entraîne une liste triée d’éléments. La capture d’écran suivante montre la boîte de dialogue.
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
L’application doit effectuer les tâches suivantes liées à la zone de liste :
- Initialiser la zone de liste
- Récupérer la sélection de l’utilisateur à partir de la zone de liste
Dans l’exemple de code C++ suivant, les informations sur les joueurs sont stockées dans un tableau de structures. Pendant l’initialisation, la procédure de boîte de dialogue utilise le message LB_ADDSTRING pour ajouter les noms des membres de l’équipe à la zone de liste (IDC_LISTBOX_EXAMPLE) un par un. Il utilise également le message LB_SETITEMDATA pour ajouter l’index de tableau du lecteur à la zone de liste en tant que données d’élément. Plus tard, lorsque l’utilisateur sélectionne un lecteur dans la zone de liste, la procédure de boîte de dialogue utilise le message LB_GETITEMDATA pour récupérer l’index de tableau correspondant. Il utilise ensuite l’index du tableau pour récupérer les informations du lecteur à partir du tableau.
typedef struct
{
TCHAR achName[MAX_PATH];
TCHAR achPosition[12];
int nGamesPlayed;
int nGoalsScored;
} Player;
Player Roster[] =
{
{TEXT("Haas, Jonathan"), TEXT("Midfield"), 18, 4 },
{TEXT("Pai, Jyothi"), TEXT("Forward"), 36, 12 },
{TEXT("Hanif, Kerim"), TEXT("Back"), 26, 0 },
{TEXT("Anderberg, Michael"), TEXT("Back"), 24, 2 },
{TEXT("Jelitto, Jacek"), TEXT("Midfield"), 26, 3 },
{TEXT("Raposo, Rui"), TEXT("Back"), 24, 3},
{TEXT("Joseph, Brad"), TEXT("Forward"), 13, 3 },
{TEXT("Bouchard, Thomas"), TEXT("Forward"), 28, 5 },
{TEXT("Salmre, Ivo "), TEXT("Midfield"), 27, 7 },
{TEXT("Camp, David"), TEXT("Midfield"), 22, 3 },
{TEXT("Kohl, Franz"), TEXT("Goalkeeper"), 17, 0 },
};
INT_PTR CALLBACK ListBoxExampleProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Add items to list.
HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);
for (int i = 0; i < ARRAYSIZE(Roster); i++)
{
int pos = (int)SendMessage(hwndList, LB_ADDSTRING, 0,
(LPARAM) Roster[i].achName);
// Set the array index of the player as item data.
// This enables us to retrieve the item from the array
// even after the items are sorted by the list box.
SendMessage(hwndList, LB_SETITEMDATA, pos, (LPARAM) i);
}
// Set input focus to the list box.
SetFocus(hwndList);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
case IDC_LISTBOX_EXAMPLE:
{
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
{
HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);
// Get selected index.
int lbItem = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0);
// Get item data.
int i = (int)SendMessage(hwndList, LB_GETITEMDATA, lbItem, 0);
// Do something with the data from Roster[i]
TCHAR buff[MAX_PATH];
StringCbPrintf (buff, ARRAYSIZE(buff),
TEXT("Position: %s\nGames played: %d\nGoals: %d"),
Roster[i].achPosition, Roster[i].nGamesPlayed,
Roster[i].nGoalsScored);
SetDlgItemText(hDlg, IDC_STATISTICS, buff);
return TRUE;
}
}
}
return TRUE;
}
}
return FALSE;
}
Rubriques connexes