Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
Aplicatii bazate pe casete de dialog. Controale standard
Scopul
lucrarii: Prezentarea casetelor de dialog si a
controalelor standard.
Desfasurarea
lucrarii: Aplicatiile Windows comunica frecvent cu
utilizatorul prin intermediul casetelor de dialog. Clasa CDialog furnizeaza o interfata pentru gestiunea
casetelor de dialog. Pentru editarea template-ului corespunzator casetelor
de dialog se foloseste 'Visual
C++ dialog editor'. Uitlizarea ClassWizard-ului
simplifica procesul de initializare si validare a controalelor
din caseta de dialog si de culegere a valorilor introduse de utilizator.
Casete de dialog
modale si nemodale
Clasa CDialog poate fi
utilizata pentru gestionarea a doua tipuri de casete de dialog:
l casete de dialog modale, care cer utilizatorului inchiderea lor pentru ca aplicatia sa poata continua;
l casete de dialog nemodale care pot ramane pe ecran permitand interactiunea cu utilizatorul in orice moment, dar permit si interactinea cu alte ferestre ale aplicatiei.
Resursa pe baza careia este
construita caseta de dialog este aceeasi si in cazul casetelor
modale si pentru cazul in care caseta de dialog este nemodala.
Crearea unei casute de dialog implica urmatorii pasi:
l folosirea editorului de resurse pentru construirea casetei de dialog si crearea resursei;
l folosirea ClassWizard-ului pentru crearea clasei atasate casetei de dialog.
Conectarea controalelor resursei la handlere de mesaje folosind ClassWizard
Initializarea casetelor de dialog
Cu ajutorul editorului de resurse se creaza caseta de dialog si i se asociaza un identificator de resursa care in mod uzual are numele simbolic IDD_<nume_resursa>, iar din caseta de controale se pot adauga pe suprafata ferestrei de dialog controalele dorite si li se pot seta proprietatile, fiecare control adaugat casetei de dialog avand identificatorul propriu de resursa.
Pentru crearea clasei asociata casetei de dialog, se poate utilizeaza ClassWizard-ul, ce permite specificarea numelui pentru clasa, care va fi derivata din CDialog. Wizard-ul va cere identificatorul de resursa, pentru a-l asocia clasei, acesta fiind identificatorul care a fost specificat anterior in cadrul editorului de resurse.
Crearea efectiva a cutiei de dialog in cadrul aplicatiei se realizeaza prin intermediul functiei constructor al clasei asociate, care permite crearea obiectul asociat unei instante a ferestrei. Sistemul Windows trimite spre fereastra nou creata un mesaj WM_INITDIALOG, astfel ca inainte ca aceasta sa fie afisata pe ecran este apelata functia membra a clasei CDialog, OnInitDialog, care este suprascrisa in cadrul clasei atasate casetei de dialog. Programatorul poate introduce codul necesar pentru initializarea casetei de dialog in cadrul acestei functii. Este necesara apelarea variantei din clasa de baza (CDialog) in implementarea rescrierii acestei functii. Principala functie a clasei CDialog utilizata in aplicatii este functia DoModal, ce permite afisarea unei casete de dialog modale.
Folosirea ClassWizard pentru adaugarea variabilelor membru asociate controalelor din caseta de dialog si specificarea macro-urilor DDX si DDV
In aplicatiile MFC transferul datelor intre controale si aplicatie se bazeaza pe variabilele membre ale clasei asociate ferestrei de dialog. Pentru fiecare control din cadrul unei ferestre de dialog se poate asocia o variabila membra a clasei ferestrei de dialog, in care se pastreaza informatiile schimbate intre utilizator si aplicatie.
Cele doua operatii pe care trebuie sa le implementeze un programator sunt:
- sa adauge cate o variabila membru pentru fiecare control din cadrul unei ferestre de dialog;
- sa realizeze schimbul de informatii intre controale si variabilele asociate lor.
Pentru prima operatie, adaugarea variabilelor membre clasei asociata ferestrei de dialog, se utilizeaza ClassWizard-ul. Acesta permite adaugarea a doua tipuri de variabile membru: de tip valoare si de tip control. In cazul variabilelor de tip control, va trebui specificat identificatorul de resursa asociat controlului pentru care se doreste crearea variabilei.
Pentru implementare celei de-a doua operatie, realizarea schimbului de informatii intre controale si variabilele asociate, se utilizeaza functia DoDataExchange.
Exemplu pentru functia DoDataExchange:
void CDialogExemplu::DoDataExchange(CDataExchange* pDX)
}AFX_DATA_MAP
Prin executia functiei DoDataExchange, dupa apasarea
butonului OK a ferestrei de dialog se memoreaza valoare introdusa in
editbox-ul cu id-ul IDC_EDIT, in variabila m_nEdit a clasei CDialogExemplu.
Parametru functiei DoDataExchange
este un pointer la clasa MFC CDataExchange.
Obiectul indicat de pointer este utilizat in cadrul macro-urilor DDX_ si
DDV_, pentru realizarea operatiilor specifice schimbului de
informatii si validarii. Clasa CDataExchange poseda o variabila membru de tip boolean, m_bSaveAndValidate, care
specifica directia dorita de transfer a informatiei (TRUE
pentru transferul informatiei dinspre controale inspre aplicatie
si FALSE pentru sensul invers). Functiile DDX_ poseda in mod
uzual trei parametri: pointerul spre obiectul DoDataExchange, identificatorul
resursei controlului, precum si variabila membra asociata
controlului. Mecanismul DDX permite schimbul de date intre controalele din
caseta de dialog si variabilele membru. Asa cum am mai spus acest
schimb se poate efectua in ambele directii, declansarea mecansimului
DDX se face prin apelarea functiei UpdateData
din clasa CDialog. In functie
de valoarea parametrului cu care este apelata aceasta functie
(TRUE - valoare implicita/FALSE) datele sunt trimise spre caseta de
dialog, respectiv sunt citite din caseta de dialog si memorate in
variabilele membru atasate. De asemenea framework-ul ofera suport
pentru validarea datelor de intrare. Acest mecanism este implementat prin
intermediul macro-urilor DDV si este activat prin introducerea
conditiilor de validare in cadrul ClassWizard-ului, atunci cand sunt definite
variabilele membru de tip valoare.
Inchiderea unei casete de dialog
Inchiderea unei casete de dialog se face selectand unul din butoanele OK sau
CANCEL din caseta. Implementarea oferita de framework pentru handlerele
(functiile atasate tratarii mesajelor generate la aparitia
celor doua evenimente) celor doua butoane apeleaza metoda EndDialog, ce permite inchiderea unei
casete de dialog.
Accesarea controalelor dintr-o caseta de dialog
Accesarea controalelor dintr-o caseta de dialog se face folosind
variabile de tip control asociate acestor controale. Definirea acestor
variabile se face cu ajutorul, asa cum am mai spus, folosind
ClassWizard-ului. Dupa ce a fost definita o astfel de variabila
aceasta poate fi folosita pentru apelerea oricaror metode asociate
controlului respectiv. Acest mod de lucru cu o resursa de tip control
ofera o accesibilitate sporita asupra acesteia. Totusi nu se
recomanda folosirea acestor variabile decat atunci cand este cazul, de
obicei atunci cand se lucreaza cu controale de tip ListBox, ComboBox.
Controale standard
Interarctivitatea sistemului de operare Windows, se bazeaza in intregime pe controalele sale, indiferent daca utilizatorul executa click pe un buton pentru a lansa o comanda, scrie intr-o caseta de editare pentru a introduce date intr-un program sau selecteaza un fisier dintr-o caseta de dialog. Fiecare astfel de control este legat de o clasa asociata controlului. Cele mai frecvente controale sunt :
Text static (StaticText): Un sir de caractere care nu poate fi editat.Controalele cu text static
sunt folosite, de regula, pentru etichetarea altor componente dintr-o
caseta de dialog. Clasa MFC asociata este CStatic.
Caseta de editare (EditBox): O
caseta in care poate fi introdus un text. Textul poate fi editat, copiat
si lipit prin intermediul utilizarii lui Windows Clipboard. Clasa MFC
asociata este CEdit.
Buton cu apasare (PushButton): Un
control care poate declansa o comanda atunci cand este actionat
prin click. Clasa MFC asociata este CButton.
Butoanele cu apasare contin, de regula, o eticheta text
si sunt adesea animate, astfel ca par 'apasate', atunci
cand sunt actionate.
Buton radio (RadioButton): Un buton
folosit, in general, in grupuri de butoane, din care nu poate fi selectat
simultan decat unul singur.Cand este selectat un astfel de buton, butonul
selectat anterior este deselectat. Clasa MFC asociata este CButton. Pentru gruparea butoanelor se
poate folosi un control de tip Group
Box.
Caseta de validare (CheckBox): O
caseta folosita pentru activarea, respectiv dezactivarea
optiunilor. Spre deosebire de butoanele radio, casetele de validare sunt
folosite in mod traditional pentru a permite selectarea mai multor
elemente din grup.
Caseta cu lista (ListBox): O
lista de articole, pentru care se poate folosi mouse-ul pentru a selecta unul
sau mai multe articole din lista.Cand sunt mai multe articole decat permite
afisarea in perimetrul casetei cu lista, apare si o bara de derulare
care ii permite utilizatorului sa vizualizeze si articolele care nu sunt
vizibile din caseta. Clasa MFC asociata este CListBox.
Caseta combinata (ComboBox): O
lista de articole combinata cu o caseta de editare. Se poate fie
executa click pe sageata casetei combinate pentru a afisa o
lista cu optiuni, fie introducerea optiunii dorite in caseta de
editare asociata. Clasa MFC asociata este CComboBox.
Caseta de grupare (GroupBox): Folosita pentru gruparea altor controale. De
exemplu, casetele de grupare sunt folosite adesea pentru gruparea mai multor
butoane radio. Caseta poate contine si o legenda care sa
descrie continutul casetei.
Introducerea
controalelor in ferestre non-dialog
Cel mai adesea se folosesc controale standard cum ar fi casetele de editare
si butoanele de apasare in aplicatii MFC de tip caseta de
dialog. Nu exista insa nici
un motiv pentru a nu putea plasa astfel de controale in orice tip de fereastra. De exemplu, o aplicatie SDI poate utiliza controale in cadrul fereastrei principale de
vizualizare. Pentru a introduce si a raspunde la controale intr-o fereastra NON-dialog, trebuie efectuati urmatorii pasi:
1. Instantierea unui obiect din clasa MFC asociata tipului de control dorit. De exemplu, daca se doreste afisarea unei casete de tip lista in cadrul ferestrei, se va
instantia un obiect din clasa CListBox.
2. Apelul functiei membru a clasei asociate controlului, Create pentru instanta declarata pentru a crea controlul. De exemplu, dupa instantierea unui obiect din clasa
CListBox cu numele listBox, se apeleaza listBox.Create().
3. Tratarea evenimentelor corespunzatoare tipului de control creat prin adaugare de functii mesaj/raspuns in cadrul hartii de mesaje a clasei ferestrei container.Pentru
o caseta cu lista se poate introduce un macro ON_LBN_CLICKED() pentru ca aplicatia sa poata raspunde la selectiile facute in caseta cu lista.
4. Implementarea functiilor mesaj/raspuns asociate macro-urilor din harta de mesaje introduse la pasul 3.
Apelul functiilor membru Create(), nu se poate face in cadrul functiei constructor a unei clase asociate unei fereastre container, deoarece obiectul asociat fereastrei
abia in acest moment se creaza. In schimb se poate suprascrie functia OnCreate a clasei asociate unei fereastre container, care se apeleaza ca raspuns la mesajul
WM_CREATE cu putin inainte afisarii ferestrei container.
Functia Create pentru clasa CStatic are urmatorul prototip:
BOOL Create(LPCSTR lpszText,DWORD dwStyle,const RECT& rect, CWND* pParentWnd,UINT nId= 0xffff);
- lpszText - adresa textului ce se va afisa
- dwStyle - indicatoarele de stil pentru control (trebuie specificate cel putin doua stiluri de fereastra WS_VISIBLE | WS_CHILD)
- rect - o referinta pentru un obiect RECT sau CRect care specifica marimea si pozitia controlului in cadrul ferestrei parinte
- pParentWnd - un pointer spre fereastra parinte (container) a controlului
- nId - elementul de identificare al controlului (indentificatorul de resursa).
Functia Create pentru clasa CEdit are urmatorul prototip:
BOOL Create(DWORD dwStyle,const RECT& rect, CWND* pParentWnd,UINT nId);
- dwStyle - indicatoarele de stil pentru control (trebuie specificate cel putin doua stiluri de fereastra WS_VISIBLE | WS_CHILD)
- rect - o referinta pentru un obiect RECT sau CRect care specifica marimea si pozitia controlului in cadrul ferestrei parinte
- pParentWnd - un pointer spre fereastra parinte (container) a controlului
- nId - elementul de identificare al controlului (indentificatorul de resursa).
Pentru casetele de editare sunt definite o serie de functii macro. De exemplu pentru mesajul de notificare EN_CHANGE, care este trimis atunci cand utilizatorul
modifica textul din cadrul casetei de editare, exista functia macro ON_EN_CHANGE:
ON_EN_CHANGE(nID,numeFuntie)
Functia Create pentru clasa CButton are urmatorul prototip:
BOOL Create(LPCSTR lpszCaption,DWORD dwStyle,const RECT& rect, CWND* pParentWnd,UINT nId);
- lpszCaption - textul asociat butonului
- dwStyle - indicatoarele de stil pentru control (trebuie specificate cel putin doua stiluri de fereastra WS_VISIBLE | WS_CHILD)
- rect - o referinta pentru un obiect RECT sau CRect care specifica marimea si pozitia controlului in cadrul ferestrei parinte
- pParentWnd - un pointer spre fereastra parinte (container) a controlului
- nId - elementul de identificare al controlului (indentificatorul de resursa).
Cand utilizatorul executa click pe un buton, se trimite un mesaj de notificare ferestrei parinte. Acest mesaj este BN_CLICKED (un singur click) sau
BN_DOUBLECLICKED (doua click-uri). Exista doua functii macro pentru tratarea mesajelor generate la apasarea unui buton:
ON_BN_CLICKED(nID,numeFunctie)
ON_BN_DOUBLECLICKED(nID,numeFunctie)
Functia Create pentru o caseta de validare este aceeasi functie descrisa mai sus pentru clasa CButton, numai ca se foloseste stilul BS_AUTOCHECKBOX, care
cere sa se creeze o caseta de validare care nu trebuie validata sau invalidata de catre program, butonul realizand aceasta operatie atunci cand este actionat de
utilizator. Pentru a testa daca caseta este validata sau nu, sunt definite doua constante:
BST_CHECKED, respectiv BST_UNCHECKED, iar starea casetei este returnata de functia membru a clasei CButton, GetCheck.
Functia Create pentru clasa CListBox are urmatorul prototip:
BOOL Create(DWORD dwStyle,const RECT& rect, CWND* pParentWnd,UINT nId);
- lpszCaption - textul asociat butonului
- dwStyle - indicatoarele de stil pentru control (trebuie specificate cel putin doua stiluri de fereastra WS_VISIBLE | WS_CHILD)
- rect - o referinta pentru un obiect RECT sau CRect care specifica marimea si pozitia controlului in cadrul ferestrei parinte
- pParentWnd - un pointer spre fereastra parinte (container) a controlului
- nId - elementul de identificare al controlului (indentificatorul de resursa).
Cand utilizatorul executa un click in cadrul casetei cu lista, se trimite un mesaj de notificare ferestrei parinte. Acest mesaj este LBN_SELCHANGE pentru un
singur click si LBL_DBLCLK pentru dublu click. Exista doua functii macro pentru tratarea mesajelor generate:
ON_LBL_SELCHANGE(nID,numeFunctie)
ON_LBL_DBLCLK(nID,numeFunctie)
Functia Create a clasei CComboBox are acelasi prototip de la clasa CListBox. Cand utilizatorul executa click pe un articol, se trimite un mesaj de notificare
ferestrei parinte. Acest mesaj poate fi CBN_SELCHANGE (sau CBN_SELENDOK) pentru un singur click, respectiv CBN_DBLCLK pentru dublu click.
Exista doua functii macro pentru tratarea mesajelor generate:
ON_CBN_SELENDOK(nID,numeFunctie)
ON_CBN_DBLCLK(nID,numeFunctie)
Introducerea controalelor in ferestre dialog
O alternativa la cele descrise mai sus pentru a introduce controale in cadrul aplicatiilor dezvoltate este crearea unui proiect care sa aiba ca fereastra principala o
caseta de dialog. Marele avantaj consta in faptul ca, deoarece fereastra parinte este o caseta de dialog, se pot defini controale folosind editorul pentru casete de
dialog din Visual C++ prin drag and drop.
Primul pas consta in crearea unei noi aplicatii MFC folosind AppWizard-ul. In a doua fereastra a wiyard-ului se va selecta optiunea Dialog Based. Urmatorul pas
este adaugarea de controale folosind tehnica 'drag&drop'. Pentru tratarea mesajele corespunzatoare diverselor evenimente ce pot aparea la nivelului ferestrei
principale a aplicatiei sau la nivelul controalelor din cadrul ferestei se poate folosi ClassWizard-ul.
Teme propuse:
1. Sa se realizeze o aplicatie SDI in fereastra careia sa se adauge controale standard de tipul celor expuse mai sus. Aplicatia se va dezvolta incremental, adica se va
incepe cu controale de tip static, si se va vizualiza rezultatul si se va continua in acelasi mod.
2. Sa se realizeze o aplicatie de tip DialogBased, in cadrul careia sa se adauge controale standard de tipul celor expuse mai sus. Aplicatia se va dezvolta
incremental, adica se va incepe cu controale de tip static, si se va vizualiza rezultatul si se va continua in acelasi mod.
3. Sa se modifice aplicatia de la problema 1 , astfel incat controale standard introduse sa raspunda fiecare la eveniment prin afisarea unui mesaj( se va utiliza functia
MessageBox
4. Sa se modifice aplicatia de la problema 2 , astfel incat controale standard introduse sa raspunda fiecare la eveniment prin afisarea unui mesaj( se va utiliza functia
MessageBox
5. Sa se dezvolte o aplicatie care sa permita introducerea datelor despre studentii unei sectii, date care vor avea urmatoarea structura nume, prenume, numar
matricol si sa se adauge aceste informatii intr-o lista de tip CListBox. Sa se implementeze functii de editare a unei inregistrari din lista si de stergere a unei
inregistrari.
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre: |
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |