Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica


Informatica


Qdidactic » stiinta & tehnica » informatica
Obiecte grafice ("creioane" si "pensule"), tratarea evenimentelor de mouse



Obiecte grafice ("creioane" si "pensule"), tratarea evenimentelor de mouse


1. Obiecte grafice ("creioane" si "pensule")


Pentru schimbarea colorii de desenare in windows se folosesc asa numitele obiecte grafice. In continuare vom discuta despre pen si brush. Primul este folosit pentru trasarea liniilor si a contururilor, in timp ce al doilea este folosit pentru umplerea suprafetelor. Un astfel de obiect grafic trebuieste creat, selectat in contextul curent si apoi distrus (cind nu mai este nevoie de el). Spre deosebire de pointeri, sistemul de operare nu elibereaza automat obiectele grafice, ele raminind alocate si dupa terminarea excutiei programului. Mai mult, numarul total de descriptori pentru aceste obiecte grafice fiind limitat, nefolosirea lor in mod corespunzator este mai periculoasa chiar decit folosirea in mod necorespunzator a pointerilor. Asadar, mare atentie!




Tipurile de date corespunzatoare acestor doua obiecte grafice sunt HPEN si HBRUSH. Vom mai folosi un tip de obiect grafic generic, HGDIOBJ. Ultimul tip de data folosit in acest laborator este COLORREF, folosit pentru a descrie o culoare. Obiectele grafice sunt identificatori (handles) adica intregi fara semn folositi de catre sistemul de operare pentru a identifica in mod unic o resursa inregistrata (la fel ca si HDC-ul din laboratul anterior), in timp ce COLORREF este un intreg fara semn, pe 4 octeti, care retine componenta rosie, verde si albastra a unei colori (RGB), fiecare din aceste componente cu valori intre 0 si 255. Astfel, culoarea care are toate aceste componente la intensitate maxima (255) va fi alb, iar cea care le va avea la intensitate minima (0) va fi negru. Pentru initializarea acestui intreg se foloseste un macrou, RGB, care primeste 3 parametri ce reprezinta intesitatea culorilor red, green si blue de la 0 la 255:


COLORREF colWhite = RGB(255,255,255);

COLORREF colBlack = RGB(0,0,0);

COLORREF colRed = RGB(255,0,0);

COLORREF colBlue = RGB(0,0,255);


Pentru crearea unui PEN se pot folosi doua functii: CreatePen si CreatePenIndirect. Prima primeste 3 parametri (tipul - solid, punctat, etc, grosimea si coloarea) in tip ce al doua functie primeste un signur parametru, un pointer la o structura LOGPEN care va trebui initializata inainte de apelul functiei.


Pentru crearea unei BRUSH se pot folosi de asemenea doua functii: CreateSolidBrush (care primeste un singur argument, culoarea pensulei) si CreateBrushIndirect care primeste ca parametru un pointer la o structura LOGBRUSH ce va trebui initializata cu detalii despre aspectul pensulei. In prima parte a acestui laborator vom folosi doar CreateSolidBrush.



Dupa crearea unui obiect grafic, acesta trebuieste selctat in contextul de desenare curent cu ajutorul functiei SelectObject. Aceasta functie returneaza obiectul grafic anterior, acest obiect grafic trebuieste salvat si selectat la sfirsitul folosirii propriului obiect grafic. De exemplu, pentru desenarea unui dreptunghi de la 10,10 la 200,100 care va avea conturul verde de 3 pixeli si va fi umplut cu albastru sunt necesari urmatorii pasi:


// variabile in care vom salva obiecte grafice curente

HPEN hOldPen, HBRUSH hOldBrush;


//Se creeaza pen-ul si brush-ul necesare

HPEN hPen = CreatePen( PS_SOLID, 3, RGB(0,255,0) );

HBRUSH hBrush = CreateSolidBrush( RGB(0,0,255) );


// se selecteaza noile obiecte, cast-ul este necesar pentru ca SelectObject returneaza un

// handle la un obiect grafic generic, HGDIOBJ

hOldPen = (HPEN) SelectObject( dc,hPen );

hOldBrush = (HBRUSH) SelectObject( dc,hBrush );


// se deseneaza dreptunghiul, noile obiecte grafice sunt active; dc = HDC-ul curent

Rectangle( dc,10,10,200,100 );


// se selecteaza vechile obiecte grafice

SelectObject( dc,hOldPen );

SelectObject( dc,hOldBrush );


// noile obiecte grafice folosite sunt distruse

DeleteObject( hPen );

DeleteObject( hBrush );


2. Tratarea evenimentelor de mouse


Noua versiune a bibliotecei TPL suporta pentru clasa CTPLWindow, pe linga functia OnDraw prezentata in laboratorul trecut, o serie de functii virtuale utile la tratarea evenimentelor aparute de la mouse:


virtual void OnLButtonDown( const POINT& p ); // left button down

virtual void OnLButtonUp( const POINT& p ) ; // left button up

virtual void OnRButtonDown( const POINT& p ); // right button down

virtual void OnRButtonUp( const POINT& p ); // right button up

virtual void OnMouseMove( const POINT& p,BOOL lButtonDown,BOOL rButtonDown );


Primele patru metode vor fi apelate la apasarea butonul stinga/dreapta al mouse-ului
(fie cind ajunge in pozitia "jos" fie cind este eliberat dupa apasare). Ultima metoda este apelata la miscarea mouse-ului in interiorul ferestrei. POINT este o structura cu doi membri, x si y, initializata cu pozitia curenta a cursorului, relativa la fereastra curenta (0,0 este in stinga sus in fereastra noastra). Pentru OnMouseMove lButtonDown si lButtonUp specifica daca butoanele mouse-ului sunt apasate.


Pentru fortarea redesenarii ferestrei se va apela TPLRepaintMainWindow(). Aceasta functie va trimite un mesaj sistemului de operare prin se va cere redesenarea ferestrei (desenarea ferestrei se face doar la cererea sistemului de operare!).


3. Aplicatii:

  1. Realizati o aplicatie care sa deseneze, in mod aleator, 10 obiecte grafice (cercuri si dreptunghiuri). Cercurile vor avea centrul intre 0 si 300 de pixeli (pe axa OX) si 0 si 250 de pixeli pe axa OY. Dreptunghiurile vor avea coltul din stinga sus intre 0 si 100 (ox) si 0 si 50 (oy). Latimea/lungimea vor fi cuprinse intre 100 si 300 de pixeli, respectiv 50 si 200 de pixeli. Fiecare din aceste obiecte grafice vor fi umplute cu o culoare aleatoare. La apasarea butonului stinga al mouse-ului, obiectul grafic situat cel mai sus (mai aproape de utilizator) va fi selectat. Selectarea lui va fi marcata prin colorarea sa in rosu. La miscarea mouse-ului, in cazul in care exista un obiect selectat, acesta va fi miscat pe ecran la pozitia curenta a mouse-ului. La apasarea butonului stinga al mouse-ului, obiectul selectat va fi readus la culoarea initiala, pastring totusi ultima pozitie. Un exemplu de functionare este Tema1.exe.

2. Modificati aplicatia pentru obiecte hasurate in mod aleator (tema2.exe).




Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright