Programmierung von Kontrollelementen |
Die Kontrollelemente besitzen einige Gemeinsamkeiten. Es aus Sicht von Windows lediglich spezialisierte Fenster und gehorchen gleichen Gesetzen.
Element | Fensterklasse | Stil-Präfix |
---|---|---|
Staticfeld | "STATIC" | SS_ |
Schaltfläche (Button) | "BUTTON" | BS_ |
Eingabefeld | "EDIT" | ES_ |
Listbox | "LISTBOX" | LBS_ |
Combobox | "COMBOBOX" | CBS_ |
Scrollbar | "SCROLLBAR" | SBS_ |
Baumdiagramm | WC_TREEVIEW | TVS_ |
ListView | WC_LISTVIEW | LVS_ |
Ein Beispiel zur Erzeugung eines Eingabefeldes:
CreateWindow("EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER, 10, 50, 300, 30, // Positionen auf dem Elternfenster hWnd, (HMENU)ID_MYCONTROL, hInst, 0); |
Bei den Common Controls sollte noch der Aufruf von InitCommonControls() erfolgen. In der neueren Variante und lautet z. B. für Tree Views:
INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_TREEVIEW_CLASSES; InitCommonControlsEx(&icc); |
Ein Include von "commctrl.h" ist obligatisch.
LOWORD(wParam) enthält die Ressource-ID
HIWORD(wParam) beschreibt das Ereignis
case WM_COMMAND: switch(LOWORD(wParam)) { // welches Kontrollelement loest die Nachricht aus? case ID_MYCONTROL: switch (HIWORD(wParam)) { // welches Ereignis ist genau eingetreten? case LBN_DBLCLK: // ein Doppelklick auf eine Listbox break; case LBN_SELCHANGE: |
Einige der neueren Kontrollelemente verwenden nicht die Nachricht WM_COMMAND, sondern WM_NOTIFY. Bei diesem Ereignis wird im lParam ein Pointer auf eine Struktur NMHDR übergeben, die in den ersten Elementen bei allen Kontrolls gleich sind. Sie enthalten:
HWND hwndFrom | Das HWND des Kontrollelements |
UINT idFrom | Die Ressource-ID des Kontrollelements |
UINT code | Der Code des Ereignisses |
Eine typische Bearbeitung der Ereignisse sieht also so aus:
LPNMHDR hdr; case WM_NOTIFY: hdr = (LPNMHDR)lParam; switch(hdr->code) { // unterscheide den Notify-Code |
Im Beispiel werden die Daten, die hinter dem ausgewählten Listboxelement abgelegt sind, angefragt. Dies benötigt zwei Schritte. Erst muß ermittelt werden, welches Element selektiert ist und anschließend erfragt man die Daten. Beide Vorgänge werden durch die Funktion SendMessage ausgelöst. Im ersten Parameter wird das HWND des Kontrollelements benoetigt, im Beispiel hListe. Der zweite Parameter enthält das Kommando. Das ist LB_CURSEL zum Ermitteln des aktuell selektierten Element und LB_GETITEMDATA zur Frage nach den Daten. Die folgenden beiden Parameter entsprechen dem wParam und lParam aus der Fensterfunktion.
ListIndex = SendMessage(hListe, LB_GETCURSEL, 0, 0); Person = (tPerson *)SendMessage(hListe, LB_GETITEMDATA, ListIndex, 0); |
Homepage - Windows-API-Programmierung | (C) Copyright 1999 Arnold Willemer |