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_DBLCLKItem wurde doppelt angeklickt (oder Returntaste)
LBN_SELCANCELAnwender hat Selektion abgebrochen
LBN_SELCHANGEDas selektierte Item wurde gewechselt

Aktionen

Hinzufügen und Entfernen von Einträgen

NachrichtwParamlParamRückgabe
LB_ADDSTRING 0 Zeiger auf den StringIndex 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.

NachrichtwParamlParamRückgabe
LB_SETITEMDATA Index des Items4-Byte-DataBei Fehler LB_ERR
LB_GETITEMDATA Index des Items NULL 4-Byte-Data


Homepage - Windows-API-Programmierung (C) Copyright 1999 Arnold Willemer