Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Controale de tip lista
Controalele de tip lista sunt oferite in 4 forme: casete combinate (Combo Box), casete cu lista (List Box), arbori (Tree Control) si respectiv controale lista (List Control). La adaugarea controalelor de tip lista, este foarte importanta selectarea proprietatilor de stil adecvate, o alegere nefericita a acestora putand altera semnificativ aspectul listei.
Un control de tip caseta combinata (Combo Box) este compus in general din 3 controale: o caseta de editare, o caseta cu lista si un buton. Casetele combinate realizeaza afisarea unei liste de optiuni, permitand selectarea unei singure optiuni. Elementul selectat va fi intotdeauna vizibil, fiind afisat in partea superioara a controlului.
Exista trei tipuri de casete combinate:
simple - imbina o caseta de editare si o caseta lista. Lista este intotdeauna vizibila si elementul selectat este afisat in caseta de editare;
derulante - imbina o caseta de editare cu buton si o caseta cu lista. Caseta cu lista este vizibila numai la efectuarea unui click pe buton;
liste derulante - imbina o etichta statica cu un buton si o caseta cu lista. Este aproximativ similara cu caseta derulanta, dar utilizatorul nu poate introduce date in cadrul controlului;
Tipul casetei se selecteaza la optiunea Styles a casetei de dialog Combo Box Properties.
Cum controalele de tip lista sunt utilizate pentru afisarea si selectia elementelor, este nevoie ca acestea sa fie populate cu date. Caseta combinata este singurul control de tip lista care poate fi populata cu elemente din cadrul editorului de resurse. Aceasta se realizeaza prin intermediul paginii Data a casetei Combo Box Properties. Elementele listei pot fi introduse manual in caseta Enter ListBox Items, inserarea lor fiind validata prin apasarea Ctrl-Enter. Caseta de inserare se inchide la apasarea Enter. Acest mod este un mod trivial de populare a casetei combinate. In general, caseta este populata prin program, in marea majoritate a cazurilor in functia OnInitDialog(). Clasa MFC care incapsuleaza casetele combinate este CComboBox. Aceasta clasa contine mai multe functii pentru manipularea casetelor combinate, dintre care cele mai uzuale sunt prezentate mai jos:
Functie |
Descriere |
GetCurSel |
Returneaza pozitia curenta a indexului |
AddString DeleteString InsertString ResetContent Dir |
Adauga un element fie la sfarsitul listei, fie in pozitia corespunzatoare ordonarii; Sterge un element; Insereaza un element in pozitia specificata; Inlatura complet toate elementele din lista; Populeaza lista cu numele fisierelor |
Regasirea fiecarui element in lista se face pe baza unui indice asociat, primul element avand indicele 0.
Controlul arbore (Tree Control) este utilizat pentru afisarea si selectarea informatiilor intr-un mod ierarhic. Clasa CTreeCtrl include functiile pentru manipularea controalelor de arbore, cateva dintre acestea sunt urmatoarele:
Functia |
Rolul |
InsertItem DeleteItem DeleteAllItems |
Insereaza un element, fie ca radacina, fie ca element subordonat, in functie de parametrii transmisi; Sterge elementul specificat Sterge toate elementele din arbore; |
Controalele de tip caseta cu lista (List Box) sunt in general casete care contin liste de elemente. Spre deosebire de casetele combinate si de controalele tip arbore, care permit numai selectia singulara, casetele cu liste permit urmatoarele tipuri de selectii:
Selectie |
Descriere |
Singulara Multipla Extinsa Dezactivata |
Selectia elementelor este mutual exclusiva. Poate fi selectat la un moment dat un singur element, iar selectia lui duce la anularea selectiei anterioare; Pot fi selectate mai multe elemente, utilizand mouse-ul in combinatie cu Ctrl si Shift; Similar selectiei multiple, pot fi selectate mai multe elemente, dar selectia lor se poate face si prin selectare cu mouse-le, tinand butonul stang apasat; Nu poate fi selectat nici un element; |
La fel ca si in cazul casetelor combinate, ordinea alfabetica de afisare a elementelor este selectata implicit. Pentru anularea acestei optiuni, in caseta Styles se deselecteaza optiunea Sort.
Actiunile efectuate de utilizator asupra controalelor din caseta cu lista au ca efect transmiterea unor mesaje corespunzatoare catre caseta de dialog. Unul din mesaje este LBN_SELCHANGE care este trimis in cazul in care unul dintre elementele selectate se modifica. Modul in care se opereaza cu o selectie difera dupa cum controlul permite sau nu selectia multipla.
Controalele lista (List Control) sunt cele mai complexe controale dintre cele 4 tipuri de controale, putand afisa atat pictograme cat si etichete asociate si putand opera in unul din cele 4 moduri de mai jos:
Mod |
Descriere |
Pictograme Pictograme mici Lista Raport |
Afiseaza pictograme mari, de 32x32 pixeli, cu etichete plasate sub fiecare pictograma. Elementele sunt plasate de stanga la dreapta si de sus in jos; Afiseaza pictograme mici, de 16x16 pixeli, cu etichete plasate la stanga fiecarei pictograme. Elementele sunt plasate de la stanga la dreapta si de sus in jos; Afisarea este similara modului cu pictograme mici, dar elementele sunt plasate de sus in jos si apoi de la stanga la dreapta; Afiseaza informatiile prin intermediul unor coloane din antet; |
Clasa care incapsuleaza functiile controlului lista este CListCtrl. Clasa ofera o serie de metode, din care cele mai utilizate sunt:
Metoda |
Descriere |
InsertColumn DeleteColumn InsertItem DeleteItem DeleteAllItems SetItemText GetItemText |
Adauga o coloana intr-o anumita pozitie; Sterge o coloana; Adauga un nou element; Sterge un element; Sterge toate elementele; Stabileste continutul textual al unei parti dintr-un element; Citeste textul inscris intr-un element; |
Primul parametru al metodei InsertColumn() reprezinta numarul coloanei, al doilea eticheta coloanei, al treilea modul de aliniere a textului in cadrul coloanei, iar al patrulea, latimea initiala a coloanei. Alinierea poate fi LVCFMT_LEFT, LVCFMT_CENTER si LVCFMT_RIGHT.
Exemplul 1. Sa se realizeze proiectul Proj. 1 care populeaza o caseta combinata cu zilele saptaminii.
a. Se insereaza eticheta statica asociata si caseta combinata cu buton (Combo Box); se denumeste caseta combinata IDC_SAPTAMANA, la Styles->Type se selecteaza Drop list, se deselecteaza optiunea Sort de la Styles.
b. Prin intermediul Class Wizard se asociaza o variabila care sa stocheze continutul controlului, astfel: se selecteaza pagina Member Variables, in caseta Class Name trebuie sa fie selectat CProj1Dlg, in caseta Control Ids se selecteaza IDC_SAPTAMANA, se apasa Add Variable, in caseta Add Variable se selecteaza la Category: Control si se verifica daca la Type este CComboBox, la Member Variable Name se introduce m_cbSaptamana. In acest moment, continutul casetei combinate va putea fi stocat in variabila de control m_cbSaptamana.
c. Se populeaza caseta cu primele 4 zile ale saptamanii de la Combo Box Properties->Data->Enter Listbox Items, inserarea datelor fiind validata prin apasarea Ctrl-Enter.
d. Se adauga la clasa CProj1Dlg functia membru PopulateCombo() de tip void, astfel:
void CProj1Dlg::PopulateCombo()
e. Se adauga o linie in OnInitDialog() ca mai jos, pentru a apela functia PopulateCombo():
BOOL CProj1Dlg::OnInitDialog()
f. Se insereaza cu ajutorul meniului contextual la clasa CProj1Dlg o variabila de tip CString numita m_strSelect
g. Se asociaza cu ajutorul Class Wizard casetei IDC_SAPTAMANA la aparitia mesajului CBN_SELCHANGE functia OnSelchangeSaptamana().
void CProj1Dlg::OnSelchangeSaptamana()
Observatii:
1. Cum scopul utilizarii casetei combinate este de a selecta un element din cele continute de caseta, continutul selectat trebuie sa poata fi preluat din caseta. In mod normal, preluarea elementului trebuie sa se faca ori de cite ori selectia este schimbata. Acest lucru este posibil prin interceptarea mesajului CBN_SELCHANGE.
2. Metodele asociate clasei CComboBox utilizate mai sus pot intoarce doua mesaje de eroare: CB_ERR, ceea ce inseamna aparitia unei erori la apelul metodei, sau CB_ERRSPACE care inseamna ca spatiul disponibil este insuficient pentru manipularea sirurilor (la metodele care lucreaza cu siruri ca AddString, InsertString, etc).
3. Functia de mai sus (pct. g) defineste intregul nIndex in care se salveaza valoarea indexului elementului selectat in lista. Daca indexul este corect se extrage continutul elementului referit de acel index si se stocheaza in variabila m_strSelect, prin intermediul metodei GetLBText() a clasei CComboBox:
void GetLBText(int nIndex,CString& rString) const; - functia salveaza in sirul referit de rString continutul elementului de index nIndex din caseta combinata.
Exemplul 2. Se va realiza proiectul Proj2 care contine un control de tip arbore populat cu zilele saptamanii si lunile anului.
a. Se insereaza eticheta statica Ziua/Luna si caseta de arbore pentru care se introduce IDC_ZIUALUNA, se selecteaza la Styles: Has Buttons, Has Lines si Lines as Root.
b. Se asociaza o variabila de tip CTreeCtrl controlului arbore inserat in macheta, astfel: in Class Wizard, la Member Varaibles se selecteaza la Class Name CProj2Dlg si la Control Ids IDC_ZIUALUNA, se apasa Add Variable, se insereaza variabila m_treeZiualuna de tipul CTreeCtrl si Category: Control.
c. Pentru populare, se introduce in functia CProj2Dlg:: OnClickZiualuna() corespunzatoare evenimentului NM_Click linia PopulateTree(). Functia PopulateTree are implementarea de mai jos:
void CProj2Dlg::PopulateTree()
Observatii:
La inceput se elimina toate elementele existente in arbore. Apoi se insereaza ca noduri ale arborelui zilele saptamanii prin intermediul functiei InsertItem().
Exemplul 3. Se realizeaza proiectul Proj3 care combina doua casete combinate si o caseta arbore care contine doua directoare: "Ziua" si "Luna". Popularea casetei arbore se face la selectarea unui element din caseta combinata.
Se parcurg pasii de la problemele anterioare cu diferenta ca functia MessageBox din functia OnSelchangeSaptamana() se inlocuieste cu functia PopulateTree(). Analog, pentru a doua caseta combinata IDC_LUNA se implementeaza functia OnSelchangeLuna() in care se apeleaza functia PopulateTree(). Functia PopulateTree() se implementeaza astfel:
void CProj1Dlg::PopulateTree()
for(i=0;i<m_cbLuna.GetCount();i++)
Observatie
Functia int GetCount( ) const; - furnizeaza numarul de elemente din caseta combinata.
Exemplul 4. Sa se adauge la proiectul anterior un control lista (List Box) care sa afiseze fie elementele din directorul Ziua fie elementele din directorul Luna in functie de selectia din controlul arbore.
a. Se insereaza un control lista IDC_LISTAZIUALUNA astfel incat la Styles optiunea No Integral Height sa fie selectata iar in caseta Selection sa fie selectat Extended.
b. Se asociaza o variabila, m_lbZiualuna, casetei lista, utilizand Class Wizard. Variabila va fi de tipul CListBox, Category: Control.
c. Se asociaza mesajului TVN_SELCHANGE functia OnSelchangedZiualuna astfel:
void Cproj3Dlg::OnSelchangedZiualuna(NMHDR* pNMHDR, LRESULT* pResult)
if (text=='Luna')
*pResult = 0;
d. Se introduce variabila membru m_strList de tipul CStringList in clasa Cproj3Dlg.
e. Se adauga functia corespunzatoare mesajului LBN_SELCHAGE asociat controlului IDC_LISTZIUALUNA numita OnSelchangeListziualuna():
void CProj2Dlg:: OnSelchangeListziualuna ()
delete [] pItems;
f. Pentru ca sa vedem elementele selectate continute in variabila m_strList se va introduce un nou control de tip lista numit IDC_AFISARE caruia i se asociaza variabila de tip CListBox m_lbList si la evenimentul LBN_SETFOCUS functia OnSetfocusAfisare(), astfel:
void CProj3Dlg::OnSetfocusAfis()
Observatii
Optiunile de la punctul a. vor avea ca efect afisarea unui numar intreg de linii in caseta. In caz contrar, ar aparea linii neafisate integral.
Actiunile efectuate de utilizator asupra controalelor din caseta cu lista au ca efect transmiterea unor mesaje corespunzatoare catre caseta de dialog. Unul din mesaje este LBN_SELCHANGE care este trimis in cazul in care unul dintre elementele selectate se modifica. Modul in care se opereaza cu o selectie difera dupa cum controlul permite sau nu selectia multipla. Cum caseta cu lista permite selectia multipla, functia de tratare a mesajului va trebui sa creeze o lista a elementelor selectate in interiorul unei variabile de tip CStringList, pe care o vom numi m_strList.
Apelul metodei GetSelCount() a clasei CListBox va intoarce in variabila utilizata numarul elementelor selectate. Aceasta metoda poate fi utilizata numai in cazul controalelor care permit selectie multipla.
In functia :: OnSelchangeListziualuna() se genereaza un vector de intregi care va stoca indicii elementelor selectate. Dimensiunea acestui vector trebuie sa fie egala cu nSelCount. Variabila pItems este un pointer la intreg si este initializata cu adresa de inceput a vectorului. Vectorul este completat cu indexul elementelor selectate furnizat de metoda GetSelItems(). Pe baza indexului din vector numele elementelor selectate este extras si stocat in lista m_strList de catre metoda GetText(). Fiecare nume este adaugat la sfirsitul listei cu AddTail()
Sa studieze cu ajutorul Help-ului functiile continute de punctul g.
Exemplul 4. Sa se insereze in proiectul anterior un control de tip lista (List Control) care pentru fiecare director afiseaza initiala pentru fiecare element si indexul zilei/ lunii in lista respectiva.
a. Se insereaza controlul de tip CListCtrl IDC_DETALII avind la Styles ->View tipul Report.
b. Prin intermediul Class Wizard se asociaza controlului variabila m_lcDetalii de tip CListCtrl, avand Category: Control.
c. Popularea controlului se face prin intermediul functiei PopulateListControl() apelata in OnSelchangeListziualuna().
d. Se adauga in functia OnInitDialog() codul ingrosat de mai jos:
BOOL CProj3Dlg::OnInitDlg()
e. Se implementeaza functia PopulateListControl() astfel:
void CProj3Dlg::PopulateListControl()
}
Observatii:
Primul parametru al metodei InsertColumn() reprezinta numarul coloanei, al doilea eticheta coloanei, al treilea modul de aliniare al textului in cadrul coloanei iar al patrulea latimea initiala a coloanei. Alinierea poate fi LVCFMT_LEFT, LVCFMT_CENTER si , LVCFMT_RIGHT.
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate