Documente Academic
Documente Profesional
Documente Cultură
Lucrare laborator 5.
Obiective:
În această lucrare de laborator ne propunem să continuăm familiarizarea cu aplicații de
tip machetă de dialog și să cuprindem continuarea familiarizării lucrului cu controalele de
editare:
Adăugarea mai multor tipuri de controale și popularea acestora:
o Adăugarea controlului caseta combinată
o Ataşarea de variabile casetei combinate
o Adăugarea controlului arbore
o Ataşarea unei variabile controlului arbore
o Adăugarea controlului casetă cu listă cu variabila aferentă
o Adăugarea controlului listă cu variabila aferentă
o Popularea controalelor
Testarea și construirea aplicației
1. Casete combinate
1
Programare orientată obiect
2
Programare orientată obiect
2. Controale arbore
3
Programare orientată obiect
La caseta cu listă se va adăuga o variabilă m_lbSubdir de tip CListBox prin intermediul lui
ClassWizard.
4. Controlul listă
Controlul listă are o denumire uşor derutantă, pentru că celelalte trei controale prezentate
în continuare, sunt de asemenea de tip listă. Totuşi, controlul listă este cel mai complex dintre
cele patru şi este utilizat mai degrabă în cadrul unei reprezentări decât în casetele de dialog. Un
control listă este în stare să afişeze atât pictograme, cât şi etichete asociate, şi poate opera în
oricare din cele patru moduri descrise mai jos:
Pictograme - afişează pictograme mari (32x32 pixeli) cu etichete plasate sub fiecare
pictogramă. Elementele sunt plasate în ordine de la stânga la dreapta şi apoi de sus în
jos;
Pictograme mici - afişează pictograme mici (16x16 pixeli) cu etichete plasate în
dreapta fiecărei pictograme. Elementele sunt plasate în ordine de la stânga la dreapta
şi apoi de sus în jos;
4
Programare orientată obiect
Listă - afişarea este similară cu modul cu pictograme mici, dar elementele sunt
plasate în ordine de sus în jos şi apoi de la stânga la dreapta;
Raport - afişează informaţii prin intermediul unor coloane cu antet.
În mod implicit , atunci când un control listă pierde focusul, elementul selectat nu mai
este afişat evidenţiat. Dacă se doreşte ca selecţia să rămână vizibilă, se va valida stilul Show
Selection Always.
În cadrul proiectului Liste, controlul listă va fi utilizat pentru a afişa detalii privind
directoarele selectate în caseta cu listă aflată deasupra sa în caseta de dialog. Controlul listă va
avea trei coloane: prima coloană va conţine numele directorului, a doua va afişa numărul de
fişiere conţinute, iar a treia coloană va înfăţişa dimensiunea în megaocteţi a directorului. Pentru
adăugarea controlului listă se vor parcurge următorii paşi:
se va adăuga un control etichetă statică, numită Detalii Director Selectat, ca
titlu pentru controlul listă;
se va selecta pictograma controlului listă (List Control) după care se va adăuga în
caseta de dialog; se va introduce IDC _DIR_SELECTAT
în caseta combinată ID;
se selectează din pagina Properties opțiunea View şi se
alege Report.
În final, aspectul casetei de dialog, va arăta astfel:
5. Popularea casetelor
5
Programare orientată obiect
Caseta combinată este singurul dintre cele patru controale de tip listă care poate fi
populat cu elemente în cadrul editorului de resurse. Aceasta se realizează prin intermediul
paginii Data a casetei de dialog ComboBox Properties. Fiecare element poate fi introdus
în caseta Enter ListBox Items. Dacă se efectuează la un moment dat această operaţie, nu
trebuie uitat să se apese Ctrl+Enter după fiecare element, pentru că simpla apăsare a tastei
Enter va duce la închiderea casetei de dialog.
O astfel de populare a unei casete combinate nu este uzuală; în mod normal, casetele
combinate sunt populate la momentul execuţiei, de multe ori în cadrul funcţiei
OnInitDialog(). Infrastructura MFC apelează această funcţie la deschiderea casetei de dialog,
înainte de afişarea ei.
Clasa MFC care încapsulează casetele combinate este CComboBox. Această clasă
conţine mai multe funcţii care se ocupă de adăugarea şi înlăturarea elementelor, acestea sunt
reprezentate astfel:
AddString - adaugă un element fie la sfârşitul listei, fie în poziţia corespunzătoare
ordonării;
DeleteString - înlătură un element;
InsertString - inserează un element într-o anumită poziţie;
ResetContent - înlătură toate elementele existente;
Dir - metodă specială de populare pentru inserarea ca elemente a numelor de fişiere.
Fiecărui element îi este asociat la adăugare un indice numeric pornind de la zero, acest
indice putând fi utilizat apoi pentru accesarea respectivului element.
În cadrul proiectului Liste, caseta combinată este populată în cadrul funcţiei
OnInitDialog() a casetei de dialog, fiind inserate o serie de directoare principale obţinute prin
intermediul unor funcţii globale din Windows. În acest
scop, se creează mai întâi o funcţie nouă având numele
PopulateCombo () şi tipul void. Pentru aceasta
deschidem meniul derulant al clasei ClisteDlg, alegem Add
Function.
Vom introduce în corpul acestei funcții codul de mai jos:
void CListeDlg::PopulateCombo()
{
TCHAR szBuffer[MAX_PATH];
6
Programare orientată obiect
Scopul unei casete combinate este să permită selectarea unuia dintre elementele pe care le
conţine. Atunci când aceasta se întâmplă natural, programul
trebuie să afle imediat şi să răspundă la modificarea selecţiei.
Acest lucru, este posibil prin interceptarea mesajului
CBN_SELCHANGE, trimis de către control casetei de
dialog oricând se modifică elementul selectat.
Este bine să se verifice valorile întoarse de funcţiile AddString () şi
InsertString(), deoarece în cazul apariţiei unei erori, aceste funcţii întorc una din valorile
CB_ERR sau CB_ERRSPACE.
Se va adăuga o funcţie de tratare a mesajului
CBN_SELCHANGE pentru caseta combinată
IDC_DIRECTOR. Astfel, ar trebui să fie creată funcţia
membru OnSelchangeDirector().
Este nevoie totodată de o nouă variabilă membru de tip
CString, m_strDir, care va păstra calea selectată; m_strDir
poate fi utilizată şi pentru popularea controlului arbore şi a casetei
cu listă. Pentru adăugarea variabilei membru vom deschide
meniul contextual al clasei CListeDlg, si selectăm Add Variable,
unde introducem datele:
Pentru funcţia membru OnSelchangeMainDir(), se va introduce următorul cod:
1. void CListeDlg::OnSelchangeDirector()
2. {
3. // TODO: Add your control notification handler code here
7
Programare orientată obiect
8
Programare orientată obiect
HANDLE hFind;
WIN32_FIND_DATA dataFind;
BOOL bMoreFiles = TRUE;
CString strFile;
9
Programare orientată obiect
şi transformată eventual în majusculă nChar -= 32; . Testul din linia următoare verifică dacă
numele fişierului începe cu o literă, caz în care traduce valoarea întreagă a literei într-un indice în
vectorul hLetter. În apelul InsertItem () sunt transmise numele fişierului care trebuie
inserat şi indicatorul HTREEITEM al părintelui care-l va subordona.
Uneori este mai uşor să se asocieze fiecare element din arbore cu un pointer la un obiect.
Acest lucru se poate face prin intermediul funcţiilor SetItemData() şi GetItemData ().
Dacă se va asambla şi rula aplicaţia, caseta combinată ar trebui să afişeze mai multe
directoare, iar selectarea unuia dintre acestea ar trebui să conducă la popularea arborelui cu
fişierele conţinute.
10
Programare orientată obiect
if (dataFind.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
//**Adaugam numele directorului in caseta cu lista,
//**ignorand directoarele "." si ".."
if (strcmp(dataFind.cFileName, "."))
if (strcmp(dataFind.cFileName, ".."))
m_lbSubdir.AddString(dataFind.cFileName);
}
11
Programare orientată obiect
finalul funcţiei.
12
Programare orientată obiect
reprezentarea de tip raport din Explorer afişează coloanele titrate Name, Size, Type şi Modified,
informaţiile respective despre fişiere fiind afişate linie după linie.
Clasa MFC care încapsulează controalele listă este CListCtrl, care include funcţiile
care se ocupă de adăugarea şi înlăturarea elementelor:
InsertColumn - adaugă o nouă coloană într-o anumită poziţie;
DeleteColumn- înlătură o coloană;
InsertItem- adaugă un nou element;
DeleteItem- înlătură un element existent;
DeleteAllItems- înlătură toate elementele existente;
SetItemText- stabileşte conţinutul textual al unei părţi dintr-un element.
Proiectul Liste foloseşte un control listă de tip raport care conţine coloane pentru
numele directorului, numărul de fişiere aflate în director şi dimensiunea totală a acestor fişiere.
Primul lucru care trebuie făcut, este inserarea coloanelor, deoarece ele rămân
neschimbate, această operaţie se poate efectua în cadrul funcţiei OnInitDialog () unde se va
adăuga următoarea secvenţă (după iniţializarea casetei combinate care s-a făcut anterior):
POSITION pos;
//** Parcurgem lista directioarelor selectate in cadrul casaetei cu lista
for (pos = m_strLista.GetHeadPosition(); pos != NULL; )
{
int nItem;
HANDLE hFind;
WIN32_FIND_DATA dataFind;
BOOL bMoreFiles = TRUE;
CString str;
CString strFind;
str = m_strLista.GetAt(pos);
//** Adaugam un rand in controlul lista (coloana 0)
nItem = m_lcDetaliiDir.InsertItem(0, str);
int nFileCount = 0;
13
Programare orientată obiect
double nFileSize = 0;
m_strLista.GetNext(pos);
}
14