Windows Programmierung: Listbox
|
Einführende Informationen
über die Programmierung von Kontrollelementen werden hier vorausgesetzt.
Stile: Eigenschaften einer Listbox
Die Eigenschaftsflags sind im Ressourcen-Editor oder als Parameter
bei CreateWindow anzugeben und bestimmen das Erscheinungsbild
der Listbox bis zu ihrer Zerstörung.
Mehrfachselektion
Die normale Listbox läßt nur eine einfache Selektion
zu. Das erleichtert die Programmierung und auch die Logik des
Programmes erheblich. An vielen Stellen kann es aber die Benutzbarkeit
des Programmes um ein Vielfaches erhöhen, wenn man eine Mehrfachselektion
anbietet.
LBS_MULTIPLESEL ermöglicht die Mehrfachselektion. Das Verhalten
wird aber die meisten Windows-Anwender irritieren. Sie werden eher
mit der zusätzlichen Eigenschaft LBS_EXTENDEDSEL zufrieden sein.
Sortierung
Durch den Stil LBS_SORT wird die Listbox Neuzugänge alphabetisch
einsortieren. Viele Ressource-Editoren geben diesen Stil vor.
Die tatsächliche Position des neuen Eintrags erfährt man aus
dem Rückgabewert der entsprechenden Funktionen.
Größenanpassung
Eine normale Listbox wird in ihrer Größe so ausgerichtet,
daß es keine halben Zeilen gibt. In manchen Fällen ist
das aber erwünscht. Beispielsweise wenn eine Listbox ein Fenster
vollständig ausfüllen soll.
Hier hilft die Eigenschaft LBS_NOINTEGRALHEIGHT.
Ereignisempfang vorbereiten
Sehr wichtig ist die Eigenschaft LBS_NOTIFY. Nur Listboxen mit dieser
Eigenschaft erhalten bestimmte Nachrichten wie
LBN_DBLCLK,
LBN_SELCANCEL und
LBN_SELCHANGE.
Ereignisbehandlung
Auf die meisten Ereignisse im Zusammenhang mit einer Listbox
erhält man eine Nachricht WM_COMMAND. Die Listbox-ID steht im Low-Word
von wParam, die eigentliche Nachricht im High-Word. Hier ein Ausschnitt aus
der Fensterfunktion, die einen Doppelklick und einen Selektionswechsel
auswertet:
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_LISTBOX:
switch (HIWORD(wParam)) {
case LBN_DBLCLK:
ListIndex = SendMessage(hListe, LB_GETCURSEL, 0, 0);
Person = (tPerson *)SendMessage(hListe, LB_GETITEMDATA, ListIndex, 0);
EndDialog(hWnd, IDOK); // simuliere Ende der Dialogbox
return TRUE;
case LBN_SELCHANGE:
// lParam enthaelt die hwnd der listbox
ListIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
LBN_DBLCLK | Item wurde doppelt angeklickt (oder Returntaste) |
LBN_SELCANCEL | Anwender hat Selektion abgebrochen |
LBN_SELCHANGE | Das selektierte Item wurde gewechselt |
Aktionen
Hinzufügen und Entfernen von Einträgen
Nachricht | wParam | lParam | Rückgabe |
LB_ADDSTRING | 0 | Zeiger auf den String | Index des neuen Items, bei Fehler LB_ERR |
LB_INSERTSTRING | Zielindex des Items, -1 für hinten | Zeiger auf den String | bei Fehler LB_ERR |
LB_DELETESTRING | Index des Items | 0 | bei Fehler LB_ERR |
LB_RESETCONTENT | 0 | 0 | bei Fehler LB_ERR |
AddString hängt Einträge hinten an, sofern die Listbox nicht den Style LBS_SORT besitzt.
ResetContent löscht alle Einträge der Liste.
Daten hinterlegen
Damit man den Listbox-Einträgen Programmdaten eindeutig zuordnen kann,
ist es möglich, jedem Eintrag einen 4-Byte-Wert hinzuzufügen: genug
für einen Zeiger auch auf größere Datenobjekte.
Nachricht | wParam | lParam | Rückgabe |
LB_SETITEMDATA | Index des Items | 4-Byte-Data | Bei Fehler LB_ERR |
LB_GETITEMDATA | Index des Items | NULL | 4-Byte-Data |