Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Introducere in utilizarea AppWizard. Controale de tip Button.
Pentru a usura scrierea aplicatiilor care utilizeaza MFC firma Microsoft a implementat in cadrul mediului de programare C++ un program utilitar numit AppWizard, care permite scrierea unor programe executabile in format Windows, fara a scrie practic nici o linie de program. AppWizard ofera o interfata de tipul casetelor de dialog, prin intermediul careia pot fi realizate majoritatea interfetelor Windows standard. Rolul AppWizard este de a oferi un schelet de program, pe baza caruia se implementeaza o interfata conform standardelor Windows.
In scopul accesarii utilitarului AppWizard proiectul se deschide cu optiunea MFC AppWizard (exe). Dupa alegerea numelui proiectului (de exemplu wiz1) si apasarea butonului OK, va apare caseta AppWizard care ofera trei optiuni pentru tipul de interfata al aplicatiei. Pentru realizarea unei aplicatii asistate, se alege optiunea Dialog Based. Fereastra aplicatiei afiseaza butoanele implicite OK si Cancel precum si un text eticheta. Fereastra are o bara de titlu, care contine numele proiectului creat, o pictograma asociata acestuia si un buton de inchidere. Fereastra poate fi deplasata cu ajutorul mouse-lui, la fel ca si orice fereastra asociata unei aplicatii Windows.
Odata cu apasarea butonului Finish pentru AppWizard, va apare panoul frontal de lucru obisnuit al Visual Studio. Fereastra de jos este fereastra de mesaje a mediului de programare, fereastra din dreapta este fereastra de cod, iar fereastra din stanga, este fereastra de lucru. Aceasta din urma, prin cele 3 componente Class View, Resource View si File View permite accesarea oricarei componente a proiectului.
In fereastra de cod, mediul de programare afiseaza implicit un panou care reprezinta sablonul pentru scheletul initial al interfetei aplicatiei. Sablonul aplicatiei este mentinut ca o resursa de dialog accesibila in pagina Resource View, prin intermediul identificatorului de dialog IDD_WIZ1_DIALOG. Cealalta resursa de dialog este caseta de prezentare, accesibila prin intermediul identificatorului IDD_ABOUTBOX. Si aceasta caseta de prezentare poate fi modificata.
Pentru modificarea interfetei aplicatiei, se foloseste metoda click-and-drag, utilizand componentele de interfata oferite de mediul de programare. De exemplu, este posibila inserarea unui buton, la apasarea caruia sa se execute o anumita actiune. Pentru aceasta, vom insera butonul Apasa, schimband in caseta Push Button Properties optiunea ID: din IDC_BUTTON1 in IDC_APASA. Pentru asocierea unei actiuni apasarii butonului, se selecteaza butonul (prin aparitia dreptunghiului de formatare) se face click dreapta si se selecteaza optiunea Events. La alegerea optiunii Events, va apare fereastra New Window Message and Event Handler. Aceasta fereastra permite asocierea de mesaje de dialog actiunilor asupra butonului Apasa. Astfel, daca se va apasa butonul, Windows va trimite casetei de dialog WIZ1 un mesaj. Acest mesaj poate fi interceptat prin intermediul casetei New Window Message and Event Handler si i se poate asocia o anumita secventa de cod care sa raspunda la eveniment. Daca se selecteaza BN_CLICKED evenimentul se va produce la apasarea butonului. Daca se selecteaza BN_DOUBLECLICKED evenimentul se produce la dublu click asupra butonului. Se selecteaza Add and Edit, actiune in urma careia va fi afisata caseta Add Member Function. In caseta se precizeaza numele functiei care va fi apelata de fiecare data cand va fi apasat butonul Apasa. Numele implicit al functiei este On<nume buton>, deci in cazul nostru, OnApasa. Se apasa OK pentru a accepta numele. Corpul noii functii va apare in fereastra de cod a editorului. Functia va fi adaugata ca membru al clasei CWiz1Dlg. Se modifica functia OnApasa() in conformitate cu listingul de mai jos. Functia MessageBox() afiseaza o caseta de dialog cu buton, in care este afisat textul precizat.
Functia MessageBox() poate fi apelata in mai multe forme:
MessageBox(" sir de caractere ") afiseaza textul cuprins intre ghilimele intr-o caseta de mesaj
MessageBox(" sir1 "," sir 2", MB_ICONSTOP) afiseaza o caseta de mesaj cu titlul sir2, in care este afisat mesajul sir1 precedat de semnul STOP.
MessageBox( pentru afisarea unei variabile necesita utilizarea functiei Format() a clasei CString pentru formatarea textului (similar cu functia printf() din Ansi C).
void CWiz1Dlg::OnApasa()
Se compileaza si lanseaza in executie programul.
Fereastra de lucru a proiectului ofera posibilitatea vizualizarii si lucrului cu diferitele componente ale proiectului. La deschiderea unui proiect, in partea de jos a ferestrei de lucru, sunt disponibile trei optiuni: Class View, Resource View si respectiv File View, fiecare prezentand cate o structura arborescenta de componente ale proiectului, respectiv clasele utilizate de aplicatia cuprinsa in proiect, resursele acesteia si fisierele utilizate de proiect. Structura arborescenta poate fi expandata sau condensata, apasand pe simbolurile + sau respectiv -.
Apasand eticheta Class View, in fereastra de lucru va apare structura de clase utilizate in cadrul proiectului. Aceste clase au fost create de AppWizard in faza de initializare a proiectului, ulterior fiind adaugate clase incluse de programator. Fiecare element aflat la nivelul secundar, mai putin elementul Global, reprezinta o clasa a proiectului. Astfel, proiectul wiz1, va contine clasele implicite CAboutDlg, CWiz1App si CWiz1Dlg. Aceste clase pot fi expandate ilustrand functii membru si variabile membru ale clasei respective. Se observa in clasa CWiz1Dlg functia creata la inserarea butonului Apasa, denumita OnApasa(). Pe langa posibilitatea de navigare si accesare a diferitelor clase, functii si variabile ale proiectului, Class View ofera si alte activitati, accesibile prin intermediul meniurilor contextuale. Pentru activarea unui meniu contextual, se selecteaza cu mouse-le o componenta a Class View si se efectueaza click dreapta. Meniul contextual permite efectuarea de diferite operatii asupra clasei selectate. In continuare vor fi prezentate cateva dintre ele:
Go to Definition - are acelasi efect cu efectuarea unui click dublu asupra clasei, adica aducerea pozitiei active a cursorului in fereastra de cod la definirea clasei respective.
References - daca a fost creat un fisier de navigare vor fi afisate toate locatiile din proiect care fac referire la elementul selectat. In fereastra din stanga este prezentat numele clasei, iar in fereastra din dreapta sunt afisate fisierele in care se face referire la clasa respectiva, precum si linia in care se face respectiva referire, specificandu-se de asemenea daca este vorba de definirea clasei, sau o referire la ea.
Derived Classes - afiseaza detalii privind clasa selectata precum si clasele derivate din aceasta
Base Classes - afiseaza detalii privind clasa selectata si toate clasele sale de baza, inclusiv clasele din biblioteca MFC
Group By Access - ordoneaza membrii clasei la afisare in ordinea tipului de acces: privat, protejat, public. Daca aceasta optiune nu este activata, membrii clasei sunt afisati in ordine alfabetica.
Add - permite adaugarea de membri (variabile sau functii) la clasa selectata. Prin selectarea uneia din aceste optiuni si adaugarea unei variabile sau functii, liniile de cod corespunzatoare vor fi automat adaugate in fisierele corespunzatoare.
Add Member Variable - adauga o variabila la clasa selectata.
Exemplu:
Se adauga la clasa CWiz1Dlg variabila de tip int, cu tipul de acces Public si cu numele m_NrClick.
Prin dublu click asupra numelui variabilei, in fereastra de cod se afiseaza declaratia acesteia, in fisierul header al clasei. Cum variabila va reprezenta un contor, ea trebuie initializata cu valoarea 0. Pentru aceasta, se adauga codul inscris ingrosat mai jos:
CWiz1Dlg::CWiz1Dlg(CWnd* pParent /*=NULL*/): CDialog(CWiz1Dlg::IDD, pParent)
}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent
Ø DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_NrClick=0;
Pentru ca numarul de apasari sa fie contorizat, este necesar ca la fiecare apasare a butonului Apasa, variabila m_NrClick sa fie incrementata. Cum la fiecare eveniment BN_CLICKED al butonului IDC_APASA este apelata functia OnApasa(), aceasta functie trebuie modificata, astfel incat de cate ori este apelata sa incrementeze variabila m_NrClick:
void CWiz1Dlg::OnApasa()
In acest moment, variabila m_NrClick va contoriza numarul de apeluri ale functiei OnApasa(). Pentru a crea o functie care sa afiseze la cerere numarul de click-uri se utilizeaza optiunea Add Member Function care permite adaugarea unei functii membru al clasei selectate. Vom defini functia int NrClickMessage (void), prin tastarea tipului int in caseta Function Type, si a numelui NrClickMessage in caseta Function Declaration. Daca functia ar fi avut parametri in declaratie, acestia ar fi fost introdusi aici. Declaratia functiei va fi automat inserata in cadrul clasei, dar nu va contine nimic si in plus, functia va apare in lista Class View. Se va modifica functia ca mai jos:
int CWiz1Dlg::NrClickMessage()
return 1;
}
else
Daca butonul nu a fost apasat niciodata, functia va intoarce valoarea 0 iar altfel valoarea 1 (TRUE).
La fel ca si clasele proiectului, in cazul selectarii etichetei Resource View vor fi afisate resursele acestuia, adica toate elementele vizuale ale proiectului. Acestea sunt casetele, meniurile, pictogramele, etc. Resursele de tip Dialog contin casetele de dialog afisate de program. De exemplu, IDD_WIZ1_DIALOG afiseaza caseta principala a programului, aceasta putand fi editata. Resursele de tip Icon contin pictogramele asociate proiectului. La dublu click pe o astfel de resursa, se va intra in editarea pictogramei. Pictograma principala a proiectului este mentinuta de IDR_MAINFRAME. Prin dublu click pe IDR_MAINFRAME aceasta va putea fi desenata dupa dorinta programatorului, utilizand programul de desenare lansat automat. La fel ca si in cazul anterior si pentru Resource View se afiseaza un meniu contextual la click dreapta asupra resursei. Prin intermediul optiunii Insert in proiect pot fi inserate resurse noi, de tipul: tabele de acceleratori, bitmap, cursor, pictograme, dialog, meniu, tabela de siruri, bara de instrumente, versiune.
Tabela de acceleratori - este o tabela continand asocieri intre combinatii de taste si comenzi din program, comenzi selectabile in mod normal intr-un meniu;
O resursa bitmap - este o imagine de o dimensiune oarecare, compusa din puncte care pot fi colorate diferit. In general desenele din barele de unelte sunt bitmapuri;
O pictograma - este tot o resursa de tip imagine. Ea este asociata in general anumitor componente din program;
O resursa de tip dialog - este o caseta, o fereastra, care poate contine celelalte tipuri de resurse.
O resursa de tip meniu - este un meniu care permite alegerea anumitor optiuni pentru executia unor actiuni in program;
O resursa de tip tabela de siruri - ar trebui sa contina toate sirurile de caractere folosite intr-o aplicatie. Fiecare element are asociat un identificator unic, utilizat pentru a referi sirul in cadrul codului sursa. Se utilizeaza pentru traducerea usoara a tuturor mesajelor din program in alte limbi;
O bara cu instrumente - este o bara continand butoane asociate unor comenzi din meniu. Butoanele pot fi explicitate prin informatii grafice sau alfanumerice;
O resursa de tip versiune - contine informatii cu privire la produs.
La inserarea unei noi resurse in proiect, aceasta va primi implicit un nume caracteristic tipului din care face parte. Acest nume poate fi modificat dupa dorinta programatorului. Numele resurselor utilizate in proiect pot fi vazute in meniul View sau in meniul contextual.
In continuare, vom asocia butonului OK din aplicatia noastra rolul de a afisa de cate ori a fost apasat butonul Apasa. Pentru aceasta se executa urmatoarele:
Se executa dublu click asupra resursei de dialog IDD_WIZ1_DIALOG pentru a deschide macheta asociata;
Se executa dublu click asupra butonului OK, pentru a fi afisata caseta Add Member Function si, acceptam numele functiei implicit, adica OnOK();
3. Se apasa OK. In acest moment, scheletul noii functii este automat inserata in proiect in clasa CWiz1Dlg.
4. Se editeaza functia OnOK() ca mai jos:
void CWiz1Dlg::OnOK()
In acest fel, daca m_NrClick>0, NrClickMessage() va returna valoarea 1, deci se va executa OnOK(). Adica, va fi afisata caseta care spune de cate ori a fost apasat butonul dupa care va executa functia OnOK(), adica va termina programul. In cazul in care se va apasa OK inainte de a apasa Apasa, m_NrClick=0, deci NrClickMessage() va returna valoarea 0, rezultand ca OnOK() nu se executa.
In cadrul optiunii File View, fereastra de lucru va afisa fisierele care compun proiectul. Fisierele sunt organizate pe cataloage, in functie de tipul lor. Pentru accesarea unui fisier, este suficient sa se faca dublu click pe numele lui. Cateva tipuri uzuale de fisiere sunt:
Extensie |
Tip |
Descriere |
.dsw |
Workspace |
Contine informatiile continute pentru restaurarea unui spatiu de lucru |
.dsp |
Proiect |
Retine informatiile despre proiect |
.clw |
Class Wizard |
Retine informatiile despre clasele utilizate de Class Wizard |
.ncb |
Navigare fara compilare |
Contine informatii de navigare, utilizate de Class View |
.opt |
Optiuni |
Contine optiuni de personalizare a spatiului de lucru |
.cpp |
Sursa C++ |
Contine coduri sursa |
.h |
Antet C++ |
Contine cod de declaratii de clase |
.rc |
Resource Script |
Contine informatii despre resurse, cum ar fi casetele de dialog, meniurile, etc. |
.rc2 |
Resource Script |
Contine informatii pentru includerea de resurse in mai multe proiecte |
.bmp |
Bitmap |
Imagini bitmap |
.ico |
Pictograma |
Imagini pictograma |
Si in cazul fisierelor, poate fi accesat un meniu contextual, care permite diferite operatii asupra fisierelor.
Observatie: Exista doua modalitati de adaugare a functiilor si/sau variabilelor intr-un program. Functiile care raspund la un mesaj Windows si respectiv variabilele care mapeaza un anumit obiect sau o proprietate a acestuia, se insereaza prin intermediul meniului contextual asociat obiectului, respectiv cu ajutorul Class Wizard. Celelalte functii, respectiv variabile, apartinand unei anumite clase, se adauga cu ajutorul meniului contextual asociat clasei reespective, respectiv Add Member Function sau Add Member Variable.
Controale de tip button
Pentru inserarea de controale in casetele de dialog, se utilizeaza bara cu instrumente de control, care poate fi afisata prin urmatoarele comenzi: Tools -> Customize -> Toolbars -> Controls -> Close.,
O alta bara de unelte pentru manipularea controalelor este bara Dialog, prin intermediul careia controalele pot fi pozitionate in interiorul casetei de dialog. Daca bara nu apare implicit, ea poate fi afisata prin intermediul comenzilor: Tools -> Customize -> Toolbars -> Dialog -> Close. Aceasta bara permite centrari, spatieri, alinieri, egalarea dimensiunilor controalelor, etc.
Pentru adaugarea de controale in caseta de dialog, este suficient sa se realizeze click-and-drag asupra controlului din bara Controls. Asupra controalelor se pot face urmatoarele operatii:
1. dimensionare -prin selectare si prinderea marginilor dreptunghiului de formatare;
2. dimensionarea in functie de continut: se selecteaza controlul, se afiseaza meniul contextual si se alege Size to Content;
3. dimensionarea identica a mai multor controale: se selecteaza mai multe controale, prin selectarea unuia, tinerea apasata a tastei Shift sau Ctrl si selectarea celorlalte controale. Apoi, din Layout->MakeSameSize se alege care dimensiune dorim sa fie la fel (latime, inaltime sau ambele);
4. alinierea - se selecteaza grupul de controale ce dorim sa fie aliniate si apoi cu Layout->Align se alege tipul de aliniere dorita.
Este posibila gruparea mai multor controale intr-o caseta de grupare. Pentru aceasta, se parcurg urmatoarele etape:
1. se selecteaza optiunea caseta de grupare (Group Box) din bara de controale;
2. se pozitioneaza in caseta de dialog, se dimensioneaza si se editeaza titlul (meniu contextual, Properties);
3. se insereaza controalele dorite, cum ar fi casete de validare (Check Box) din bara de controale;
4. se editeaza etichetele controalelor (meniu contextual, Properties);
5. se aliniaza controalele (Layout->Align);
Controalele dintr-o caseta pot fi accesate pe baza unei ordini de selectare utilizand tasta Tab pentru urmatorul control, si combinatia Shift+Tab pentru controlul precedent. Stabilirea ordinii de selectare se face astfel:
1. se selecteaza Layout->Tab Order;
2. se numeroteaza controalele din caseta de dialog;
3. modificarea ordinii este posibila prin click pe control;
4. pentru testarea ordinii de selectare, se alege Layout->Test, sau se apasa Ctrl+T;
Selectarea in timpul programului a unui control, realizeaza primirea focusului acestuia. Un control cu focus va fi marcat diferit. De exemplu, un buton va primi in interior un dreptunghi cu linie punctata, o caseta de editare va afisa in interior un prompter, etc. Etichetele statice nu pot primi focusul.Un control poate fi eliminat din ordinea de selectare, prin invalidarea proprietatii Tab Stop din pagina General a casetei Control Property.
Este posibila specificarea unei taste de acces pentru un control prin inserarea simbolului & in eticheta controlului, inainte de caracterul care va avea rol de mnemonica. Mnemonica este un caracter subliniat, care poate fi utilizat ca o scurtatura pentru activarea controlului respectiv. De exemplu, un buton cu eticheta Test, va avea scris in caseta Caption de la Properties eticheta T&est. El va putea fi activat, pe langa mouse si de combinatia de taste Alt+E sau Alt+e. Exista posibilitatea ca mai multe etichete sa aiba aceeasi mnemonica. In acest caz, la apasarea mnemonicei, va fi activat primul control considerand ordinea de selectare. Existenta mnemonicelor multiple, se verifica cu optiunea Check Mnemonics din meniul contextual.
Butoanele sunt controalele cel mai des utilizate. Exista trei tipuri de butoane:
butoane de comanda - reprezinta o comanda care se executa la efectuarea unui click asupra burtonului;
butoane de optiune - permit selectarea unei optiuni, dintr-o lista de optiuni care se exclud reciproc. La un moment dat, poate fi selectata o singura optiune din grup;
casete de validare - permit o optiune, in sensul selectarii unui element. La un moment dat, pot fi selectate mai multe optiuni;
Butoanele de comanda sunt acele butoane, la a caror apasare programul executa o singura comanda, implementata prin intermediul unei functii (de ex. butoanele OK si Cancel). La proprietatea BN_CLICKED, denumirea implicita a functiilor asociate acestor butoane sunt OnOK() si OnCancelMode(); Aceste functii sunt functii ale clasei care implementeaza functiile de baza MFC si anume CDialog. Pentru implementarea actiunilor care au loc la apasarea (BN_CLICKED) a butoanelor IDC_NUMEBUTON, se genereaza automat scheletele functiilor cu numele implicite OnNumebuton().
Butoanele de optiune sunt utilizate pentru a selecta o singura optiune dintr-un grup de mai multe optiuni, mutual exclusive. Prin selectarea unui buton, toate celelalte butoane vor fi automat deselectate. Cum selectarea si deselectarea butoanelor dintr-un grup se face automat, singurul lucru pe care trebuie sa-l faca programul este sa afle care din optiunile care se exclud mutual este selectata. In acest scop, grupului butoanelor de optiune li se asociaza o variabila. Pentru fiecare buton de optiune dintr-un grup, este stabilita implicit proprietatea Auto Style, care asigura deselectarea automata a tuturor celorlalte butoane la selectarea unuia dintre ele. Gruparea impreuna a butoanelor se face prin optiunea Group din caseta Properties. Primul control care are aceasta optiune validata va fi considerat primul control din grup, iar toate celelalte controale care urmeaza, avand optiunea deselectata, se considera ca facand parte din acelasi grup. Grupul se termina la intalnirea unui nou control cu optiunea Group selectata, sau la terminarea controalelor. Deplasarea intre controalele din grup se fac cu ajutorul tastelor sageata (sau cu Tab).
Casetele de validare permit utilizatorului sa selecteze una sau mai multe optiuni. Casetele de validare nu sunt mutual exclusive. O caseta de validare standard, atunci cand este selectata, afiseaza un marcaj de bifare (in Windows 95/98) sau o cruciulita de bifare (in Windows NT). Ca si in cazul butoanelor de optiune, programul trebuie sa citeasca starea casetelor de validare, pentru a putea actiona in consecinta.
In cazul casetelor de dialog accesul la proprietatile controalelor se face prin intermediul functiei CWnd::GetDlgItem(). Aceasta functie avand prototipul
CWnd GetDlgitem(int nID) const
Are ca intrare ID-ul controlului in cauza si ca iesire un pointer catre obiectul CWND care reprezinta acel control. Clasa CWnd incapsuleaza o fereastra si ofera functionalitatea de baza a acesteia. Obiectul CWnd este un obiect C si nu fereastra propriu-zisa. Functia GetDlgItem() intoarce un pointer CWnd, deoarece un control, in cazul nstru un buton , reprezinta de fapt o fereastra.
Clasa MFC care incapsuleaza functionalitatea butoanelor de tip control, casete de optiune si casete de validare, este CButton. Pentru a putea utiliza functiile membru ale cestei clase, pointerul intors de GetDlgItem() trebuie convertit prin intermediul operatorului Cast la un pointer CButton. Pentru manipularea starii casetelor de validare, se folosesc urmatoarele functii:
CButton::GetCheck, de forma int GetCheck( ) const; Functia returneaza 0 daca caseta de validare este nevalidata, respectiv 1 daca caseta este validata;
CButton::SetCheck, de forma void SetCheck( int nCheck ); Variabila nCheck trebuie sa fie 0 pentru a seta starea casetei la nevalidat si respectiv 1 pentru a seta starea casetei la validat.
Exemple ptr Butoane de comanda.
1. Se propune realizarea urmatorului proiect Proj1: se insereaza un buton numit "Buton" care va fi comutat intre starile Arata/Ascunde prin intermediul unui alt buton numit "ArataAscunde". Se vor utiliza urmatoarele functii:
CWnd::ShowWindow de forma BOOL ShowWindow(int nCmdShow); - functia returneaza o valoare diferita de 0 (TRUE) daca fereastra specificata de obiectul CWnd era afisata si 0 daca era ascunsa.
CWnd IsWindowVisible de forma BOOL IsWindowVisible() const; - returneaza o valoare diferita de zero (TRUE) daca obiectul CWnd este vizibil.
Proiectul presupune parcurgerea urmatorilor pasi:
Se introduc butoanele Buton si ArataAscunde.
Se insereaza functia OnArataAscunde corespunzatoare mesajului On_ArataAscunde de forma:
void CProj1Dlg::OnArataAscunde()
Parametrul functiei ShowWindow este SW_HIDE, presupunand "ascunde" daca bVisible este TRUE si SW_SHOW in caz contrar.
Se propune realizarea urmatorului proiect Proj2: idem cu Proj1 dar butonul Buton va fi Validat/Invalidat prin intermediul butonului ValidatInvalidat. Se utilizeaza urmatoarele functii:
CWnd::IsWindowEnabled de forma BOOL IsWindowEnabled() const; - functia intoarce valoarea TRUE daca obiectul CWnd este activat si FALSE in caz contrar.
CWnd::EnableWindow de forma BOOL EnableWindow(BOOL bEnable=TRUE); - functia activeaza fereastra referita daca bEnable este TRUE, si deazactiveaza fereastra daca bEnable este FALSE.
Functia OnValidatInvalidat corespunzatoare butonului ValidatInvalidat se va scrie astfel:
void CProj2Dlg::OnActiveazaDezactiveaza()
Se propune realizarea urmatorului proiect Proj3: se insereaza un buton care isi schimba textul de la Caption din BUTON in Buton si invers la fiecare apasare. Se vor utiliza functiile:
CWnd::SetWindowText()de forma void SetWindowText(LPCTSTR lpszString); lpszString pointeaza spre un obiect de tip CString care va fi utilizat ca nou titlu al casetei de dialog sau nou text afisat pe un control.
CWnd::GetWindowText de forma void GetWindowText(CString& rString) const; - functia inlocuieste campul Caption al controlului cu continutul obiectului rString.
Se scrie functia OnButon astfel:
void CProj3Dlg::OnButon()
Se realizeaza urmatorul proiect numit Proj4.
a. Se insereaza butonul Afiseaza cu ID-ul IDC_AFISEAZA si eticheta Afiseaza.
b. Se creaza caseta de grup cu titlul Culoare. Se invalideaza optiunea TabStop din caseta Group Box Properties.
c. Se insereaza 2 butoane de optiune. Se selecteaza aceste butoane si se alineaza (Layout->Align->Left). Se selecteaza primul buton, se intra in caseta Radio Button Properties si se face IDC_ROSU si Caption: Rosu, si se valideaza optiunile Group si Tab Stop. Pentru al doilea buton, cu IDC_ALBASTRU si Caption: Albastru se valideaza doar optiunea Tab Stop.
d. Se creaza caseta de grup cu titlul Forma. Se invalideaza optiunea Tab Stop din caseta Group Box Properties.
e. Se insereaza 2 butoane de optiune. Se selecteaza impreuna aceste butoane si se alineaza (Layout->Align->Left) apoi cu toate butoanele selectate se activeaza optiunea Properties din meniul contextual. In caseta Multiple Selection Properties, eticheta Styles se selecteaza optiunea Push-Like. Astfel, butoanele de optiune vor lua aparenta unor butoane de comanda dar vor pastra proprietatea de excluziune mutuala.
f. Se selecteaza primul buton, seintra in caseta Radio Button Properties si se face IDC_CERC cu Caption: Cerc. Se valideaza optiunile Group si Tab Stop.
g. Se selecteaza al doilea buton, se intra in caseta Radio button Properties si se face IDC_PATRAT cu Caption: Patrat. Se valideaza optiunea Tab Stop.
h. Se insereaza doua casete de validare (Check Box)
i. Se selecteaza prima caseta si la Check Box Properties(optiunea Properties din meniul contextual) se stabilesc:IDC_CONTUR, Caption:Contur. Se valideaza optiunile Group si Tab Stop.
j. Se selecteaza a doua caseta de validare si se stabilesc: IDC_PLIN, Caption: Plin. Se valideaza optiunea Tab Stop.
k. Se lanseaza Class Wizard (View->ClassWizard), se selecteaza Member Variables, iar in caseta Class Name se selecteaza numele clasei asociate dialogului, CProj4Dlg. Se selecteaza in caseta Control Ids ID-ul primului control din grup, IDC_ROSU. Se apasa butonul Add Variable. Este afisata caseta de dialog Add Member Variable in care se introduce numele variabilei, m_nCuloare.
l. Similar, se introduce variabila m_nForma corespunzator butonului IDC_CERC.
m. Constructoul clasei CProj4Dlg va fi completat cu instructiunile:
m_nCuloare
m_nForma=0;
n. Se adauga functia OnContur() activata de evenimentul BN_CLICKED de forma:
o. Se adauga functia OnPlin() activata de evenimentul BN_CLICKED de forma:
CButton* pContur=(CButton*) GetDlgItem(IDC_CONTUR);
CButton* pPlin=(CButton*) GetDlgItem(IDC_PLIN);
// daca se cere Plin se selecteaza automat si Contur
if (pPlin->GetCheck()) pContur->SetCheck(1);
p. Functia OnAfiseaza se implementeaza sub forma:
void CProj4Dlg::OnAfiseaza()
MessageBox(strMessage);
Observatii:
Scopul unui grup de butoane de optiune este sa aleaga un element din mai multe. Programul trebuie sa dentifice butonul selectat din grup si sa actioneze in consecinta. Pentru aceasta grupului I se asociaza o variabila. Variabila este asociata preimului buton din grup. La punctele k si l se asociaza aceste variabile, numite m_nCuloare si m_nForma butoanelor IDC_ROSU si respectiv IDC_CERC.
Dupa introducerea variabilelor m_nForma si m_nCuloare utilizand ClassWizard acestea sunt initializate automat cu valoarea -1. Aceasta inseamna ca nici unul dintre butoanele asociate nu este accesibil. In mod normal, aceste variabile vor pastra numarul (relativ la inceputul grupului) al butonului selectat. Pentru ca butoanele sa fie functionale aceste variabile vor trebui initializate prin program. De aceea la punctul m aceste variabile se initializeaza cu 0
Functia CWnd::UpdateData de forma BOOL UpdateData(BOOL bSaveAndValidate=TRUE);
Va prelua informatiile asupra controalelor din caseta de dialog si va actualiza variabilele asociate grupurilor. Daca de ex., este selectat butonul de optiune IDC_ROSU, m_nCuloare ia valoarea 0, daca este selectat IDC_ALBASTRU atunci m_nCuloare ia valoarea 1.
4. In programul de mai sus starea celor doua casete de validare este stabilita astfel incat daca se selecteaza optiunea Plin, automat se selecteaza si optiunea Contur.
Teme:
1. Fie o caseta de dialog ce contine 3 butoane. La apasarea a doua dintre ele numele acestora se memoreaza intr'o variabila. La apasarea celui de-al treilea buton se va afisa intr-o casuta de afisare ordinea in care au fost apasate butoanele indicand numele acestora.
Copyright © 2024 - Toate drepturile rezervate