Informatica
Obiecte grafice ("creioane" si "pensule"), tratarea evenimentelor de mouse1. 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 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:
2. Modificati aplicatia pentru obiecte hasurate in mod aleator (tema2.exe).
|