Documente Academic
Documente Profesional
Documente Cultură
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.
62.
63.
65.
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.
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:
67.
68.
95.
94.