Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

C


Index » educatie » » informatica » C
» Controale orientate spre intervale de valori


Controale orientate spre intervale de valori


Controale orientate spre intervale de valori

Aceste controale permit ilustrarea dinamicii unui program, actiuni, fenomen si sunt de trei tipuri: controale indicator de evolutie (Progress), glisor (Slider) si bara de derulare (Scroll Bar).

Controalele indicator de evolutie sunt utilizate pentru a evidentia stadiul de desfasurare a unei actiuni de durata. Acestea apar in general sub forma unui cursor care se deplaseaza sau umple interiorul unei casete. Adaugarea unui control de evolutie se face prin adaugarea din caseta Controls a unui control de tip Progress. Stilurile disponibile pentru indicatorul de evolutie sunt:

Border - Selectia acestei optiuni are ca efect incadrarea controlului cu un chenar subtire, negru;

Vertical - Selectia acestei optiuni are ca efect desenarea controlului pe verticala;



Smooth - Selectia acestei optiuni are ca efect desenarea in interiorul controlului a unei bare continue, nu formate din blocuri.

Pentru manipularea controalelor de tip indicator de evolutie, va trebui sa putem atasa acestora o clasa MFC care sa ofere metode de acces la acestea, precum si sa putem sa le atasam variabile care sa le reprezinte. Atasarea unei variabile se face similar cazurilor precedente, utilizand Class Wizard.

1. se lanseaza Class Wizard;

2. se selecteaza pagina Member Variables, avand grija ca in caseta Class Name sa fie selectata clasa C<nume proiect>Dlg,

3. se selecteaza in caseta Control IDs IDC_Nume si se apasa Add Variable;

4. se insereaza variabila m_Evolutie, de categorie Control si tip CProgressCtrl.

5. Se apasa OK pentru a iesi din Class Wizard;

In acest fel, a fost definita peste indicatorul de evolutie o variabila de tip CProgressControl, care este clasa care descrie acest tip de controale. Toate actiunile executate asupra controlului vor putea fi accesate utilizand metodele acestei clase si vor fi efectuate asupra variabilei care mapeaza controlul. Controlul indicator de evolutie are asociat un interval care defineste valorile intregi corespunzatoare starilor controlului, de la un control gol (0%) pana la un control plin (100%). Exista de asemenea o pozitie curenta, ce determina procentul in care trebuie umplut controlul la un moment dat, in corespondenta cu avansul in cadrul intervalului definit. De asemenea, se poate stabili o valoare de increment, care este valoarea cu care avanseaza controlul la un pas. Cursorul va avansa cu aceasta valoare la fiecare apel al functiei StepIt(). Marginile intervalului intre care evolueaza controlul pot fi stabilite cu ajutorul functiilor SetRange() sau SetRange32(). Prima functie accepta valori intregi (pe 16 biti) pentru limite, putand deci stabili valori in intervalul [-32768,32767]. A doua functie lucreaza cu valori de tip long int (pe 32 de biti), extinzand intervalul in care pot fi stabilite marginile la [-2147483648, 2147483648]. Cum valorile pentru limite sunt stabilite o singura data, se sugereaza initializarea controlului in interiorul functiei OnInitDialog(). Limitele stabilite pentru indicatorul de evolutie pot fi citite prin intermediul functiei GetRange(). Pozitia cursorului indicatorului de evolutie se modifica cu ajutorul functiei SetPos(). Aceasta actualizeaza pozitia controlului la valoarea intreaga transmisa ca parametru si va redesena controlul pentru a reflecta modificarea survenita. Daca valoarea superioara depaseste valoarea limita superioara a controlului cursorul acestuia va umple in intregime controlul, iar daca este sub valoarea limitei inferioare, controlul este gol. Cu ajutorul acestei functii, cursorul este pozitionat la o valoare absoluta. Modificarea pozitiei curente se poate face si cu o valoare relativa, prin intermediul functiei OffsetPos(). Cand se transmite o valoare prin intermediul acestei functii, valoarea este adunata la pozitia curenta a cursorului si cursorul este redesenat pentru a reflecta noua valoare. Valoarea de increment se fixeaza cu functia SetStep(), iar incrementarea efectiva a cursorului cu incrementul respectiv se face cu functia StepIt().

Controlul glisor permite utilizatorului sa stabileasca o valoare, prin deplasarea unui cursor.

Sunt permise urmatoarele stiluri:

Orientation - specifica orientarea orizontala sau verticala a controlului;

Point - stabileste tipul cursorului:

Both - cursorul este dreptunghiular

Top/Left - cursorul are un varf indreptat in sus in cazul unui cursor orizontal, respectiv inspre stanga, in cazul unui cursor vertical;

Bottom/Right - cursorul are un varf indreptat in jos in cazul unui cursor orizontal, respectiv inspre dreapta, in cazul unui cursor vertical;

Tick Marks - validarea acestei optiuni va avea ca efect afisarea de mici diviziuni pe directia cursorului, situate in directia orientarii cursorului;

Auto Ticks - validarea acestei optiuni are ca efect plasarea diviziunilor de-a lungul intervalului, astfel incat sa corespunda valorii curente a incrementului;

Enable Selection - validarea acestei optiuni are ca efect adaugarea unei bare albe, care permite programului sa afiseze un interval de selectie prin intermediul unor mici triunghiuri;

Border - validarea acestei optiuni va afisa un chenar in jurul controlului.

Clasa care implementeaza functionalitatea controalelor de tip glisor este CSliderCtrl. Pentru a putea implementa diferitele functii ale glisorului, este necesar sa-i asociem o variabila de tip CSliderCtrl. utilizand Class Wizard. Intervalul de actiune al unui control glisor poate fi stabilit prin intermediul functiei SetRange(), parametrii acestei functii fiind pozitia minima si maxima asociate cursei glisorului. Optional, se poate transmite valoarea False pentru al treilea parametru al functiei, pentru a impiedica redesenarea automata a controlului. Limitele superioara si inferioara pot fi stabilite si individual, prin intermediul functiilor SetRangeMin() si SetRangeMax(). Similar, functiile GetRangeMin() si GetRangeMax() vor intoarce aceste valori. Pozitia cursorului este stabilita de functia SetPos(), sau intoarsa de functia GetPos(). Utilizatorul poate incrementa pozitia glisorului, cu valori de linie sau pagina, apasand tastele sageata, respectiv PageUp sau PageDown. Prin program, utilizatorul poate stabili valorile de increment pentru deplasarea cu o linie sau cu o pagina, prin intermediul metodelor SetLineSize() si SetPageSize(). Valorile curente pentru aceste incremente sunt determinate cu metodele GetLineSize() si GetPageSize(). In cazul in care este setat stilul cu diviziuni Auto Ticks, frecventa de desenare a acestora poate fi determinata prin metoda SetTickFrec(). De fiecare data cand pozitia glisorului este modificata, controlul glisor trimite un mesaj corespunzator ferestrei care il contine. Mesajele sunt WM_HSCROLL si WM_VSCROLL corespunzatoare pozitiei orizontale, respectiv verticale a cursorului. Crearea de functii asociate acestor mesaje se face urmand secventa cunoscuta din Class Wizard. Clasa dialog principala a unei aplicatii de tip dialog este cea care incapsuleaza fereastra parinte a glisorului, prin urmare functia de tratare a mesajului trebuie creata aici. Aceasta este clasa care trebuie selectata in lista Class or Object to Handle din caseta New Window Message/Events al optiunii Events al meniului contextual asociat clasei principale. Adaugarea se face cu Class Wizard. Acesta va insera urmatoare secventa de cod:

void C<nume proiect>Dlg::OnHScroll(UINT nSBCode, UINT nPos,

Ø CScrollBar* pScrollBar)

Parametrul nSBCode este un parametru care arata tipul operatiei de derulare efectuate de catre utilizator. Aceasta operatie depinde de modul in care a fost utilizat controlul si de orientarea acestuia. Valorile posibile pentru acest parametru sunt:

OnVScroll

Valoare

Semnificatie

SB_BOTTOM

SB_ENDSCROLL

SB_LINEDOWN

SB_LINEUP

SB_PAGEDOWN

SB_PAGEUP

SB_THUMBPOSITION

SB_THUMBTRACK

SB_TOP

Deplasare in partea de jos a controlului;

Terminare deplasare;

Deplasare o linie in jos;

Deplasare o linie in sus;

Deplasare o pagina in jos;

Deplasare o pagina in sus;

Deplasare la pozitia absoluta, indicata de nPos si eliberarea butonului mouse-lui;

Tragerea controlului intr-o anumita pozitie. Aceasta pozitie este apoi regasita in nPos;

Deplasare in partea de jos a controlului:

OnHScroll

Valoare

Semnificatie

SB_LEFT

SB_ENDSCROLL

SB_LINELEFT

SB_LINERIGHT

SB_PAGELEFT

SB_PAGERIGHT

SB_THUMBPOSITION

SB_THUMBTRACK

SB_RIGHT

Deplasare in partea stanga a controlului;

Terminare deplasare;

Deplasare o linie in stanga;

Deplasare o linie in dreapta;

Deplasare o pagina in stanga;

Deplasare o pagina in dreapta;

Deplasare la pozitia absoluta, indicata de nPos si eliberarea butonului mouse-lui;

Tragerea controlului intr-o anumita pozitie. Aceasta pozitie este apoi regasita in nPos;

Deplasare in partea dreapta a controlului:

Parametrul nPos va fi actualizat cu valoarea curenta a pozitiei barei de derulare. Pointerul pScrollBar este utilizat pentru identificarea controlului care a generat mesajul.

Controlul bara de derulare este atasat in general in partea dreapta sau in partea inferioara a unei ferestre, in scopul derularii continutului acesteia. In general, atasarea barelor de derulare pentru derularea continutului unei ferestre se face automat. Barele de derulare pot fi utilizate si independent, pentru a specifica o pozitie in cadrul unui interval, la fel ca si controlul glisor. O mare parte din functionalitatile celor doua tipuri de controale coincid. Pagina Styles a controlului contine doar optiunea Align, care permite alinierea barei de derulare dupa una din urmatoarele optiuni:

None - este valoarea implicita si realizeaza desenarea unei bare de derulare de dimensiuni egale cu bara de derulare plasata pe macheta casetei de dialog;

Top/Left - duce la desenarea unei bare de derulare avand latimea standard si fiind aliniata la marginile din stanga si superioara a barei de derulare plasata pe macheta casetei de dialog;

Bottom/Right - are aceeasi optiune ca si cea precedenta, dar bara de derulare va fi aliniata la marginile din dreapta si inferioara a barei de derulare plasate pe macheta de dialog.

Cu ajutorul Class Wizard se poate asocia o variabila barei de derulare. Clasa care mapeaza functionalitatea barei de derulare este CScrollBar. Daca in Class Wizard variabila se alege de categoria Control, ea va mapa un obiect al acestei clase. Daca se alege de categoria Value, tipul va fi implicit int, ceea ce va avea ca efect maparea peste control a unei variabile de tip intreg, care va trebui apoi actualizata de o maniera similara cu actualizarea controlului asociat unei casete de editare, cu pozitia curenta a cursorului. Aceasta implica complicatii suplimentare, de obicei preferandu-se asocierea unei variabile de tip CScrollBar, aceasta permitand utilizarea metodelor asociate clasei.

Pentru activarea sau dezactivarea unora din functiile barei de derulare se poate apela metoda EnableScrollBar(), transmitandu-i una din valorile de mai jos:

Valoare

Descriere

ESB_DISABLE_BOTH

ESB_DISABLE_LTUP

ESB_DISABLE_RTDN

ESB_ENABLE_BOTH

Dezactiveaza ambele butoane de pe bara de derulare;

Dezactiveaza butonul din stanga sau de sus, in functie de orientarea barei de derulare;

Dezactiveaza butonul din dreapta sau de jos, in functie de orientarea barei de derulare;

Activeaza ambele butoane ale barei de derulare;

Pozitia curenta a cursorului barei de derulare se poate seta cu metode SetScrollPos() si transmitand o valoare intreaga care reprezinta pozitia absoluta, sau se poate determina cu metoda GetScrollPos().

Anumite atribute ale barei de derulare sunt pastrate intr-o structura de tip SCROLLINFO de urmatoarae forma:

typedef struct tagSCROLLINFO SCROLLINFO;

typedef SCROLLINFO FAR *LPSCROLLINFO;

unde

cbSize - specifica dimensiunea in octeti a structurii;

fMask - specifica parametrii barei, care trebuie setati sau determinati, care pot fi:

Valoare simbolica

Descriere

SIF_ALL

SIF_DISABLENOSCROLL

SIF_PAGE

SIF_POS

SIF_RANGE

SIF_TRACKPOS

Combinatie a SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS;

Se utilizeaza numai la setarea parametrilor. Ca efect, daca noii parametrii fac ca bara de derulare nu mai fie necesara, aceasta este dezactivata in loc sa fie stearsa;

Variabila nPage contine valoarea dimensiunii paginii pentru o bara proportionala;

Variabila nPos contine pozitia barei, care nu este actualizata cand utilizatorul trage de bara;

Variabilele nMin si nMax contin limitele barei;

Variabila nTrackPos contine valoarea curenta a pozitiei cursorului;

nMin - limita minima a pozitiei cursorului;

nMax - limita maxima a pozitiei cursorului;

nPage - dimensiunea paginii, in procente, din dimensiunea documentului. Este utilizata pentru a desena o bara de derulare proportionala cu dimensiunea paginii; Daca de exemplu, un document are o singura pagina, nPage va trebui setat la 100. Pentru 2 pagini, nPage=50, iar pentru 10 pagini nPage=10;

nPos - specifica pozitia barei;

nTrackPos - specifica pozitia curenta a cursorului.

Aceasta structura poate fi actualizata prin intermediul functiei SetScrollInfo(), sau parametrii ei pot fi determinati prin intermediul functiei GetScrollInfo(). De exemplu, pentru un document de 10 pagini, initializarea unei astfel de structuri este:

SCROLLINFO ScrollBar;

ScrollBar.cbSize=sizeof(SCROLLINFO);

ScrollBar.nPage=10;

ScrollBar.fMask=SIF_PAGE;

m_Bar1.SetScrollInfo(&ScrollBar);

Aceasta secventa de program se ataseaza functiei de initializare, dupa apelul SetScrollRange(). Prin secventa, am definit o structura SCROLLINFO, careia i se completeaza dimensiunea, se seteaza parametrul nPage si se transmite masca, care specifica ca acesta este parametrul esential.

Exemplul 1. Sa se realizeze proiectul care contine un control de tip evolutie (Progress) si un buton numit Avans. La fiecare apasare a butonului Avans se efectueaza un pas in umplerea controlului.

a.       Se introduce butonul Avans si controlul IDC_EVOLUTIE. Se adauga cu ClassWizard variabila m_Evolutie de tip CProgressControl.

b.      In funtia OnInitDialog() se initializeaza controlul de tip evolutie astfel:

BOOL Cproj1Dlg::OnInitDialog()

c.       Se adauga functia de initializare:

void CProj1Dlg::InitEvolutie()

d.      Pentru butonul Avans se asociaza evenimentului BN_CLICKED functia:

void Cproj1Dlg::OnAvans()

Observatie: La o apasare ulteriora umplerii controlului cursorul este reinitializat.

Exemplul 2. Sa se adauge la proiectul anterior un control de tip glisor (Slider). La actualizarea pozitiei controlului de tip progres se va actualiza si controlul de tip glisor.

a.       Se adauga un control IDC_GLISOR caruia i se asociaza variabila m_Glisor de tip CSliderCtrl.

b.      In OnInitDialog() se adauga apelul de functie InitGlisor() dupa InitEvolutie().

c.       Functia InitGlisor se implementeaza astfel:

void CProj1Dlg::InitGlisor()

d.      In ClassWizard la pagina MesasgeMaps, avand la optiunea Class Name selectat CProj1Dlg iar la optiunea ObjectIDs tot CProj1Dlg, se alege in caseta Messages WM_HSCROLL si se apasa Add Function. Se adauga functia OnHScroll(), cu urmatoarea implementare:

Exemplul 3. Sa se adauge la proiectul anterior un control tip bara de derulare, IDC_BARA cu acelasi comportament ca si controlul de tip glisor.

a.       Se adauga controlul IDC_BARA si variabila asociata m_Bara de tip CScrollBar.

b.      Se adauga in OnInitDialog() functia InitBara() dupa linia InitGlisor().

c.       Se adauga functia InitBara cu urmatoarea implementare:

void CProj1Dlg::InitBara()

d.      Se actualizeaza functia OnHScroll() astfel:



void CCcDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

if (pScrollBar->GetDlgCtrlID()==IDC_BARA)

m_Glisor.SetPos(m_Bara.GetScrollPos());

m_Evolutie.SetPos(m_Glisor.GetPos());

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

Observatii

Initializarea intervalului de evolutie al barei de derulare se face in metoda SetScrollRange(). La apelul acestei functii sunt transmisi in ordine parametrii limita inferioara si superioara a intervalului de evolutie. Mai poate fi transmis optional, similar controlului glisor, un al treilea parametru, care daca ia valoarea TRUE, duce la redesenarea barei la fiecare modificare a cursorului. Exista si functia inversa, GetScrollRange() careia i se pot transmite ca parametri doi pointeri la intregi, care vor specifica intervalul de evolutie a barei.

2. Daca controlul care trimite mesajul este bara de derulare, se efectueaza urmatoarele actiuni: se determina pozitia curenta a cursorului acesteia; in sectiunea case, se determina actiunea utilizatorului, implementandu-se raspunsul corespunzator al barei de derulare; se actualizeaza glisorul si indicatorul de pozitie astfel incat sa urmareasca pozitia barei de derulare.

Controale de selectie a datei si orei. Controlul de tip calendar

Controale selector data/ora (Date Time Picker). Acest tip de selector permite afisarea datei si timpului in diferite formate. Modurile de selectie a datei sau orei sunt stabilite prin intermediul paginii Styles din Properties, prin alegerea uneia din cele trei optiuni posibile:

Short Date - seteaza controlul sa afiseze data intr-o forma prescurtata, in format american (de exemplu 28 mai 2000 ca 05/28/00), apasarea butonlui sageata realizand afisarea unui calendar care permite selectarea mai exacta a datei;

Long Date - seteaza controlul sa afiseze data calendaristica intr-o forma detaliata (de ex. Sunday, May 28, 2000), apasarea butonlui sageata realizand afisarea unui calendar care permite selectarea mai exacta a datei;

Time - seteaza controlul sa afiseze atit ora (de ex. 8:49:87 AM) cit si un control de modificare incrementala in ambele sensuri, care permite ajustarea orelor, minutelor, secundelor sau sufixului AM / PM din caseta orara;

Se pot stabili de asemenea urmatoarele optiuni de stil, pe baza casetelor de validare:

Right Align - selectarea acestei optiuni are ca efect afisarea calendarului la apasarea butonului sageata in dreapta controlului. In caz contrar, calendarul va fi afisat sub control;

Use Spin Control - selectarea acestei optiuni are ca efect afisarea in locul butonului sageata a unui control incremental. Data se poate modifica in sus sau jos, in functie de sageata pe care se apasa;

Show None - selectarea acestei optiuni are ca efect afisarea in stanga selectorului a unei casete de validare, care permite utilizatorului sa precizeze ca nu este selectata nici o data si nici o ora atunci cand caseta de validare a selectorului nu este bifata;

Allow Edit - selectarea acestei optiuni permite executarea de diferite validari si modificari prin program, pe masura ce utilizatorul le editeaza in cadrul controlului, prin tratarea mesajului DTN_USERSTRING trimis de catre control.

Daca la definirea unei variabile mapate peste control, se alege categoria Value, caseta Variable Type va oferi posibilitatea alegerii unei variabile din urmatoarele doua clase, echivalente ca si metode: CTime si COleDateTime. Este in general de preferat utilizarea celei de a doua clase, pentru ca ea poate fi utilizata mai usor in interactiunea cu alte programe.

Daca se alege o variabila de categorie Control, variabila va referi un obiect din clasa CDateTimeCtrl, care incapsuleaza functionalitatile acestui tip de control. De fapt, pot fi mapate doua variabile peste acelasi control, una din clasa CDateTimeCtrl, oferind un control mai bun si una din clasa COleDateTime, care ofera un acces mai rapid. Adaugarea unei variabile mapate peste control se face cu Class Wizard.

Similar controalelor de evolutie anterioare si in cazul selectorului data/ora se poate stabili un interval de evolutie a datei/timpului. Acest interval apare sub forma unor date si ore maxime si minime permise. Fixarea acestora se face prin metoda SetRange() a clasei CDateTimeCtrl, transmitand ca parametrii doi pointeri la obiecte COleDateTime sau CTime. De exemplu, daca se doresc repere temporale exclusiv din anul 2000, se pot adauga in OnInitDialog() urmatoarele linii de initializare:

COleDateTime    dtMin(2000, 1,1,0,0,0);

COleDateTime    dtMax(2000,12,31,23,59,59);

m_personalData.SetRange (&dtMin, &dtMax);

unde m_personalData este o variabila de categorie Control pentru un control care afiseaza data.

Metoda inversa, care furnizeaza limitele intervalului care poate fi reprezentat de control este GetRange(). Acesta inscrie limitele intervalului in doua obiecte COleDateTime sau CTime. Valoarea implicita pentru intervalul selectat este uzual data si timpul curent. Acesta poate fi modificat prin intermediul metodei SetTime(). De exemplu, daca momentul initial implicit este 1 august 2000, ora 0, vom adauga linia

m_personalData.SetTime(COleDateTime(2000,8,1,0,0,0));

Modul de afisare implicit este cel american (luna/zi/an ora:min:sec AM sau PM). Acest mod de afisare poate fi modificat prin intermediul metodei SetFormat(), careia i se transmite un sir de caractere de formatare, ca mai jos:

Cod

Descriere

yyy

yy

y

MMMM

MMM

MM

M

dddd

ddd

dd

d

HH

hh

H

h

tt

t

mm

m

ss

s

Afiseaza complet anul (de ex. '2000')

Afiseaza ultimele 2 cifre ale anului (de ex. '00');

Afiseaza ultima cifra a anului (de ex.'0');

Afiseaza numele complet a lunii (de ex. 'April');

Afiseaza numele din trei litere a lunii (de ex. 'Apr');

Afiseaza numarul lunii pe doua cifre (de ex. '04');

Afiseaza numarul lunii pe una sau doua cifre (de ex. '4' sau '11');

Afiseaza numele complet a zilei din saptamana (de ex. 'Sunday');

Afiseaza numele din trei litere a zilei (de ex. 'Sun');

Afiseaza numarul zilei din luna pe doua cifre (de ex. '01');

Afiseaza numarul zilei pe una sau doua cifre (de ex. '4' sau '11');

Afiseaza ora pe 2 cifre in formatul pe 24 de ore;

Afiseaza ora pe 2 cifre in formatul pe 12 de ore;

Afiseaza ora pe 1 sau 2 cifre in formatul pe 24 de ore;

Afiseaza ora pe 1 sau cifre in formatul pe 12 de ore;

Afiseaza indicatorul AM/PM pe doua caractere;

Afiseaza doar A/P;

Afiseaza minutele pe doua cifre (de ex. '08' sau '48');

Afiseaza minutele pe una sau doua cifre (de ex. '8' sau '48');

Afiseaza secundele pe doua cifre (de ex. '08' sau '48');

Afiseaza secundele pe una sau doua cifre (de ex. '8' sau '48');

In sirul de formatare se pot adauga propriile secvente, cum ar fi diferiti delimitatori. Aceste secvente se incadreaza intre apostroafe. Putem astfel adauga in OnInitDialog() urmatoarele secvente de initializare:

m_personalData.SetFormat('dd'/'MM'/'yyy');

m_personalTimp.SetFormat('HH':'mm':'ss');

unde m_personalTimp este o variabila de categorie Control pentru afisarea orei.

Observatie: Un singur control poate afisa si data si ora, cu formatul (de ex.) SetFormat('dd'/'MM'/'yyy' 'HH':'mm':'ss').

Data si timpul curent sunt extrase din control de metoda GetTime(), careia i se transmite un obiect COleDateTime. Acesta poate fi apoi folosit si interogat in functie de necesitati. Exista mai multe metode ale clasei COleDateTime care intorc componente ale reperului temporar selectat, cum ar fi GetYear(), GetMonth(), GetDay(), GetHour(), GetMinute(), GetSecond(). Alte functii utile ar putea fi GetDayOfWeek(), care intoarce o valoare intre 1 si 7, cu 1 reprezentand ziua de duminica, sau GetDayOfYear(), care intoarce o valoare intre 1 si 366, incepand de la 1 ianuarie.

Controlul de tip calendar - Clasa care descrie calendarul este CMonthCalCtrl. Daca controlului i se asociaza o variabila de categorie Control, ea va mapa un obiect al acestei clase. Daca categoria este Value, variabila va mapa un obiect CTime sau COleDateTime, similar cazului precedent. Pentru controlul calendar sunt accesibile urmatoarele stiluri:

Day States - validarea acestei optiuni permite specificarea prin program a datei ce va fi afisata in culori inverse, care vor fi automat curente pentru sistem;

Multi Select - prin validarea acestei optiuni, utilizatorul va avea posibilitatea specificarii unui interval de timp. In caz contrar, implicit, poate fi selectata o singura data;

No Today - daca aceasta optiune este validata, funda rosie ce apare in jurul date curente nu mai este afisata;

Week Numbers - la validarea acestei optiuni, in stanga saptamanii afisate va apare si numarul ei in an;

Initializarea domeniului calendarului se face cu metoda SetRange(), iar aflarea limitelor domeniului cu GetRange(). Se poate stabili care zi a saptamanii este considerata implicit prima. Valoarea implicita pentru aceasta, este ca si in calendarul englez-american, duminica. Poate fi setata insa ca implicit prima, orice alto zi, cu metoda SetFirstDayOfWeek(), transmitandu-i un indice intre 0 si 6, 0 corespunzand zilei de luni. De exemplu, pentru ca implicit saptamana sa inceapa luni., se adauga in OnInitDialog() linia

m_personalCalendar.SetFirstDayOfWeek(0);

unde m_personalCalendar este o variabila de categorie Control, asociata controlului calendar.

Ziua curenta (incercuita cu rosu) se poate modifica prin metoda SetToday(), careia i se transmite un obiect COleDateTime, sau poate fi obtinuta intr-o variabila de tip COleDateTime cu metoda GetToday().

Culorile care compun calendarul pot fi modificate prin intermediul metodei SetColor(), transmitandu-i doi parametri: un index simbolic, ca mai jos si o valoare de culoare.

Valoare simbolica

Descriere

MCSC_TEXT

MCSC_TITLETEXT

MCSC_TITLEBK

MCSC_TRAILINGTEXT

MCSC_MONTHBK

MCSC_BACKGROUND

Culoarea pentru afisarea datelor

Culoarea pentru titlu

Culoarea pentru fundalul titlului

Culoarea pentru antet si zilele externe

Culoarea de fond pentru luna

Culoarea pentru fond

De exemplu, se poate adauga in OnInitDialog() linia:

m_personalCalendar.SetColor(MCSC_TITLEBK, 125);

Daca pentru calendar este selectat stilul Multi Select, utilizatorul poate selecta in calendar o perioada de timp, sau o data singulara. Daca data este singulara, data selectata poate fi transmisa metodei GetCurSel() a calendarului, sub forma unui obiect COleDateTime, ca in exemplul de mai jos

m_personalCalendar.SetCurSel(COleDateTime(2000, 5, 20, 16, 59,20));

Data selectata, poate fi determinata in orice moment al executiei programului, transmitand un obiect COleDateTime metodei GetCurSel(), care il va completa. Daca selectia este multipla, GetSelRange() si SetSelRange() vor fi utilizate pentru determinarea intervalului selectat si respectiv pentru determinarea unui nou interval. Ambelor metode trebuie sa li se transmita doua obiecte COleDateTime, primul reprezentand limita inferioara a intervalului, iar celalalt limita superioara. Implicit, numarul maxim de zile permis la o selectie multipla este 7. Aceasta valoare implicita poate fi modificata prin metoda SetMaxSelCount().

Exemplul 1: Sa se realizeze proiectul care contine un control de tip data/ora astfel incit la apasarae unui buton OK se va afisa o caseta de dialog cu data curenta in limba romana (daca nu este setata alta data implicita).

