Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Controalele de tip lista sunt oferite sub patru forme: casete combinate, casete cu lista, arbori si controale lista. Fiecare tip de control este destinat unui anumit scop in programare. La adaugarea controalelor lista in cadrul casetelor de dialog este importanta selectarea proprietatilor de stil adecvate, deoarece acestea pot altera substantial atat aspectul cat si comportamentul controlului. De exemplu, selectia multipla poate fi permisa atat pentru casetele cu lista cat si pentru controalele lista, iar stilul Drop List pentru casetele combinate activeaza functionalitatea de caseta de editare, in timp ce stilul Dropdown o dezactiveaza.
Un control caseta combinata se numeste astfel deoarece reprezinta o combinatie de controale: o caseta de editare, o caseta cu lista si un buton. Casetele combinate se folosesc pentru a afisa o serie de optiuni, permitand selectarea uneia singure. Casetele combinate se disting intre controalele de tip lista prin aceea ca elementul selectat este intotdeauna vizibil, fiind afisat in partea superioara a controlului.
Exista trei tipuri de caste combinate, asa cum o arata tabelul 1. Tipul unei casete combinate se stabileste in cadrul paginii Styles a castei de dialog Combo Box Properties.
Tip de caseta |
Descriere |
Simpla |
Imbina o caseta de editare si o caseta cu lista. Lista este intotdeauna vizibila iar elementul selectat este afisat in caseta de editare. |
Derulanta |
Imbina o caseta de editare cu un buton si o caseta cu lista. Caseta cu lista este vizibila numai la efectuarea unui click pe buton. |
Lista derulanta |
Imbina o eticheta statica cu un buton si o caseta cu lista. Acest tip este similar cu caseta derulanta, deosebirea constand in faptul ca utilizatorul nu poate introduce date in cadrul controlului. |
In proiectul pe care-l vom crea, numit Lists, vom utiliza o caseta combinata pentru a permite selectarea unui director principal, care va fi apoi inspectat pentru a inscrie in celelalte controale din caseta de dialog informatii privind subdirectoarele si fisierele continute.
Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse si inlaturati eticheta TODO.
Inlaturati butonul Cancel si modificati pozitia butonului OK, plasandu-l in coltul dreapta jos al casetei de dialog.
Selectati pictograma etichetei statice de pe bara cu instrumente Controls, dupa care adaugati un control eticheta in partea superioara stanga a casetei de dialog. Introduceti Main Directory pe post de eticheta.
Selectati pictograma etichetei statice de pe bara cu instrumente Controls, dupa care adaugati un astfel de control in dreapta etichetei Main Directory. Introduceti IDC_MainDir in caseta combinata ID si extindeti lungimea casetei combinate pana in marginea din dreapta a casetei de dialog.
Selectati pagina Styles si alegeti Drop List in cadrul casetei combinate Type.
La adaugarea unei casete combinate intr-o caseta de dialog, optiunea Sort este selectata implicit. Aceasta inseamna ca elementele adaugate in caseta combinata vor fi afisate automat in ordine alfabetica. Pentru a inhiba acest comportament, selectati pagina Styles si deselectati optiunea Sort.
Odata adaugat controlul caseta combinata in cadrul casetei de dialog, apelati la Class Wizard pentru a atasa o variabila.
Apasati CTRL+W pentru a apela Class Wizard si selectati pagina Member Variables.
Selectati CListDlg din caseta combinata ClassName si IDC_MainDir din caseta cu lista Control Ids.
Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type este selectat CComboBox.
Introduceti m_cbMainDir in caseta Member Variable Name si apoi efectuati click pe OK.
Controlul arbore este unic prin aceea ca este singurul control orientat inspre afisarea de informatii ierarhice. Un control arbore este o structura stanga-dreapta. Un element din extremitatea stanga a arborelui se numeste nod radacina, iar un nod din extremitatea dreapta se numeste nod frunza, iar un nod aflat intre o radacina si o frunza se numeste nod ramificatie. Afisarea de linii care s conecteze elementele poate fi stabilita prin intermediul stilurilor. In mod implicit, controalele arbore permit selectarea unui singur element la un moment dat. Daca doriti sa acordati utilizatorului posibilitatea de a selecta simultan mai multe elemente dintr-un arbore, veti fi nevoiti sa scrieti cod in acest sens.
In cadrul proiectului Listsi va fi utilizat un control arbore pentru a afisa fisierele dintr-un director in ordine alfabetica. Veti cea cate un nod radacina pentru fiecare litera din alfabet si apoi veti insera elemente corespunzatoare fisierelor dub nodul adecvat.
Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.
Adaugati un control eticheta statica, numit Files, pe post de titlu pentru controlul arbore.
Selectati pictograma controlului arbore de pe bara cu instrumente Controls, dupa care adaugati un control arbore in partea stanga a casetei de dialog. Introduceti IDC_filesTree in caseta combinata ID.
Selectati pagina Styles si validati optiunile Has Buttons, Has Lines si Lines at Root.
Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.
Selectati CListDlg din caseta combinata ClassName si IDC_FilesTree din caseta cu lista Control Ids.
Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type este selectat CTreeCtrl.
Introduceti m_treeFiles in caseta Member Variable Name si apoi efectuati click pe OK.
In cea mai elementara forma a sa, o caseta cu lista consta dintr-o simpla lista de elemente, dar, spre deosebire de caseta combinata si de controlul arbore, o caseta cu lista poate permite atat selectarea elementelor individuale cat si selectii multiple. Sunt prezente patru tipuri de selectie prezentate in tabelul 2.
Tip de selectie |
Descriere |
Singulara |
Nu poate fi selectat decat un singur element. |
Multipla |
Pot fi selectate mai multe elemente utilizand mouse-ul in combinatie cu tastele Shift si Ctrl. |
Extinsa |
Asemanatoare cu selectia multipla, dar o multime de elemente poate fi selectata si prin incadrarea lor cu mouse-ul in timp ce butonul stang este apasat. |
Dezactivata |
Nu poate fi selectat nici un element. |
Proiectul Lists foloseste o caseta cu lista pentru a afisa o lista de subdirectoare. Dintre acestea pot fi selectate mai multe subdirectoare simultan, informatii suplimentare despre elementele selectate fiind afisate intr-un control lista. In proiectul nostru se va face referire la optiunea de stil No Integral Hight, care este deselectata pentru ca inaltimea controlului sa fie astfel calculata incat sa fie afisat un numar intreg de elemente. Daca lasati aceasta optiune selectata, este posibil ca in control sa fie afisate elemente partial.
Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.
Adaugati un control eticheta statica, numit Sub Directories, pe post de titlu pentru controlul caseta cu lista.
Selectati pictograma casetei cu lista de pe bara cu instrumente Controls, dupa care adaugati o caseta cu lista in partea dreapta a controlului arbore. Introduceti IDC_subDirs in caseta combinata ID.
Selectati pagina Styles si selectati Extended din caseta combinata Selection.
In cadrul paginii Styles deselectati optiunea No Integral Hight.
Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.
Selectati CListDlg din caseta combinata ClassName si IDC_subDirs din caseta cu lista Control Ids.
Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type este selectat CListBox.
Introduceti m_lbSubDirs in caseta Member Variable Name si apoi efectuati click pe OK.
Controlul lista are o denumire usor derutanta, pentru ca celelalte trei controale prezentate in acest laborator sunt de asemenea controale de tip lista. Si totusi, controlul de tip lista este cel mai complex dintre cele patru. Un control lista este in stare sa afiseze atat pictograme, cat si etichete asociate, si poate opera in oricare din cele patru moduri prezentate in tabelul 3.
Mod |
Descriere |
Pictograme |
Afiseaza pictograme mari (32*32 pixeli) cu etichete plasate sub fiecare pictograma. Elementele sunt plasate in ordine de la stanga la dreapta si apoi de sus in jos. |
Pictograme mici |
Afiseaza pictograme mici (16*16 pixeli) cu etichete plasate in dreapta fiecarei pictograme. Elementele sunt plasate in ordine de la stanga la dreapta si apoi de sus in jos. |
Lista |
Afisarea este similara cu modul de pictograme mici, dar elementele sunt plasate in ordine de sus in jos si apoi de la stanga la dreapta. |
Raport |
Afiseaza informatiile sub forma unor coloane ca antet. |
In cadrul proiectului Lists, controlul lista va fi utilizat pentru a afisa detalii privind directoarele selectate in caseta cu lista aflata deasupra sa in caseta de dialog. Controlul lista va avea trei coloane: prima coloana va contine numele directorului, cea de-a doua va afisa numarul de fisiere continute, iar cea de-a treia va afisa dimensiunea directorului.
Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.
Adaugati un control eticheta statica, numit Selected Directories Details, pe post de titlu pentru controlul lista.
Selectati pictograma controlului lista de pe bara cu instrumente Controls, dupa care adaugati acest control in partea dreapta a controlului arbore, sub caseta cu lista. Introduceti IDC_selectedDirs in caseta combinata ID.
Selectati pagina Styles si selectati Report din caseta combinata View.
Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.
Selectati CListDlg din caseta combinata ClassName si IDC_selectedDirs din caseta cu lista Control Ids.
Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type este selectat CListCtrl.
Introduceti m_lcDirDetail in caseta Member Variable Name si apoi efectuati click pe OK.
Deoarece controalele lista sunt orientate inspre afisarea si selectia elementelor de informatie, prima cerinta in programare este popularea acestor controale cu date. Fiecare informatie adaugata intr-un control de tip lista reprezinta un element. Desi mecanismele de inserare a elementelor prezinta similaritati, veti vedea ca fiecare claa de control are anumite particularitati.
Caseta combinata este singurul dintre cele patru controale de tip lista care poate fi populat cu elemente in cadrul editorului de resurse. Aceasta se realizeaza prin intermediul paginii Data a casetei de dialog Combo Box Properties. Astfel, fiecare element poate fi introdus in caseta Enter Listbox Items. Trebuie apasat Ctrl+Enter dupa fiecare element, pentru ca simpla apasare a tastei Enter va duce la inchiderea casetei de dialog. O astfel de populare a unei casete combinate nu este uzuala. In mod normal, casetele combinate sunt populate in momentul executiei, de multe ori in cadrul functiei OnInitDialog().
Clasa MFC care incapsuleaza casetele combinate este CComboBox. Aceasta clasa contine mai multe functii care se ocupa de adaugarea si inlaturarea elementelor. Acestea sunt prezentate in tabelul 4.
Tabelul 4: Functii de populare din clas CComboBox
Numele functiei |
Descriere |
AddString |
Adauga un element fie la sfarsitul listei, fie in pozitia corespunzatoare ordonarii. |
DeleteString |
Inlatura un element. |
InsertString |
Insereaza un element intr-o anumita pozitie. |
ResetContent |
Inlatura toate elementele existente. |
Dir |
Metoda speciala de populare pentru inserarea ca elemente a numelor de fisiere |
In cazul proiectului Lists, caseta combinata este populata in cadrul functiei OnInitDialog() a casetei de dialog. In acest scop creati mai intai o functie noua avand numele PopulateCombo() si tipul void, care va fi apelata in cadrul functiei OnInitDialog().
BOOL CListsDlg::OnInitDialog()
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//Initializam caseta combinata cu directoare principale
PopulateCombo();
return TRUE; // return TRUE unless you set the focus to a control
void CListsDlg::PopulateCombo()
Scopul unei casete combinate este sa permita selectarea uneia dintre elementele pe care le contine. Atunci cand aceasta se intampla natural, programul trebuie sa ale imediat si sa raspunda la modificarea selectiei. Acest lucru este posibil prin intermediul mesajului CBN_SELCHANGE, trimis de catre control casetei de dialog oricand se modifica elementul selectat.
Adaugati o functie de tratare a mesajului CBN_SELCHANGE pentru caseta combinata IDC_mainDir. Astfel ar trebui sa fie creata functia membru OnSelchangeMainDir(). Veti avea nevoie, totodata, de o noua variabila membru de tip CString, m_strMainDir, care va pastra calea selectata. Ea va fi utilizata mai apoi si pentru a popula controlul arbore si caseta cu lista.
Este bine sa verificati valorile intoarse de functiile AddString() si InsertString(). In cazul aparitiei unor erori, aceste functii intorc una din valorile CB_ERR sau CB_ERRSPACE.
void CListsDlg::OnSelchangeMainDir()
La popularea unui arbore, de multe ori este necesara stocarea de informatii privind structura arborelui pentru a putea insera elemente ca parinti sau ca subordonati ai altor elemente introduse anterior.
Clasa MFC care incapsuleaza un arbore este CTreeCtrl. Aceasta clasa include functii care se ocupa cu inserarea si eliminarea de elemente. Functia InsertItem() are mai multe versiuni supradefinite pentru a putea sa realizeze asocieri de imagini si de pointeri la date externe arborelui, daca este nevoie. Fiecarui element inserat ii este asociat un indicator de tip HTREEITEM care poate fi transmis functiei InsertItem(), facand astfel posibila crearea unei ierarhii.
Numele functiei |
Descriere |
InsertItem |
Insereaza un element, fie ca element radacina, fie ca element subordonat, in functie de parametrii transmisi. |
DeleteIem |
Inlatura un element. |
DeleteAllItems |
Inlatura toate elementele existente. |
Pentru a popula arborele din proiect, creati mai intai o noua functie membru numita PopulateTree() care intoarce tipul void. Arborele va afisa fisierele aflate in directorul selectat in cadrul casetei combinate, iar acestea vor fi impartite alfabetic. Functia insereaza mai intai cate un element pentru fiecare litera a alfabetului, dupa care va adauga un al 27-lea element care va subordona fisierele ale caror nume nu incep cu o litera. Sunt folosite apoi o serie de functii oferite de Windows pentru a inspecta continutul directorului si a insera numele fiecarui fisier in subordinea elementului corespunzator din arbore.
void CListsDlg::PopulateTree()
//Cautam urmatorul fisier din directorul principal
bMoreFiles=FindNextFile(hFind,&dataFind);
}
//Inchidem indicatorul de cautare
FindClose(hFind);
Uneori este nevoie sa asociati fiecare element din arbore cu un pointer la un obiect. Acest lucru se poate face prin intermediul functiilor SetItemData() si GetIemData().
Popularea unei casete cu lista se realizeaza practic la fel cu popularea unei casete combinate, deoarece elementele din lista unei casete combinate sunt de fapt elemente ale unei casete cu lista. Diferenta esentiala dintre cele doua controale este modul de afisare si faptul ca in casetele cu lista este posibila selectarea mai multor elemente simultan.
Clasa MFC care incapsuleaza casetele cu lista este CListBox. Functiile care raspund de inserarea si inlaturarea elementelor sunt identic cu cele prezentate in tabelul 4.
In cadrul proiectului Lists caseta cu lista este populata cu numele subdirectoarelor aflate in directorul principal care a fost selectat in caseta combinata. In acest scop veti adauga mai intai o noua functie membru care se numeste PopulateListBox() si are tipul void. Modificati apoi functia OnSelchangeMainDir() pentru a apela aceasta noua functie dupa apelul PopulateTree().
void CListsDlg::PopulateListBox()
//Cautam urmatorul subdirector din directorul principal
bMoreFiles=FindNextFile(hFind,&dataFind);
}
//Inchidem indicatorul de cautare
FindClose(hFind);
Actiunile efectuate de utilizator asupra controalelor caseta cu lista au ca efect transmiterea unor mesaje corespunzatoare casetelor de dialog. Mesajul LBN_SELCHANGE este transmis in cazul in care elementul sau elementele selectate se modifica.
Caseta cu lista din proiectul Lists permite selectia multipla. Functia de tratare a mesajului creeaza o lista a directoarelor selectate in cadrul unei noi variabile membru, m_strList, care este de tip CStringList. CStringList este un exemplu de clasa MFC ajutatoare. Ea este folosita pentru administrarea unei liste variabile de obiecte individuale CString.
Adaugati o functie pentru tratarea mesajului LBN_SELCHANGE corespunzator casetei cu lista IDC_subDirs. Ar trebui sa fie creata functia membru OnSelchangeSubDirs(). Aceasta functie va determina numarul elementelor selectate si apoi va extrage numele fiecarui element si-l va adauga in variabila m_strList. In final, functia va apela o noua functie, PopulateListControl(), care va utiliza m_strList pentru a introduce informatii in controlul lista.
void CListsDlg::OnSelchangeSubDirs()
//Stergem vectorul de intregi
delete []items;
}
//Acum populam controlul lista
PopulateListControl();
Modalitatea de populare a unui control lista difera putin de metodele aplicate in cazul celorlalte controale de tip lista. De asemenea, apar diferente in functie de tipul de control lista care este utilizat. Tipul cel mai intalnit este tipul raport. Acest tip se caracterizeaza prin afisarea informatiilor pe coloane.
Clasa MFC care incapsuleaza controale lista este CListCtrl. Aceasta clasa include functiile prezentate in tabelul 6, functii care se ocupa de adaugarea si inlaturarea elementelor.
Numele functiei |
Descriere |
InsertColumn |
Adauga o noua coloana intr-o anumita pozitie. |
DeleteColumn |
Inlatura o coloana. |
InsertItem |
Adauga un element. |
DeleteItem |
Inlatura un element existent. |
DeleteAllItems |
Inlatura toate elementele existente. |
SetItemText |
Stabileste continutul textual al unei parti dintr-un element. |
Proiectul Lists foloseste un control lista de tip raport care contine coloane pentru numele directorului, numarul de fisiere aflate in director si dimensiunea totala a acestor fisiere. Primul lucru care trebuie facut este inserarea coloanelor. Deoarece ele raman neschimbate, aceasta operatie poate fi efectuata in cadrul functiei OnInitDialog(). Elementele propriu-zise vor fi adaugate in control de catre functia PopulateListControl().
BOOL CListsDlg::OnInitDialog()
void CListsDlg::PopulateListControl()
//Cautam urmatorul fisier din directorul principal
bMoreFiles=FindNextFile(hFind,&dataFind);
}
FindClose(hFind);
//Formatam un sir care contine numarul de fisiere si-l inseram in coloana 1
str.Format('%ld',nFileCount);
m_lcDirDetails.SetItemText(nr,1,str);
//Formatam un sir care contine dimensiunea totala a fisierelor si-l inseram in coloana 2
str.Format('%-1.2f', nFileSize/1024.0);
m_lcDirDetails.SetItemText(nr,2,str);
m_strList.GetNext(pos);
}
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate