Sunteți pe pagina 1din 10

55.

Mesaje de la barele de derulare. Structurarea programului pentru desenare.


ScrollWindow.
Mesajele>Windows trimite procedurii de fereastr mesajul WM_VSCROLL ( WM_HSCROLL )
cnd utilizatorul execut clic pe bara de derulare sau trage caseta de derulare cu ajutorul
mouse-ului. Se genereaz cel puin dou mesaje - unul la apsarea butonului i al doilea la
eliberarea acestuia.
Cuvntul mai puin semnificativ al parametrului wParam care nsoete mesajul corespondent
este un numr ce indica aciunea efectuat cu ajutorul mouse-ului asupra barei de derulare.
Aceste numere corespund unor identificatori care ncep cu literele SB_ (de la scroll bar"). Dei
unii dintre identificatori conin cuvintele UP" i DOWN" (sus" i jos"), identificatorii se aplic
att barelor de derulare verticale, ct i celor orizontale.Procedura de fereastr poate s
primeasc mai multe mesaje SB_LINEUP, SB_PAGEUP, SB_PAGEDOWN, SB_LINEDOWN dac
butonul mouse-ului este inut apsat n timp ce indicatorul lui este poziionat pe bara de
derulare. Mesajul SB_ENDSCROLL semnaleaz eliberarea butonului mouse-ului. n general putei
ignora mesajele SB_ENDSCROLL.
Atunci cnd cuvntul mai puin semnificativ al parametrului wParam are una dintre valorile
SB_THUMBTRACK sau SB_THUMBPOSITION, cuvntul mai semnificativ al parametrului wParam
conine poziia curent pe bara de derulare. Aceast poziie se ncadreaz n domeniul barei de
derulare. Pentru alte aciuni executate asupra barei de derulare, cuvntul mai semnificativ al
parametrului wParam poate fi ignorat. De asemenea, putei s ignorai parametrul lParam care,
de obicei, este folosit pentru barele de derulare create n casetele de dialog.
Documentaia Windows indic faptul c n cuvntul mai puin semnificativ al parametrului
wParam pot fi transmise i valorile SB_TOP sau SB_BOTTOM, corespunztoare deplasrii casetei
de derulare n poziia minim, respectiv maxim. Totui, aceste mesaje nu sunt trimise niciodat
n cazul barelor de derulare create ca parte a ferestrei unei aplicaii.
Tratarea mesajelor SB_THUMBTRACK i SB_THUMBPOSITION este destul de dificil si se
recomanda doar pentru calculatoarele puternice ce pot suporta redesenarea rapida a zonei
client.
Structurarea programului>Structurarea programului cu barele de derulare poate fi facuta
in diferite moduri , dar cel mai optimal este organizarea redesanarii doar in timpul prelucrarii
mesajului WM_PAINT(in acest scop in cadrul mesajului de la bara de derulare plasam functia
InvalidateRect(..) ce plaseaza in coada de mesaje un mesaj WM_PAINT , iar daca dorim ca
prioritatea lui sa fie ridicata mai utilizam si funtia UpdateWindow(hwnd);).Deasemea trebuie sa
avem grija ca informatiile necesare pentru bara de derulare sa fie la timp primite de catre
program si ca insasi bara de derulare sa fie corect initializata(prin
SetScrollRange(),SetScrollPos() etc).
ScrollWindow> ScrollWindow (hwnd, xInc, yInc, pRect, pClipRect) ;
Valorile xlnc i ylnc specific numrul de pixeli cu care se face derularea. Parametrii
pRect(pointer spre o structura RECT ce contine granit zonei client ce trebuie redesenata) i
pClipRect(dreptunghiul de clliping) au valoarea NULL, daca trebuie derulat ntreaga zon
client. Windows invalideaz dreptunghiul din zona client descoperit" de operaia de derulare.
Aceasta genereaz un mesaj WM_PAINT. Nu este necesar apelarea funciei InvalidateRect.
56.
Mesaje generate de mouse n afara zonei client. Mesajul de testare a poziiei. Mesajele
genereaz mesaje.
Mesaje NC> Dac mouse-ul se afl n afara zonei client, dar se afl nc n fereastr, Windows
trimite procedurii de fereastr un mesaj non-client". Zona non-client" include bara de titlu,
meniul i barele de derulare ale ferestrei. n general nu este nevoie s prelucrai mesajele
generate n afara zonei client(DefWindowProc()).Mesajele generate de mouse n afara zonei
client corespund mesajelor din zona client, dar includ caracterele
NC"(WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,WM_NCLBUTTONDBLCLK). Parametrul wParam
indic zona non-client din care a fost generat mesajul. Parametrul wParam poate conine unul
dintre identificatorii cu prefixul HT. Variabila lParam conine coordonata pe axa x n cuvntul mai
puin semnificativ i coordonata pe axa y n cuvntul mai semnificativ(raportate la zona ecran).
Mesajul de testare a pozitiei> Mesajul WM_NCHITTEST (non client hit test") este folosit
pentru verificarea poziiei din care a fost generat mesajul si precede toate celelalte mesaje

generate de mouse, din zona client sau din afara acesteia. Parametrul IParam al mesajului
conine coordonatele x i y ale indicatorului de mouse. Parametrul wParam nu este folosit. De
obicei, aplicaiile Windows transmit acest mesaj funciei DefWindowProc. Windows folosete
mesajul WM_NCHITTEST ca s genereze celelalte mesaje, n funcie de poziia mouse-ului.
Pentru mesajele din afara zonei client, valoarea returnat de funcia DefWindowProc n urma
prelucrrii mesajului WM_NCHITTEST devine parametrul wParam al mesajului generat. Aceast
valoare poate fi oricare dintre valorile wParam care nsoesc mesajele generate de mouse din
afara zonei client, plus urmtoarele:
HTCLIENT-Zona client;
HTNOWHERE-Nici o fereastr;
HTTRANSPARENT-O fereastr acoperit de o alt fereastr;
HTERROR-Determin funcia DefWindowProc s emit un semnal sonor.
Dac funcia DefWindowProc genereaz un mesaj HTCLIENT n urma prelucrrii mesajului
WM_NCHITTEST, Windows transform coordonatele ecran n coordonate ale zonei client i
genereaz un mesaj pentru zona client.Deasemnea mesajele pentru fereastra pot fi
dezactivate :
case WM_NCHITTEST
return (LRESULT) HTNOWHERE ;
Mesajele genereaza mesaje> Windows folosete mesajul WM_NCHITTEST ca s genereze
alte mesaje de mouse. Ideea mesajelor care genereaz alte mesaje este des ntlnit n
Windows. Daca executai dublu clic pe pictograma meniului sistem a unui program Windows se
genereaz o serie de mesaje WM_NCHITTEST. Deoarece indicatorul mouse-ului se afl deasupra
pictogramei meniului sistem, funcia DefWindowProc returneaz valoarea HTSYSMENU i
Windows insereaz n coada de ateptare a programului un mesaj WM_NCLBUTTONDBLCLK care
conine n parametrul wParam valoarea HTSYSMENU.De obicei, procedura de fereastr
retransmite acest mesaj funciei DefWindowProc. Atunci cnd recepioneaz mesajul cu
parametrul wParam egal cu HTSYSMENU, funcia DefWindowProc insereaz n coada de
ateptare un mesaj WM_SYSCOMMAND cu parametrul wParam egal cu SC_CLOSE. (Acest mesaj
WM_SYSCOMMAND este generat i atunci cnd utilizatorul selecteaz opiunea Close din meniul
sistem.) Din nou, procedura de fereastr transmite acest mesaj funciei DefWindowProc. Funcia
DefWindowProc l prelucreaz trimind procedurii de fereastr mesajul WM_CLOSE.
57.
MESAJE GENERATE DE MOUSE N ZONA CLIENT Mesaje non-client. Mtile
MK_LBUTTON, MK_MBUTTON, MK_RBUTTON, MK_SHIFT, MK_CONTROL.
Mesaje zona-client> Atunci cnd mouse-ul este deplasat peste zona client a unei ferestre,
procedura de fereastr primete mesajul WM_MOUSEMOVE. Dac un buton al mouse-ului este
apsat sau eliberat n zona client a unei ferestre, procedura de fereastr primete un sir de
mesaje ca: WM_LBUTTONDOWN WM_LBUTTONUP
WM_LBUTTONDBLCLK de si de asemenea un sir de
mesaje pentru celelate butoane ale soricelului(pentru butonul din mijloc si cel din dreaptadepinde de tipul mouseului(cu unul doua sau trei butoane, cit si de specificatiile ferestre ce
poate sau nu sa primeasca dublu clik)). , parametrul lParam conine poziia mouse-ului.
Mesaje NC> Dac mouse-ul se afl n afara zonei client, dar se afl nc n fereastr, Windows
trimite procedurii de fereastr un mesaj non-client". Zona non-client" include bara de titlu,
meniul i barele de derulare ale ferestrei. n general nu este nevoie s prelucrai mesajele
generate n afara zonei client(DefWindowProc()).Mesajele generate de mouse n afara zonei
client corespund mesajelor din zona client, dar includ caracterele
NC"(WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,WM_NCLBUTTONDBLCLK). Parametrul wParam
indic zona non-client din care a fost generat mesajul. Parametrul wParam poate conine unul
dintre identificatorii cu prefixul HT. Variabila lParam conine coordonata pe axa x n cuvntul mai
puin semnificativ i coordonata pe axa y n cuvntul mai semnificativ(raportate la zona ecran).
Mastiel> Valoarea parametrului wParam indic starea buloanelor mouse-ului i starea tastelor
Shift i Ctrl. Putei s testai parametrul wParam folosind o serie de mti definite n fiierele
antet din Windows.
MK_LBUTTON Butonul din stnga al mouse-ului este apsat
MK_MBUTTON Butonul din mijloc al mouse-ului este apsat
MK_RBUTTON Butonul din dreapta al mouse-ului este apsat

MK_SHIFT
Tasta Shift este apsat
MK_CONTROL Tasta Ctrl este apsat
58.
Mesajele de la o fereastr child la una printe.
Mesajele de la o fereastra copil la una parinte pot fi observate foarte bine pe baza unei ferestre
de tip button ce este copilul unei ferestre parinte.Atunci cnd executai clic pe un buton,
controlul de tip fereastr descendent trimite mesajul WM_COMMAND ctre fereastra printe.
Programul intercepteaz mesajul WM_COMMAND cu valorile lParam i wParam. Iat ce
semnificaie au acestea:
LOWORD (wParam) Identificatorul ferestrei descendent
HIWORD (wParam)
Codul de ntiinare
lParam
Variabila handle a ferestrei descendent
Dac facei conversia unor programe scrise pentru versiunile pe 16 bii ale sistemului de
operare Windows, reinei c aceti parametri au fost modificai n vederea adaptrii la
dimensiunea pointerilor pe 32 de bii.
Codul de ntiinare este un cod de submesaj pe care fereastra descendent l folosete pentru a
transmite ferestrei printe mai multe informaii despre semnificaia mesajului. Valorile pe care
le pot avea aceste coduri sunt definite n fiierele antet definite n
Windows:BN_CLICKED;BN_PAINT;BN_HILITE;BN_UNHILITE;BN_DISABLE;BN_DOUBLECLICKED;
59.
Mesajele de la timer.
Programul nostru avind un timer setat v-a primi la fiecare interval de timp specificat un singur
mesaj , si anume WM_TIMER, insa este important de tinut cont ca ceasul foloseste tactul de
sitem sau mai bine spus intreruperile de sistem ce au unele restrictii, ntreruperi sunt generate
la fiecare 54,925 milisecunde, adic de 18,2 ori pe secund. Intervalul de timp pe care l
specificai la apelarea funciei SetTimer este rotunjit la un multiplu ntreg de tacturi de ceas. De
exemplu, prin mprirea intervalului de 1000 de milisecunde la 54,925 rezult 18,207, valoare
care este rotunjit la 18 tacturi de ceas, ceea ce nseamn, de fapt, un interval de 989
milisecunde.Insa intreruperile de ceas caatare nu pot fi condsiderate ca fiind asincrone, insa
mesajele WM_TIMER au o prioritate joasa, fiind in principiu foarte asemanatoare cu mesajele
WM_PAINT.
60.
Mesajele privind tastatura: acionri de taste i caractere". Taste obinuite i taste de
sistem. WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP. Variabila lParam.
Actionari de taste si caractere> Mesajele privind tastatura pe care un program le
recepioneaz de la sistemul de operare fac diferena ntre acionrile de taste" (keystrokes")
i caractere". Aceste noiuni sunt legate de cele dou moduri n care putei s privii tastatura.
n primul rnd, tastatura este o colecie de taste. Tastatura are o singur tast A; apsarea
tastei A este o acionare de tast, iar eliberarea tastei A este tot o acionare de tast. Tastatura
este, ns, n acelai timp, i un dispozitiv de intrare care genereaz caractere afiabile. Tasta A
poate s genereze mai multe caractere, n funcie de starea tastelor Ctrl, Shift i Caps Lock. n
mod normal, caracterul generat este a. Dac tasta Shift este apsat, sau tasta Caps Lock este
activ, caracterul generat este A. Dac tasta Ctrl este apsat, caracterul generat este Ctrl+A.
Dac se folosete un driver de tastatur pentru o limb strin, apsarea tastei A poate s fie
precedat de un caracter mort" (dead-character key") sau de tastele Shift, Ctrl sau Alt n
diferite combinaii. Combinaiile pot s genereze un caracter a sau A cu un accent.
Pentru acionrile de taste care genereaz caractere afiabile, Windows trimite programului att
mesaje pentru acionarea de taste, ct i mesaje pentru caractere. Unele taste nu genereaz
caractere. Astfel de taste sunt Shift, tastele funcionale, tastele de deplasare i tastele speciale,
precum Insert i Delete. n cazul acestor taste, Windows genereaz numai mesaje pentru
acionari de taste.
Taste obisnuite si taste de sistem> Mesajele WM_SYSKEYDOWN i WM_SYSKEYUP sunt
generate, de obicei, pentru taste apsate n combinaie cu tasta Alt. Aceste acionari de taste
apeleaz opiuni din meniul programului ori din meniul sistem, sunt folosite pentru funcii ale
sistemului, cum ar fi comutarea ferestrei active (Alt+Tab sau Alt+Esc) sau sunt folosite pentru
acceleratori de meniu (Alt n combinaie cu o tast funcional). De obicei, programul ignor
mesajele WM_SYSKEYDOWN i WM_SYSKEYUP i le retransmite funciei DefWindowProc.

Deoarece Windows manipuleaz combinaiile Alt+tast, nu este nevoie s interceptai aceste


mesaje. WM_KEYDOWN i WM_KEYUP sunt caracteristice deja pentru tastele obisnuite.
Variabila lParam> Pentru toate mesajele legate de acionrile de taste variabila lParam (pe
32 de bii) transmis procedurii de fereastr este mprit n ase cmpuri: contorul de
repetare(specific numrul de acionari de taste reprezentat de un mesaj. n majoritatea
cazurilor, contorul de repetare are valoarea 1), codul de scanare OEM(codul de scanare al
tastaturii, generat de componentele hardware deobicei ignorat, indicatorul flag pentru taste
extinse are valoarea 1 dac mesajul este generat de una dintre tastele suplimentare de pe
tastatura IBM extins.), codul de context(are valoarea 1 dac este apsat tasta Alt), starea
anterioar a tastei(are valoarea 0 dac tasta nu a fost anterior apsat, i valoarea 1 dac tasta
a fost apsat) i starea de tranziie(are valoarea 0 dac tasta este apsat i valoarea 1 dac
tasta este eliberat).
61.

Mesajele WM_CREATE, WM_PAINT i WM_DESTROY.


WM_CREATE> Atunci cnd din main se apeleaz funcia CreateWindow, Windows face ce are
de fcut i apeleaz funcia WndProc, transmindu-i variabila handle a ferestrei i mesajul
WM_CREATE. WndProc prelucreaz mesajul WM_CREATE i returneaz controlul sistemului de
operare.De cele mai dese ori WM_CREATE ce este practic primul mesaj primit de procedura de
fereastra este folosit pentru a initializa unele valori sau variabile necesare in viitorul imediat al
timpului de executie.
WM_PAINT> Acest mesaj este foarte important n programarea sub Windows, deoarece
informeaz fereastra privind faptul c o parte sau ntreaga zon client a acesteia este invalid"
i trebuie s fie redesenat. Aproape ntotdeauna, prelucrarea mesajului WM_PAINT ncepe prin
apelarea funciei BeginPaint i se termin cu apelarea funciei EndPaint cu parametrii (hwnd,
&ps),ps- PAINTSTRUCT conine unele informaii pe care programul le poate folosi pentru
redesenarea zonei client.
WM_DESTROY> Un alt mesaj important este WM_DESTROY. Acest mesaj indic faptul c
sistemul de operare desfoar un proces de distrugere a ferestrei pe baza unei comenzi de la
utilizator. Mesajul este trimis atunci cnd utilizatorul execut clic pe butonul Close, selecteaz
opiunea Close din meniul sistem sau apas fastele Alt+F4.
Programul HELLOWIN rspunde la acest mesaj printr-o metod standard, apelnd funcia
PostQuitMessage (0) ;
Aceast funcie insereaz n coada de ateptare a programului un mesaj WM_QUIT. Am spus
anterior c funcia GetMessage returneaz o valoare diferit de zero n cazul prelurii oricrui
mesaj n afar de WM_QUIT. Atunci cnd preia din coada de ateptare un mesaj WM_QUIT,
funcia GetMessage returneaz valoarea 0, ceea ce determin ieirea din ciclul de tratare a
mesajelor din funcia WinMain i nchiderea programului.

62.

Mesajul WM_PAINT. Dreptunghiuri valide i invalide.


WM_PAINT> Acest mesaj este foarte important n programarea sub Windows, deoarece
informeaz fereastra privind faptul c o parte sau ntreaga zon client a acesteia este invalid"
i trebuie s fie redesenat. Aproape ntotdeauna, prelucrarea mesajului WM_PAINT ncepe prin
apelarea funciei BeginPaint i se termin cu apelarea funciei EndPaint cu parametrii (hwnd,
&ps),ps- PAINTSTRUCT conine unele informaii pe care programul le poate folosi pentru
redesenarea zonei client(inclusiv o structura de tip RECT ce inlcude dreptunghoil invalid).Cel
mai important la mesajul WM_PAINT este faptul ca el permite desenarea doar in zona invalida
ce nu este altceva decit o regiune a zonei client ce a fost acoperita de un meniu popup sau a
fost suprapusa de o alta fereastra .. mutata in afara zonei ecran etc si spre final valideaza zona
in cauza.Desenarea fortata se poate efectua apelind funtia InvalidateRect(hwnd,lpRect,bErase);
ce invalideaza o zona si respectiv asugura desenarea in cadrul zonei date(daca pentru lpRect
includem valoarea NULL intreaga zona client va fi redesenata).

63.

Modificarea textului unui buton.


Putei s modificai textul unui buton (sau al unei alte ferestre) prin apelarea funciei
SetWindowText:

SetWindowText (hwnd, pszString) ;


unde hwnd este variabila handle a ferestrei al crei text urmeaz s fie nlocuit, iar pszString
este un pointer la un ir de caractere terminat cu caracterul nul. Pentru o fereastr normal,
acesta este textul care va fi afiat n bara de titlu. Pentru un buton, acesta este textul afiat pe
buton.
De asemenea, putei s obinei textul ferestrei curente:
iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;
Parametrul iMaxLength specific numrul maxim de caractere care va fi copiat n bufferul
adresat de pointerul pszBuffer. Funcia returneaz lungimea irului de caractere copiat. Putei s
pregtii programul pentru un text de o anumit lungime apelnd mai nti funcia
GetWindowTextLength:
iLength = GetWindowTextLength (hwnd) ;
64.

Moduri de desenare. Operaii rastru (ROP - raster operation). Funciile SetROP2,


iDrawMode, GetROP2.
Imaginai-v o cale prin care s putei folosi aceeai peni ca s desenai o linie alb pe fond
negru, dar i o linie neagr pe fond alb, tiind ce culoare are fondul. Dac v este util aceast
facilitate, putei s o obinei prin schimbarea modului de desenare. Atunci cnd folosete o
peni pentru desenarea unei linii, Windows face de fapt o operaie boolean ntre pixelii peniei
i pixelii de pe suprafaa destinaie. Efectuarea operaiei booleene ntre pixeli se numete
operaie rastru"(ROP). Deoarece desenarea unei linii implic numai dou modele de pixeli
(penia i destinaia), operaia boolean se numete operaie rastru binar" sau ROP2.
Windows definete 16 coduri ROP2 care specific modul de combinare ntre pixelii peniei i
pixelii suprafeei, n contextul de dispozitiv prestabilit, modul de desenare definit este
R2_COPYPEN, ceea ce nseamn c Windows copiaz pixelii peniei pe suprafaa destinaie adic modul normal n care suntem obinuii s funcioneze o peni. Exist alte 15 coduri
ROP2.
Putei s selectai un nou mod de desenare n contextul de dispozitiv astfel:
SetROP2 (hdc, iDrawMode) ;
unde parametrul iDrawMode este una dintre valorile din coloana Mod de desenare" a tabelului
ce contine toate modurile de desenare.Putei s obinei modul curent de desenare astfel:
iDrawMode = GetROP2 (hdc) ;
Exemple de moduri de desenare : Modul R2_NOTCOPYPEN deseneaz cu alb dac penia este
neagr i cu negru dac penia este alb. Modul R2_BLACK deseneaz ntotdeauna cu negru,
indiferent de culoarea peniei i a destinaiei. n mod similar, modul R2_WHITE deseneaz
ntotdeauna cu alb. Modul R2_NOP este o operaie nul" - destinaia rmne nemodificat.

65.

Modurile de mapare metrice". Moduri de mapare proprii. Modul de mapare


MM_ISOTROPIC. Modul de mapare MM_ANISOTROPIC sau ajustarea imaginii.
Moduri de mapare metrice> Windows include dou moduri de mapare n care coordonatele
logice sunt exprimate n uniti fizice. Deoarece coordonatele logice pe axele x i y sunt mapate
la uniti fizice identice, aceste moduri de mapare v ajut s desenai cercuri mai rotunde" i
ptrate mai ptrate".

Extensiile ferestrei i ale vizorului depind de modul de mapare i de raportul de afiare a


dispozitivului. Aa cum am menionat anterior, extensiile nu sunt impor tante ca atare, avnd o
semnificaie numai exprimate ca rapoarte.Importanta este trecerea la noile senduri de crestere
a axelor de coordonate , la axa y ea fiind inversa celei obisnuite la MM_TEXT, pentru facilitate
putem muta originea sistemului in centrul ferestrei : SetViewportOrgEx (hdc, cxClient/2,
cyClient/2, NULL) ; daca ar fi sa mutam originea ferestrei am fi nevoiti sa transformam puctele
fizice in cele logice pentru a fi transmise functiei SetWindowOrgEx (hdc, -pt.x/2, -pt.y/2, NULL) ;

Moduri de mapare proprii> Acestea sunt singurele moduri de mapare care v permit s
modificai extensiile ferestrei i ale vizorului, ceea ce nseamn c v permit s modificai
factorul de scalare pe care Windows l folosete pentru convertirea coordonatelor logice i a
coordonatelor de dispozitiv.
MM_ISOTROPIC> Modul de mapare MM_ISOTROPIC este ideal pentru folosirea unor axe
arbitrare, cu uniti logice egale pe cele dou axe. Dreptunghiurile cu limi i nlimi logice
egale sunt afiate ca ptrate. Elipsele cu limi i nlimi logice egale sunt afiate ca
cercuri.Putei s folosii un sistem de coordonate cartezian cu patru cadrane avnd axe arbitrar
scalate n cele patru direcii i cu punctul de coordonate (0, 0) n centrul zonei client. Dac, de
exemplu, vrei ca fiecare ax s ia valori de la 0 la 1000, folosii codul urmtor:
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL);
SetViewportExtEx (hdc, cxClient/2, -cyClient/2, NULL) ;
SetViewportOrgEx (hdc, cxClient/2, cyCllent/2, NULL) ;
Important este faptul ca imaginea va ramine neschimbata chiar daca fereastra e mai mult lata
decit inaltasi invers.
MM_ANISOTROPIC> Atunci cnd stabilii extensiile ferestrei i pe ale vizorului n modul de
mapare MM_ISOTROPIC, Windows ajusteaz valorile astfel nct unitile logice de pe cele dou
axe s aib aceleai dimensiuni. n modul de mapare MM_ANISOTROPIC, Windows nu face nici o
ajustare a valorilor pe care le stabilii. Aceasta nseamn c n modul de mapare
MM_ANISOTROPIC nu este obligatorie pstrarea raportului corect de afiare.
Pentru a folosi modul de mapare MM_ANISOTROPIC, stabilii un sistem arbitrar de coordonate
pentru zona client, ca i pentru modul de mapare MM_ISOTROPIC. Codul de mai jos stabilete
punctul de coordonate (0, 0) n colul din stnga-jos al zonei client, iar axele de coordonate x i
y pot lua valori de la 0 la 32.767:
SetMapMode (hdc, MM_ANISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
66.

Modurile de mapare. Coordonate de dispozitiv i coordonate logice. Sistemele de


coordonate ale dispozitivului. Vizorul i fereastra. Folosirea modului de mapare MM_TEXT.
Modul de mapare> este un atribut al contextului de dispozitiv ce afecteaza aproape orice
operatie de desnenare.De exemplu in funcia TextOut i, de fapt, n toate funciile GDI,
coordonatele sunt furnizate n uniti logice". Windows trebuie s transforme unitile logice"
n uniti de dispozitiv", adic n pixeli. Aceast transformare este guvernat de modul de
mapare, de originile ferestrei, ale vizorului i de extensiile ferestrei i ale vizorului. De
asemenea, modul de mapare stabilete i orientarea axelor x i y, adic determin sensul n
care cresc valorile coordonatelor x i y. Putei s selectai modul de mapare folosind funcia
SetMapMode:
SetMapMode (hdc, iMapHode) ;
unde iMapMode este unul dintre cei opt identificatori definii pentru modurile de mapare. Putei
s obinei modul de mapare curent folosind funcia GefMapMode:
iMapMode = GetMapMode (hdc) ;
Coordonatele de dispozitiv si cele logice> sunt un element important ce trebuie
inteles.Cele fizice sunt coordonatele dipozitivului fizic(adica pixelii) pe cind cele logice sunt
dependete de modul de mapare.Insa cind se folosesc fiecare tip de coordonate. Windows va
folosi n continuare coordonatele de dispozitiv pentru toate mesajele (cum ar fi WM_SIZE,
WM_MOVE i WM_MOUSEMOVE), pentru toate funciile care nu fac parte din interfaa GDI i
chiar pentru unele funcii GDI. GetSystemMetrics nu este o funcie GDI, aa c va returna n
continuare dimensiunile n uniti de dispozitiv, adic n pixeli. . Dac modul de mapare este
MM_LOENGLISH n momentul apelrii funciei, GetTextMetrics returneaz limea i nlimea
caracterelor, n sutimi de inci.
Sistemele de coordonate ale dispozitivului> Dei n general am lucrat doar n zona client a
ferestrei, n anumite situaii Windows folosete alte dou sisteme de coordonate de dispozitiv. n

toate sistemele de coordonate de dispozitiv sunt folosii pixelii ca unitate de msur. Valorile de
pe axa orizontal (x) cresc de la stnga la dreapta iar valorile de pe axa vertical (y) cresc de
sus n jos. Atunci cnd folosim ntregul ecran, spunem c lucrm n coordonate ecran". Colul
din stnga-sus este punctul de coordonate (0, 0). Dac folosii funcia CreateDC cu parametrul
DISPLAY ca s obinei un context de dispozitiv pentru ntregul ecran, atunci coordonatele logice
specificate la apelarea funciilor GDI vor fi mapate la coordonatele ecranului. Coordonatele de
fereastr" se refer la ntreaga fereastr a ecranului, inclusiv bara de titlu, meniu, barele de
derulare i chenarul ferestrei. Pentru o fereastr normal, punctul (0, 0) este colul din stngasus al chenarului de redimensionare. Al treilea sistem de coordonate de dispozitiv - cu care vom
lucra cel mai des -folosete coordonatele zonei client". Punctul (0,0) este colul din stnga-sus
al zonei client. Putei s transformai coordonatele zonei client n coordonatele ecranului i
invers folosind funciile ClientToScreen i ScreenToClient.
Vizorul i fereastra> Pentru vizor se folosesc coordonatele de dispozitiv (pixeli). De cele mai
multe ori, vizorul coincide cu zona client a ferestrei, dar poate s nsemne i coordonatele
ntregii ferestre sau coordonatele ntregului ecran, dac ai obinut contextul de dispozitiv prin
apelarea funciilor GetWindowDC sau CreateDC. Punctul de coordonate (0, 0) este colul din
stnga-sus al zonei client (sau al ferestrei, ori al ecranului). Valorile coordonatei x cresc ctre
dreapta, iar valorile coordonatei y cresc n jos.Pentru fereastr se utilizeaz coordonatele logice,
care pot fi,exprimate n pixeli, milimetri, inci sau orice alt unitate de msur dorii.
Coordonatele logice ale ferestrei sunt specificate la apelarea funciilor GDI.Pentru toate
modurile de mapare, Windows transform coordonatele ferestrei (coordonate logice) n
coordonate ale vizorului (coordonate de dispozitiv) folosind dou formule:

Windows poate s transforme i coordonatele vizorului (coordonate de dispozitiv) n coordonate


ale ferestrei (coordonate logice):

DPtoLP (hdc, pPoints, iNumber) ;//Converteste punctele de dispozitiv in logice


LPtoDP (hdc, pPoints, iNumber) ;//Converteste punctele logice in cele de dipozitiv
Folosirea modului de mapare MM_TEXT> Pentru modul de mapare MM_TEXT, originile i
extensiile prestabilite sunt urmtoarele:
Originea ferestrei:
(0, 0) Poate fi modificat
Originea vizorului:
(0, 0) Poate fi modificat
Extensia ferestrei:
(1, 1) Nu poate fi modificat
Extensia vizorului:
(1, 1) Nu poate fi modificat
Raportul din extensia ferestrei i extensia vizorului este 1, aa c nu este necesar nici o
operaie de scalare pentru transformarea coordonatelor logice n coordonate de dispozitiv. n
general, citim textul de la stnga spre dreapta i de sus n jos, iar n modul de mapare
MM_TEXT, valorile cresc n acelai sens Windows furnizeaz funciile SetViewportOrgEx i
SetWindowOrgEx pentru modificarea originii vizorului i a ferestrei. De exemplu, s presupunem
c zona client are limea cxClient i nlimea cyClient. Dac vrei ca punctul logic de
coordonate (0, 0) s se afle n centrul zonei client, putei s apelai funcia urmtoare:
SetViewportOrgEx (hdc, cxClient/2, cyClient/2, NULL) ;
Totui, modul de mapare MM_TEXT prezint o mic problem: de obicei, ntr-un sistem de
coordonate cartezian, valorile de pe axa y cresc n sus, pe cnd n modul de mapare MM_TEXT
acestea cresc n jos. In acest sens, modul de mapare MM_TEXT este un caz izolat, aceast
problem fiind corectat de celelalte cinci moduri de mapare.

67.

Obinerea informaiilor despre culori. PLANES, BITSPIXEL, NUMCOLORS: Tipul


COLORREF.
Funcia GetDeviceCaps v permite s determinai modul de organizare a memoriei n
adaptoarele video i numrul de culori care pot fi reprezentate. Apelul de mai jos returneaz
numrul de planuri de culoare:
iPlanes = GetDeviceCaps (hdc, PLANES);
Apelul urmtor returneaz numrul de bii de culoare folosii pentru fiecare pixel:
iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL)
Majoritatea adaptoarelor video care pot afia culori folosesc fie mai multe planuri de culoare, fie
mai muli bii de culoare pentru fiecare pixel, dar nu pe amndou; cu alte cuvinte, unul dintre
cele dou apeluri de mai sus va returna valoarea 1. Numrul de culori care pot fi redate de o
plac video se poate calcula cu formula urmtoare:
iColors = 1<<(iPlanes * iBitsPixel);
Aceast valoare poate s nu fie identic cu numrul de culori obinut prin apelarea funciei
GetDeviceCaps cu parametrul NUMCOLORS:
iColors = GetDeviceCaps (hdc, NUMCOLORS);
Windows folosete pentru reprezentarea culorilor o valoare ntreag fr semn, pe 32 de bii.
Tipul de date folosit pentru culori se numete COLORREF. Ultimii trei octei ai numrului (cei mai
puin semnificativi) specific valorile pentru culorile rou, verde i albastru, de la O la 255.
Rezult o palet potenial de 224 culori (aproximativ 16 milioane de culori).

68.

Obinerea variabilei handle a contextului de dispozitiv. Obinerea informaiilor despre


contextul de dispozitiv.
Obtinerea variablilei Handle a CD>
hdc - BeginPaint (hwnd, &ps);
[alte Unii de program] EndPaint (hwnd, &ps);//Permite desenarea doar in zona invalida si
validarea acesteia
hdc = GetDC (hwnd);
(alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga zona client
hdc = GetWindowDC (hwnd);
[alte linii de program] ReleaseDC (hwnd, hdc);//Permite desenarea in intreaga fereastra ce
poate creaa efecte nedorite
Funciile BeginPaint, GetDC i GetWindowDC obin variabila handle a contextului de dispozitiv
asociat unei anumite ferestre de pe ecran. O funcie mai general pentru obinerea variabilei
handle a unui context de dispozitiv este CreateDC:
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
[alte linii de program] DeleteDC (hdc);
De exemplu, putei s obinei variabila handle a contextului de dispozitiv pentru tot spaiul de
afiare, cu urmtorul apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
Uneori avei nevoie de unele informaii despre un context de dispozitiv fr s desenai nimic.
n aceast situaie putei s obinei o variabila handle a contextului de informaii (information
context") folosind funcia CreateIC. Parametrii sunt aceiai ca i pentru funcia CreateDC:
hdclnfo = CreatelC ("DISPLAY", NULL, NULL, NULL);
[alte linii de program] DeleteDC (hdclnfo);
Atunci cnd lucrai cu imagini bitmap, poate fi uneori util obinerea unui context de dispozitiv
n memorie":
hdcMem = CreateCompatibleDC (hdc);
[alte linii de program] DeleteDC (hdcHem)
Putei s creai un metafiier prin obinerea unui context de dispozitiv pentru metafiiere:
hdcMeta = CreateMetaFile (pszFilename);
[alte linii de program] hmf = CloseMetaFile (hdcMeta);

Dac avei nevoie de anumite informaii despre acest dispozitiv>, cum ar fi


dimensiunile ecranului (dimensiunile n pixeli i cele fizice) sau posibilitile de folosire a
culorilor, putei s le obinei prin apelarea funciei GetDeviceCaps (get device capabilities"):
iValue = GetDeviceCaps (hdc, iIndex) ;
Parametrul iIndex este unul dintre cei 28 de identificatori definii n fiierele antet din Windows.
De exemplu, dac iIndex are valoarea HORZRES funcia GetDeviceCaps returneaz limea
dispozitivului n pixeli; VERTRES returneaz nlimea dispozitivului n pixeli.
Intrebarile din C#
94.

CONCEPTE DE BAZ ALE PROGRAMRII VIZUALE.


Simplitatea: Interfaa trebuie s fie ct mai uor de neles i de nvat de ctre utilizator i s permit
acestuia s efectueze operaiile dorite n timp ct mai scurt. n acest sens, este vital culegerea de
informaii despre utilizatorii finali ai aplicaiei i a modului n care acetia sunt obinuii s lucreze.
Poziia controalelor: Locaia controalelor dintr-o fereastr trebuie s reflecte importana relativ i
frecvena de utilizare. Astfel, cnd un utilizator trebuie s introduc nite informaii unele obligatorii i
altele opionale este indicat s organizm controalele astfel nct primele s fie cele care preiau
informaii obligatorii.
Consistena: Ferestrele i controalele trebuie s fie afiate dup un design asemntor (template) pe
parcursul utilizrii aplicaiei. nainte de a implementa interfaa, trebuie decidem cum va arta aceasta, s
definim template-ul.
Estetica: Interfaa trebuie s fie pe ct posibil plcut i atrgtoare.

95.

MEDIUL DE DEZVOLTARE VISUAL C# (INTERFEA).


Mediul de dezvoltare Microsoft Visual C# dispune de instrumente specializate de proiectare, ceea ce
permite crearea aplicaiilor n mod interactiv, rapid i uor. Pentru a construi o aplicaie Windows
(FileNew Project) se selecteaz ca template Windows Forms Application.
O aplicaie Windows conine cel puin o fereastr (Form) n care se poate crea o interfa cu utilizatorul
aplicaiei.
Componentele vizuale ale aplicaiei pot fi prelucrate n modul Designer (Shift+F7) pentru a plasa noi
obiecte, a le stabili proprietile etc. Codul din spatele unei componente vizuale este accesibil n modul
Code (F7).
n fereastra Solution Explorer sunt afiate toate fiierele pe care C# 2008 Express Edition le-a inclus
n proiect. Form1.cs este formularul creat implicit ca parte a proiectului. Fiierul Form1.cs conine un
formular (fereastra Form1 derivata din clasa Form) care este reprezentat n formatul Design
(Form1.cs[Design]), adic ntr-un format in care se poate executa proiectare vizual, prin inserarea
controalelor necesare selectate din fereastra Toolbox, care se activeaz atunci cnd este atins cu
mouse-ul. Fiierul Form1.cs poate fi vzut ca fiier text surs prin selectarea lui n fereastra Solution
Explorer, clic dreapta cu mouse-ul i selecia opiunii View Code.
Fereastra Properties (Ctrl+W,P) este utilizat pentru a schimba proprietile obiectelor.
Toolbox (Ctrl+W,X) conine controale standard drag-and-drop i componente utilizate n crearea
aplicaiei Windows. Controalele sunt grupate n categoriile logice din imaginea alturat. Ferestrele care
sunt afiate in fereastra principal se pot stabili prin selecie din meniul View.
La crearea unei noi aplicaii vizuale, Microsoft Visual C# 2008 Express Edition genereaz un spaiu de
nume care conine clasa static Program, cu metoda static ce constituie punctul de intrare (de lansare)
a aplicaiei:
static void Main()
{ ...
Application.Run(new Form1());
}
Clasa Application este responsabil cu administrarea unei aplicaii Windows, punnd la dispoziie
proprieti pentru a obine informaii despre aplicaie, metode de lucru cu aplicaia i altele. Toate
metodele i proprietile clasei Application sunt statice. Metoda Run creeaz un formular implicit,
aplicaia rspunznd la mesajele utilizatorului pn cnd formularul va fi nchis. Compilarea modulelor
aplicaiei i asamblarea lor ntr-un singur fiier executabil se realizeaz cu ajutorul opiunilor din meniul
Build, uzual fiind Build Solution (F6).
Odat implementat, aplicaia poate fi lansat, cu asisten de depanare sau nu (opiunile Start din
meniul Debug). Alte faciliti de depanare pot fi folosite prin umrirea pas cu pas, urmrirea pn la
puncte de ntrerupere etc. (celelalte opiuni ale meniului Debug).
Ferestre auxiliare de urmrire sunt vizualizate automat n timpul procesului de depanare, sau pot fi
activate din submeniul Windows al meniului Debug.
Proiectarea vizual a formularului se poate face insernd controale selectate din fereastra de instrumente
(Toolbox) i setnd proprietile acestora.

94.

ELEMENTELE POO N CONTEXT VIZUAL.


Elementele programarii orientate pe obiecte sunt pe larg utilizate si in contextul vizual chiar daca nu sunt
deodata sesizabile.Exemplul perfect este insasi managementul unui proiect WindowsForm in C#.Dupa
cum ne amintim pe ecranul aplicatiei putem gasi mai multe elemente daca e sa le analizam atunci
putem vedea elementele POO.Insasi fereastra SolutionExplorer ce la prima vedere contine doar codul
nostru , in realitate reprezinta un organizator de fisiere ce contin clasele , formele etc (formele apropo
sunt iarasi obiecte , deci iarasi vine vorba despre POO).Cel mai reprezentative elemente sunt Toolboxul si
Proprietatile.Din Toolbox putem selecta diferite obiecte ce le putem aranja dupa dorinta in fereastra
noastra(asa numita forma) , iar la general vobind n Toolbox exist toate tipurile de controale care i sunt
necesare unui programator pentru a realiza o aplicaie. Cele mai multe controale sunt obiecte de clase
derivate din clasa System.Windows.Forms.Control. Datorit acestui fapt multe dintre proprietile i
evenimentele diverselor controale vor fi identice. Fereastra Properties, din interfaa mediului de
programare, vom observa c va conine att proprietile ct i evenimentele ataate controalelor.
Proprietile controalelor, sunt motenite sau supranscrise din clasa de baz Control.
In acest mod vedem ca Programarea vizuala este nu altceva decit aceeasi programare orientata
peobiecte doar ca simplificata si cu mult mai accesibila.

S-ar putea să vă placă și