Erstellen eines einfachen Listenfelds
In diesem Thema wird veranschaulicht, wie Elemente initialisiert und aus einem einfachen Listenfeld abgerufen werden.
Das C++-Codebeispiel in diesem Thema enthält eine Dialogfeldprozedur, die ein Listenfeld mit Informationen zu Spielern in einem Sportteam ausfüllt. Wenn der Benutzer den Namen eines Spielers aus der Liste auswählt, werden Informationen zum Player im Dialogfeld angezeigt. Das Fensterformat für das Listenfeld enthält LBS_SORT, was zu einer sortierten Liste von Elementen führt. Der folgende Screenshot zeigt das Dialogfeld.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Programmierung der Windows-Benutzeroberfläche
Anweisungen
Die Anwendung muss die folgenden Listenfeld-bezogenen Aufgaben ausführen:
- Initialisieren des Listenfelds
- Abrufen der Benutzerauswahl aus dem Listenfeld
Im folgenden C++-Codebeispiel werden Informationen zu Playern in einem Array von Strukturen gespeichert. Während der Initialisierung verwendet die Dialogfeldprozedur die meldung LB_ADDSTRING , um dem Listenfeld (IDC_LISTBOX_EXAMPLE) nacheinander die Namen von Teammitgliedern hinzuzufügen. Außerdem wird die LB_SETITEMDATA Meldung verwendet, um dem Listenfeld den Arrayindex des Players als Elementdaten hinzuzufügen. Wenn der Benutzer später einen Player aus dem Listenfeld auswählt, verwendet die Dialogfeldprozedur die LB_GETITEMDATA Meldung, um den entsprechenden Arrayindex abzurufen. Anschließend wird der Arrayindex verwendet, um Spielerinformationen aus dem Array abzurufen.
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;
}
Zugehörige Themen