Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Dialoguri si Controale

Informatica


Dialoguri si Controale

Pentru fiecare boxa de dialog care apare pe ecran exista doua entitati pe care trebuie sa le dezvoltam: o resursa boxa de dialog si o clasa boxa de dialog.

Resursa boxa de dialog este folosita pentru a desena boxa de dialog si controalele pe care le contine.



Clasa mentine valorile din boxa de dialog si exista o functie membru a acestei clase care este folosita pentru a activa boxa de dialog. În general se construieste un meniu ce va contine o optiune pentru activarea acestui dialog.

Resursa boxa de dialog se construieste cu editorul de resurse. Pe baza acestei resurse Class Wizard va genera clasa corespunzatoare. În general boxele de dialog sunt derivate din CDialog.

Crearea unei resurse de dialog

Controalele uzuale din Windows pot fi folosite într-o boxa de dialog. Enumeram dintre acestea:

Static text. Folosit de alte controale pentru descriere.

Edit box. Folosit pentru a prelua anumite informatii (siruri de caractere, numere). Poate fi definit ca având o singura linie sau mai multe l 434f59e inii.

Button. Fiecare boxa de dialog are implicit butoanele OK si Cancel care pot fi pastrate sau sterse.

Check box. Permite selectare sau deselectare. Lucreaza independent.

Radio button. Permite selectare sau deselectare. Nu lucreaza independent.

List box. Contin o lista de articole, din care utilizatorul poate selecta un articol la un moment dat. Nu putem tasta text în cadrul acestui control.

Combo box. Este o combinatie între Edit box si List box.

Definirea boxei de dialod si ID-ul Controlului

Fiecare boxa de dialog are un ID unic (un identificator), iar controalele din cadrul boxei de dialog au de asemenea ID-uri. Fiecare control din cadrul unei boxei de dialog este vazut ca o fereastra. Deci o parte din functionalitatea unei ferestre se va reflecta si asupra controlului. Clasa CDialog este derivata din clasa CWnd care descrie functioanlitatea unei ferestre. Daca avem un pointer la fereastra (GetDlgItem() pentru dialoguri) putem apela metode specifice pentru aceasta. De exemplu putem ascunde o fereastra (ShowWindow()), o putem activa sau dezactiva (EnableWindow()) sau îi putem citi/modifica continutul (GetWindowText(), SetWindowText()), etc. Pentru a sti ce functii se aplica va trebui sa consultam clasa de baza si clasa derivata. Editorul de resurse defineste implicit un ID pentru boxa de dialog si ID-uri pentru controalele pe care le atasam acesteia. Putem modifica aceste ID-uri (Properties din meniul contextual disponibil pentru controlul selectat sau boxa de dialog) pentru a le da un sens conform aplicatiei noastre. De obicei aceste ID-uri încep cu IDD_ urmate de un text pentru boxele de dialod si cu IDC_ pentru controalele din boxa de dialog. (Exemple: IDD_DIALOG1, IDC_STATIC1, IDC_EDIT1, IDC_RADIO1, etc.).

Pentru controalele dintr-o boxa de dialog putem defini date membru (variabile) în cadrul clasei pentru a mentine starea acestora. Cu ajutorul Class Wizard-ului putem defini aceste variabile si le putem manevra într-o anumita masura. De asemenea putem defini si implementa functiile necesare tratarii mesajelor de notificare pe care acestea le suporta.

Observatie: MFC utilizeaza tabele pentru a gestiona harta de mesaje precum si pentru a mentine legatura dintre o variabila si un control. A se vedea clasa CDataExchange si functia DoDataExchange().

Exercitiu. Se va crea o boxa de dialog cu mai multe controale si se vor explica aceste lucruri pe codul rezultat.

Se vor urmari posibilitatile de aliniere a controalelor, redimensionare, ordinea controalelor, stilurile, etc.

Tipuri de date pentru fiecare control:

Edit box. În mod obisnuit un string, dar poate fi si un int, long, float.

Check box. int

Radio button. int

List box. String



Combo box. String

Scrollbar. int

Pentru a afisa boxa de dialog va trebui sa apelam functia membru DoModal() în cazul boxelor de dialog modale. Boxele de dialog amodale vor fi tratate separat, deoarece nu urmeaza aceeasi constructie.

Exemplu de lansare în executie a unei boxe de dialog

CSdiDialog dlg; // se creaza obiectul pe stiva

dlg.m_check = TRUE; // variabila atasata unui control check

dlg.m_edit = "hi there"; // variabila atasata unui control Edit

CString msg;

if (dlg.DoModal() == IDOK) // are loc afisarea dialogului

else

msg += "Edit box is: ";

msg += dlg.m_edit;

AfxMessageBox (msg);

Tiparirea codului (Autocompletion: Tools->Options->Editor)

Când tastam codul avem posibilitatea de a vedea numele variabilelor membru si a functiilor din clasa. Daca tastam dlg. si apoi pauza, va aparea o fereastra, ce va lista toate variabilel membru si functiile din clasa, inclusiv cele mostenite din clasa de baza. În continuare vom folosi tastele sageti pentru selectie si apoi apasam tasta Space pentru a trece selectia facuta în cadrul codului.

Ce se ascunde în spatele unei boxe de dialog?

Cel mai important lucru este întelegerea functiei care urmeaza.

void CSdiDialog::DoDataExchange(CDataExchange* pDX)

}AFX_DATA_MAP

Trebuie sa stim ca între boxa de dialog afisata pe ecran si variabilele care mentin starea anumitor controale este definit un schimb bidirectional de date. Un rol important îl joaca aici functia UpdateData() care stabileste practic directia de schimb ecran->variabile sau variabile->ecran.

Functiile care încep cu DDX_ realizeaza schimbul de date. Exista 34 de functii care încep cu DDX, una pentru fiecare tip de data care poate fi schimbata între clasa si dialog. Primul parametru arata directia, al doilea este ID-ul controlului iar al treilea parametru este numele variabilei. Codul este adagat de Class Wizard.


OBSERVAŢIE: Anumite functii DDX nu sunt generate de Class Wizard. De exemplu, când ne conectam la o valoare din List Box, singura alegere posibila pentru tip este CString. Alegând acest lucru, Class Wizard va genera un apel la DDX_LBString() care conecteaza stringul selectat la variabila membru de tip CString. Exista situatii când un index de tip int este mai bun. Pentru acest lucru exista functia DDX_LBIndex() care realizeza acest schimb de informatii. O parte dintre functiile din List Box folosesc indecsi pentru a manevra articolele dintr-un list box. Putem adauga cod în DodataExchange(), dar în afara comentariilor speciale introduse de Class Wizard. În acest caz vom adauga singuri variabila membru la clasa.




Functiile care încep cu DDV realizeaza validarea datelor. Prametrul al doilea este numele variabilei, iar al treilea specifica limitele.

Utilizarea controlului List Box

Un control de acest tip nu poate fi initializat decat atunci când boxa de dialog este afisata, deci este pe ecran. Din acest motiv trebuie sa fim atenti la momentul initializarii. Nu putem apela functii membru din aceasta clasa atâta timp cât dialogul nu este afisat. Acest lucru este valabil pentru orice control pe care îl accesam ca un control si nu ca o valoare.

O asemenea initializare are loc în functia OnInitialDialog() care este apelata de cadrul de lucru (frame work) imediat ce dialogul a fost afisat pe ecran. Aceasta functie este apelata la trimiterea mesajului WM_INITDIALOG.

Cade în sarcina noastra sa includem acest mesaj în tratare (se face cu Class Wizard). Se va explica în mod concret cum se foloseste Class Wizard pentru a adauga noi mesaje tratate de clasa respectiva. De asemenea tot cu Class Wizard se ataseaza variabile pentru controalele dintr-o boxa de dialog.

Un exemplu pentru OnInitDialog()

BOOL CSdiDialog::OnInitDialog()

Aceasta functie apeleaza mai întâi OnInitDialog() din clasa de baza, iar în continuare se executa codul din cadrul functiei. Stringurile vor fi afisate în ordinea în care au fost introduse (adaugate) cu functia AddString().

În final se apeleaza functia SetCurSel(), functie care are drept parametru un index ce identifica articolele din List Box. Indexul pentru primul articol are valoarea 0 (zero).


OBSERVAŢIE: În mod obisnuit, articolele în list box sunt adaugate dintr-un vector sau o lista. Pentru acest lucru se folosesc clasele colectie din MFC (CStringArray, CList, etc.).


Pentru a mentine (memora) articolul (string-ul) selectat în list box, vom adauga o variabila membru de tip CString la aceasta clasa.  Aceasta variabila va fi privata, si deci vom adauga functii membru publice la clasa pentru a manevra aceasta variabila pentru a pastra stilul de programare impus de POO.

Pentru selectie se va trata mesajul de notificare BN_CLICKED, care are semnificatia ca utilizatorul a facut o selectie în list box. Functia care trateaza acest mesaj se va adauga tot cu Class Wizard. În codul care urmeaza se exemplifica preluarea stringului din list box la apasarea butonului OK.

void CSdiDialog::OnOK()

else

CDialog::OnOK();

Explicatii. Functia GetCurSel() întoarce indexul la articolul selectat. Daca acesta este valid (index != LB_ERR) se obtine valoarea acestui articol în variabila m_selected care este de tip CString folosind functia GetText al carei prim parametru este indexul articolului.. În final se apeleaza functia OnOK() din clasa de baza pentru a executa alte procesari necesare. În cele ce urmeaza vom observa apeluri la functiile din clasa de baza. Aceste apeluri sunt generate de Class Wizard. Exista si exceptii când aceste apeluri trebuiesc invalidae (comentate). Ca un exemplu vom vedea la împartirea zonei client în mai multe ferestre (splitting window) la apelul functiei OnCreateClient().

Folosirea butoanelor radio

La afisarea unei boxe de dialog care contine butoane radio vom vedea ca nici un buton nu este selectat. Pentru a realiza o selectie implicita adaugam în OnInitDialog() urmatoarele linii de cod.

m_radio = 1;

UpdateData(FALSE);

Variabila m_radio este atasata unui grup de butoane radio si reprezinta indexul butonului în acest grup. Primul buton are indexul 0 (zero). Functia UpdateData(FALSE) stabileste directia de actualizare, care în acest caz este de la variabila la ecran si în final are loc un refresh al boxei de dialog.

Un grup de butoane radio poate fi accesat dupa ce boxa de dialog nu mai este pe ecran, deci nu trebuie sa tratam OnOK() sau ONCancel().




Document Info


Accesari: 1346
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )