|
duci
Forum Admin
 173 Posts |
Posted - 07/18/2005 : 17:11:57
|
Controale Butoanele, casetele de editare, barele de urmărire (scroll bars) sunt definite ca controale (controls). Controalele sunt ferestre create obisnuit (folosind CreateWindow) dar cu aspect si utilitate comună cărora li se asociază în plus funcții specifice si cuvintele cheie asociate, operate în special cu functia SendMessage().
Casetele listă (list box)
Casetele listă pot fi de două feluri, cu selecție unică sau cu selectie multiplă si sunt declarate ca ferestre folosind functia CreateWindow sau în fisierul de resurse:
LISTBOX 100, 7,68, 142, 124, LBS_HASSTRINGS | WS_VSCROLL | WS_CAPTION 100 este numărul de ordine al ferestrei (de tip HMENU), care poate fi echivalat cu un cuvânt (de exemplu IDC_LIST) în fisierul resurse.h:
#define IDC_LIST 100, 7,68, 142, 124 sunt pozitia x,y si dimensiunea xy. Urmează stilul, care permite prezenta sirurilor de caractere si ascensor de vizualizare precum si o eticheta a ferestrei. Adaugarea de elemente Adaugarea de elemente se poate face, folosind sirurile de caractere si eventual instructiunea sprintf():
int index=SendDlgItemMessage(hwnd,IDC_LIST,LB_ADDSTRING,0,(LPARAM)"Scriem ceva!"); Dacă lista are are stilul LBS_SORT, noul item va fi inserat la pozitia alfabetică corespunzatoare, daca nu, la sfârsitul listei.
Oricum, variabila index va contine numarul de ordine al itemului, si putem sa efectuam diferite operatii pe baza lui, de exemplu:
SendDlgItemMessage(hwnd, IDC_LIST, LB_SETITEMDATA, (WPARAM)index, (LPARAM)nTimes); Notificari Scopul declarat al listelor este selectarea unui item din lista, care se poate face folosind mesajul LBN_SELCHANGE, care ne pune că lista este modificată de utilizator. este receptionat prin intermediul mesajului WM_COMMAND si poate proveni din meniuri sau actionarea mouse-lui.
Codul de notificare este trimis ca HIWORD(wParam), cealalta jumatate a mesajului care ne-a dat anterior numarul de identificare al controlului (LOWORD(wParam)).
case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_LIST: // E vorba de lista noastră, verificăm codul de notificare switch(HIWORD(wParam)) { case LBN_SELCHANGE: // S-a schimbat selecția. break; } break; // ... alte controale } break;
Extragerea datelor din lista Dacă avem o lista de selectie unica, trimitem mesajul LB_GETCURSEL pentru a regasi indicele itemului selectat.
Pentru o listă cu selectii multiple, avem nevoie de un fisier tampon pentru a salva indicii:
HWND hList = GetDlgItem(hwnd, IDC_LIST); int count = SendMessage(hList, LB_GETSELCOUNT, 0, 0);
Apoi vom aloca o zona de memorie bazata pe numărul de item si vom umple acest spatiu folosind mesajul LB_GETSELITEMS.
int *buf = GlobalAlloc(GPTR, sizeof(int) * count); SendMessage(hList, LB_GETSELITEMS, (WPARAM)count, (LPARAM)buf); GlobalFree(buf); Actiuni care folosesc numărul de ordine al indicilor
In tacest exemplu, buf[0] este primul indice, iar ultimul indice este buf[count - 1].
Dacă dorim să regasim sirul de caractere asociat unui indice:
int data = SendMessage(hList, LB_GETITEMDATA, (WPARAM)index, 0); Casetele de editare
Pentru câmpuri de editare formate dintr-o singura linie, avem exemplul mai sus, cu doua câmpuri. Crearea câmpurilor se poate face în fisierul de resurse, iar mesajele sunt procesate folosind SendDlgItemMessage().
GetDlgItemText si GetWindowText au ca parametri sirul de caractere unde se depune informatia si lungimea acestui sir de caractere.
Prof.Dr. D. Ciurchea
|
|