a.       Se insereaza doua selectoare de data/ora (Date Time Picker), IDC_DATA care afiseaza data si al doilea numit IDC_TIMP care afiseaza timpul.

b.      Se asociaza fiecarui control cite o variabila de categorie Control, m_personalData si respectiv m_personalTimp.

c.       Se implementeaza functia OnOK astfel:

void Cproj2Dlg::OnOK()

strDataCurenta += strTemp;

switch (dtDataCurenta.GetMonth())

strDataCurenta += strTemp;

strTemp.Format('%d',dtDataCurenta.GetYear());

strDataCurenta += strTemp;

AfxMessageBox(strDataCurenta);

CDialog::OnOK();

Exemplul 2. Sa se intercepteze mesajul DTN_DATETIMECHANGE pentru controlul IDC_DATA si in functia asociata sa se afiseze data in bara casetei de dialog.

a. Mesajului DTN_DATETIMECHANGE i se asociaza prin intermediul Class Wizard o functie de tratare, astfel: in Message Maps, se selecteaza IDC_DATA la Object IDs si respectiv DTN_DATETIMECHANGE la Messages. Apoi, se apasa Add Function si se accepta numele implicit pentru functie. Implementarea este urmatoarea:

void CProj2Dlg::OnDatetimechangeData(NMHDR* pNMHDR, LRESULT* pResult)

*pResult = 0;

Observatie:

1. Functia OnDatetimechangeData primeste ca prim parametru un pointer la o structura NMHDR de forma:

typedef struct tagNMHDR NMHDR;

unde hwndFrom este un handler windows al controlului care a trimis mesajul, idFrom este un identificator al controlului care a trimis mesajul si code este un cod de control sau notificare. Prin intermediul acestui pointer se determina care din controale a trimis mesajul, iar titlul casetei este schimbat in consecintaSe observa ca la modificarea datei titlul casetei va fi schimbat, dar la modificarea orei programul nu va reactiona. Aceasta se datoreaza faptului ca evenimentul si functia care il trateaza, sunt specificate printr-o linie in macroul MESSAGE_MAP. Adaugarea functiei OnDatetimechangeData() mesajului DTN_DATETIMECHANGE asociat controlului IDC_DATA cu Class Wizard are ca efect adaugarea in acest macrou a unei linii de forma:

ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATA, OnDatetimechangeData)

Pentru a rezolva problema accesului la cele doua controale in aceeasi functie se asociaza manual in macrou, controlului IDC_TIME, la producerea evenimentului DTN_DATETIMECHANGE, aceeasi functie care este asociata controlului IDC_DATA. Macroul va avea implementarea:

BEGIN_MESSAGE_MAP(Cproj2Dlg, CDialog)

//}AFX_MSG_MAP

END_MESSAGE_MAP()

Exemplul 3. Sa se adauge la proiectul anterior un control de tip calendar astfel incit numarul de zile care se selecteaza sa fie afisat in bara casetei de dialog.

a. Se adauga un control IDC_CALENDAR, cu stilul Multi Select, caruia i se asociaza o variabila m_personalCalendar de categorie Control

b. Se adauga in OnInitDialog() liniile:

BOOL CProj2Dlg::OnInitDialog()

c. Se inlocuiesc ultimele doua linii inserate in OnOK() cu urmatoarele:

COleDateTime dtMin, dtMax;

m_personalCalendar.GetSelRange(dtMin, dtMax);

COleDateTimeSpan dtSpan = dtMin-dtMax;

strDataCurenta += dtSpan.Format('n Ati selectat %d zile,');

d.      Se intercepteaza mesajul MCN_SELCHANGE caruia i se asociaza urmatoarae functie:

void CProj2Dlg::OnSelchangeCalendar(NMHDR* pNMHDR, LRESULT* pResult)

Observatii:

Prin instructiunile de la punctul b. am permis selectarea a maximum 14 zile, din anul 2000;

2. La punctul c. dimensiunea zonei selectate, este memorata in obiectul dtSpan de tip COleDateTimeSpan.








Politica de confidentialitate




Copyright © 2024 - Toate drepturile rezervate