Sunteți pe pagina 1din 39

LUCRARE DE LABORATOR NR.

TEMA: Aplicaii Windows Scopul lucrrii: Studierea bazelor i principiilor de creare a aplicaiilor Windows Noiuni teoretice Windows este o interfa grafic cu utilizatorul (GUI - graphical user interface ! nu"it uneori i #interfa $izual% sau #"ediu grafic cu ferestre% (#graphical windowing en$iron"ent% & 'oate tipurile de interfee grafice cu utilizatorul folosesc ele"ente grafice afiate (ntr-o i"agine de tip bit"ap& )le"entele grafice asigur o utilizare "ai eficient a spaiului de afiare! un "ediu bogat din punct de $edere $izual pentru transferul de infor"aii i posibilitatea de afiare a rezultatelor aa cu" $or arta (n realitate pe h*rtie (W+SIW+G - what ,ou see is what ,ou get & 'oate progra"ele pentru Windows au un aspect ase"ntor i se co"port funda"ental la fel& -rogra"ele ocup o fereastr - o suprafa dreptunghiular de pe ecran& .ereastra poate fi identificat datorit unei bare de titlu& /a0oritatea funciilor oferite de progra" sunt apelate cu a0utorul unui "eniu& Infor"aiile afiate care nu (ncap pe un singur ecran pot fi $izualizate cu a0utorul barelor de derulare& Unele articole de "eniu apeleaz casete de dialog (n care utilizatorul introduce infor"aii supli"entare& 1n "a0oritatea progra"elor "ai "ari pentru Windows e2ist o caset de dialog care deschide un fiier& Aceast caset de dialog arat la fel (sau foarte ase"ntor (n "ai "ulte progra"e Windows i este apelat aproape (ntotdeauna cu aceeai opiune de "eniu& Apelurile de funcii Windows asigur suportul pentru "ai "ult de o "ie de apeluri de funcii pe care le pot folosi aplicaiile& .iecare funcie Windows are un nu"e sugesti$! scris at*t cu "a0uscule! c*t i cu "inuscule! cu" ar fi CreateWindow. Aceast funcie! aa cu" probabil $-ai dat sea"a! creeaz o fereastr&

'oate funciile Windows i"portante sunt declarate (n fiiere antet& -rincipalul fiier antet se nu"ete WI345WS&6 i include "ulte alte fiiere antet& Aceste fiiere antet sunt furnizate de orice "ediu de progra"are pentru Windows! aa cu" este! de e2e"plu! 7& .iierele antet sunt o parte i"portant a docu"entaiei Windows& 1n progra"ele pentru Windows folosii apelurile de funcii la fel cu" folosii funciile de bibiotec 7! cu" ar fi strlen& -rincipala diferen este faptul c (n cazul funciilor 7 codul funciilor este legat direct de codul progra"ului! pe c*nd codul funciilor Windows este stocat (n fiiere din afara progra"ului! nu"ite biblioteci cu legturi dina"ice (488 - d,na"ic lin9 libraries &/ai 0os sunt prezentate care$a funcii Windows pentru a si"plifica crearea unei aplicaii Windows: LoadIcon - (ncarc o pictogra" care ur"eaz s fie folosit de un progra"& LoadCursor - (ncarc un indicator pentru "ouse! care ur"eaz s fie folosit de un progra"& GetStockObject - obine un obiect grafic ((n acest caz o pensul folosit pentru desenarea fondului ferestrei & RegisterClassEx - (nregistreaz o clas de fereastr pentru fereastra progra"ului& CreateWindow - creeaz o fereastr pe baza unei clase de fereastr& ShowWindow - afieaz o fereastr pe ecran& !dateWindow - cere unei ferestre s se redeseneze& Get"essage - preia un "esa0 din coada de "esa0e& #ranslate"essage - con$ertete unele dintre "esa0ele de la tastatur& $is!atch"essage - tri"ite un "esa0 ctre o procedur de fereastr& %la&Sound - red un fiier de sunet& 'egin%aint - iniiaz o operaie de desenare a ferestrei& GetClientRect - obine di"ensiunile zonei client a ferestrei& $raw#ext - afieaz un te2t& End%aint - (ncheie o operaie de desenare& %ost(uit"essage - insereaz un "esa0 de (ncheiere (n coada de ateptare& $e)Window%roc - e2ecut operaiile prestabilite de prelucrare a "esa0elor&

Aceste funcii sunt docu"entate (n cri i (n sursele incluse de co"pilator i sunt declarate (n diferite fiiere antet incluse (n fiierul WI345WS&6& -rogra"area sub Windows este un tip de progra"are orientat pe obiecte (55- -ob0ect-oriented progra""ing & Acest lucru de$ine e$ident dac $ g*ndii la obiectul pe care (l $ei folosi cel "ai "ult (n Windows - obiectul care d nu"ele siste"ului de operare! obsedanta #fereastr%& Aa cu" a" "enionat "ai de$re"e! ferestrele sunt nite suprafee dreptunghiulare de pe ecran& 5 fereastr pri"ete intrri de la tastatur sau de la "ouse i afieaz rezultate (n zona proprie de pe suprafaa ecranului& .ereastra unei aplicaii conine! de obicei! bara de titlu a progra"ului! "eniul! chenarul de di"ensionare i! e$entual! barele de derulare& 7asetele de dialog sunt ferestre adiionale& /ai "ult! suprafaa unei casete de dialog conine (ntotdeauna c*te$a ferestre supli"entare! nu"ite #ferestre descendent% (#child windows% & .erestrele descendent apar sub for"a butoanelor de apsare! a butoanelor radio! a casetelor de $alidare! a c*"purilor pentru introducerea te2tului! casetelor-list i a barelor de derulare& Utilizatorul $ede ferestrele ca obiecte pe ecran i poate aciona direct asupra lor! aps*nd un buton sau "anipul*nd o bar de derulare& .ereastra recepioneaz inteniile utilizatorului sub for"a unor #"esa0e%& 4e ase"enea! ferestrele folosesc "esa0e pentru co"unicarea cu alte ferestre& Atunci c*nd se spune c #siste"ul de operare tri"ite progra"ului un "esa0% se are (n $edere c Windows apeleaz o funcie din progra"& -ara"etrii acestei funcii descriu "esa0ul respecti$& Aceast funcie din progra"ul Windows este cunoscut sub nu"ele de #procedur de fereastr% (#window procedure% & 5rice fereastr creat de un progra" are asociat o procedur de fereastr& -rocedura de fereastr este e funcie care se poate afla chiar (n progra" sau (ntr-o bibliotec cu legturi dina"ice (488 & Windows tri"ite un "esa0 ctre o fereastr prin apelarea procedurii de fereastr& -rocedura de fereastr prelucreaz anu"ite infor"aii pe baza "esa0ului pri"it! apoi returneaz controlul siste"ului de operare& Atunci c*nd un progra" este lansat (n e2ecuie! Windows creeaz o #coad de "esa0e% (#"essage <ueue% pentru progra"ul respecti$! (n aceast coad de "esa0e sunt pstrate "esa0ele tri"ise ctre toate ferestrele pe care le creeaz progra"ul& -rogra"ul conine o "ic sec$en de cod nu"it #ciclu de "esa0e% (#"essage loop% care preia "esa0ele din coada de ateptare i le

distribuie procedurilor de fereastr corespunztoare& Alte "esa0e sunt tri"ise direct procedurii de fereastr! fr s "ai fie plasate (n coada de "esa0e& 5 fereastr este creat (ntotdeauna pe baza unei #clase de fereastr%& 7lasa specific procedura de fereastr care prelucreaz "esa0ele tri"ise ctre fereastr& .olosirea unei clase de fereastr per"ite ca pe baza aceleiai clase s se creeze "ai "ulte ferestre care! ca ur"are! folosesc aceeai procedur de fereastr& 4e e2e"plu! toate butoanele din toate progra"ele pentru Windows sunt create pe baza aceleiai clase de fereastr& Aceast clas are o procedur de fereastr (aflat (ntr-una dintre bibliotecile cu legturi dina"ice ale siste"ului de operare care prelucreaz "esa0ele tri"ise ctre ferestrele butoanelor& nre!i"tr#re# cl#"ei de fere#"tr 7lasa de fereastr identific procedura de fereastr care prelucreaz toate "esa0ele tri"ise ctre fereastr& Atunci c*nd creai o fereastr! definii i atributele supli"entare ale acesteia! care sunt unice pentru fereastra respecti$& 7ele "ai i"portante c*"puri ale clasei de fereastr sunt al treilea i penulti"ul& -enulti"ul c*"p conine nu"ele clasei de fereastr (i (n progra"ele care creeaz o singur fereastr are! de obicei! acelai nu"e ca i progra"ul & Al treilea c*"p *l!)nWnd%roc+ este adresa procedurii de fereastr folosit pentru toate ferestrele create pe baza acestei clase& 7elelalte c*"puri descriu caracteristicile tuturor ferestrelor create pe baza acestei clase& 7*"pul cbSi,e reprezint di"ensiunea structurii& Instruciunea: wndclass&st,le > 7S?6@)4@AW A 7S?B@)4@AWC co"bin doi identificatori pentru #stilul de clas% (#class st,le% folosind operatorul SAU orientat pe bii din li"ba0ul 7& 1n fiierele antet din Windows sunt definii "ai "uli identificatori cu prefi2ul 7S?& Acestea sunt constante pe =; de bii (n care un singur bit are $aloarea D& Identificatorii definii (n acest fel sunt nu"ii uneori #identificatori pe bii%& Acetia pot fi co"binai cu a0utorul operatorului SAU orientat pe bii din li"ba0ul 7& 7ei doi identificatori pentru stilul clasei indic faptul c toate ferestrele create pe baza acestei clase sunt redesenate co"plet! ori de c*te ori se "odific di"ensiunea pe orizontal (7S?6@)4@AW sau cea pe $ertical (7S?B@)4@AW a ferestrei& Al treilea c*"p al structurii W3478ASS)E este iniializat prin instruciunea:

wndclass&lpfnWnd-roc > Wnd-rocC Aceast instruciune stabilete ca procedur de fereastr funcia Wnd%roc& Aceast procedur $a prelucra toate "esa0ele tri"ise ctre toate ferestrele create pe baza acestei clase de fereastr& Aa cu" a" artat "ai sus! prefi2ul l!)n (nsea"n! (n notaia ungar! #pointer de tip long la o funcie%& Ur"toarele dou instruciuni: wndclass&cb7ls)2tra > GC wndclass&cbWnd)2tra > GC rezer$ un spaiu supli"entar (n structura clasei i (n structura ferestrei! pstrat (n interiorul siste"ului de Windows& Un progra" poate s utilizeze spaiul supli"entar (n scopuri proprii& Ur"torul c*"p este $ariabila handle a instanei (care este chiar unul dintre para"etrii funciei Win/ain : wndclass&hInstance > hinstanceC Instruciunile: wndclass&hIcon > 8oadIcon (3U88! I4I?A--8I7A'I53 C wndclass&hIconS" > 8oadIcon (3U88! I4I?A--8I7A'I53 C definesc o pictogra" pentru ferestrele create pe baza acestei clase& -ictogra"a este o "ic i"agine de tip bit"ap care apare (n bara de tas9uri a siste"ului de operare i (n bara de titlu a ferestrei& -entru obinerea unei $ariabile handle a unei pictogra"e predefinite apelai funcia LoadIcon cu pri"ul para"etru a$*nd $aloarea 3U88& (Atunci c*nd (ncrcai o pictogra" proprie! acest para"etru $a conine $ariabila handle a instanei progra"ului& Al doilea para"etru este un identificator cu prefi2ul I4I? definit (n fiierele antet din Windows& -ictogra"a I4I?A--8I7A'I53 este o "ic i"agine a unei ferestre& .uncia LoadIcon returneaz o $ariabil handle a acestei pictogra"e& 3u ne intereseaz $aloarea real a acestei $ariabile! ci doar o stoc" (n c*"purile hIcon i hIconS-. Aceste c*"puri sunt definite (n structura W3478ASS)E de tipul 6I753 (#handle to an icon% & Instruciunea: wndclass&h7ursor > 8oad7ursor (3U88! I47? A@@5W C este foarte ase"ntoare cu cele dou instruciuni anterioare& .uncia LoadCursor (ncarc un cursor predefinit pentru "ouse! nu"it I47?A@@5W! i returneaz o $ariabil handle a acestui cursor& Atunci c*nd este deplasat deasupra zonei client a ferestrei create pe baza acestei clase! indicatorul "ouse-ului este afiat sub for"a unei sgei&

Ur"torul c*"p precizeaz culoarea fondului zonei client a ferestrelor create pe baza acestei clase& -refi2ul hbr al nu"elui hbr'ackground $ine de la #handle to a brush% (#$ariabil handle a unei pensule% & 5 pensul este un ter"en grafic care se refer la un "odel colorat de pi2eli folosit pentru u"plerea unei suprafee& Windows are "ai "ulte pensule standard (sau pensule #de stoc% & .uncia GetStockObject returneaz o $ariabil handle a unei pensule albe: wndclass&hbrIac9ground > (6I@US6 GetStoc95b0ect (W6I')?I@US6 C Aceasta (nsea"n c fondul zonei client a ferestrei $a fi colorat cu alb! ceea ce este un lucru obinuit& Ur"torul c*"p specific "eniul ferestrei& 4ac progra"ul nu are nici un "eniu! $aloarea acestui c*"p este 3U88: wndclass&lpsz/enu3a"e > 3U88C 1n sf*rit! clasei trebuie s i se dea un nu"e& -entru progra"ele "ai "ici! acesta poate fi chiar nu"ele progra"ului! deci (n $ariabila s,.!!/a-e este stocat irul de caractere #6elloWin%: wndclass&Ipsz7lass3a"e > szApp3a"eC 1nainte de a crea fereastra progra"ului trebuie s (nregistrai o clas de fereastr! apel*nd funcia RegisterClassEx. .uncia RegisterClassEx accept un singur para"etru: un pointer la o structur de tipul W3478ASS)E& Structura W3478ASS)E este definit (n fiierele antet din Windows i declarat (n progra" (n felul ur"tor: W3478ASS)E wndclass C 4up ce ai definit cele D; c*"puri ale structurii W3478ASS)E apelai funcia RegisterClassEx0 @egister7lass)2 (Jwndclass C Cre#re# tere"trei Atunci c*nd creai o fereastr apel*nd funcia Create Window1 putei s specificai "ai "ulte detalii despre fereastra respecti$& 1n loc s foloseasc o structur de date! aa cu" face funcia RegisterClassEx1 funcia CreateWindow cere ca toate infor"aiile s fie trans"ise ca para"etri& Iat un e2e"plu de apel al funciei 7reateWindow: hwnd >7reateWindow (szApp3a"e! KK nu"ele clasei de fereastra %'he 6ello -rogra"%! KK titlul ferestrei WS?5B)@8A--)4WI345W! KK stilul ferestrei 7W?US)4).AU8'! KK poziia iniiala pe a2a 2 7W?US)4).AU8'! KK poziia iniiala pe a2a ,

KK di"ensiunea iniiala pe a2a 2 KK di"ensiunea iniiala pe a2a , KK $ariabila handle a ferestrei printe 3U88! KK $ariabila handle a "eniului hlnstance! KK $ariabila handle a instanei progra"ului 3U88 C KK para"etri de creare -ara"etrul notat cu #nu"ele clasei de fereastr% este s,.!!/a-e1 care conine irul de caractere #6elloWin% - nu"ele clasei de fereastr pe care toc"ai a" (nregistrat-o& 1n acest fel! fereastra este asociat unei clase de fereastr& .ereastra creat de acest progra" este o fereastr nor"al suprapus! cu o bar de titluC (n partea st*ng a barei de titlu se afl caseta cu "eniul siste"C (n partea dreapt se afl butoanele de "rire! de "icorare i de (nchidereC fereastra are un chenar (ngroat! care per"ite redi"ensionarea& Acesta este stilul standard al ferestre lor! nu"it WS?5B)@8A--)4WI345WC (n funcia CreateWindow (i corespunde co"entariul #stilul ferestrei%& #'itlul ferestrei% este te2tul afiat (n bara de titlu& -ara"etrii notai cu #poziia iniial pe a2a 2% i #poziia iniial pe a2a ,% specific poziia iniial a colului din st*nga-sus al ferestrei! relati$ la colul din st*nga-sus al ecranului& -rin folosirea identificatorului 7W?US)4).AU8' pentru aceti para "etri indic" siste"ului de operare s foloseasc $alorile prestabilite pentru o fereastr suprapus& 1n "od prestabilit! Windows poziioneaz "ai "ulte ferestre suprapuse succesi$e la o distan cresctoare pe $ertical i pe orizontal fa de colul din st*ngasus al ecranului& 8a fel! para"etrii #di"ensiunea iniial pe a2a 2% i #di"ensiunea iniial pe a2a ,% specific di"ensiunile iniiale ale ferestrei& Identificatorul 7W?US)4).AU8' indic siste"ului de operare s foloseasc $alorile prestabilite& -ara"etrul indicat ca #$ariabil handle a ferestrei printe% are $aloarea 3U88! deoarece aceast fereastr nu are nici o fereastr printe& Atunci c*nd (ntre dou ferestre e2ist o relaie printe-descendent! fereastra descendent este afiat (ntotdeauna pe suprafaa ferestrei printe& -ara"etrul indicat ca #$ariabil handle a "eniului% are tot $aloarea 3U88! deoarece fereastra nu are "eniu& -ara"etrul indicat ca #$ariabil handle a instanei progra"ului% are ca $aloare $ariabila handle trans"is progra"ului ca para"etru la

7W?US) 4).AU8'! 7W?US)4).AU8'! 3U88!

apelarea funciei Win"ain. 1n sf*rit! #para"etrul de creare% are $aloarea 3U88& -utei s folosii acest para"etru pentru adresarea unor date folosite ulterior (n progra"& .uncia Create Window returneaz o $ariabil handle a ferestrei create& Aceasta este sal$at (n $ariabila hwnd1 definit ca fiind de tipul 6W34 ($ariabil handle a unei ferestre & 5rice fereastr din Windows are o $ariabil handle& -rogra"ul folosete $ariabila handle pentru indicarea ferestrei& /ulte funcii Windows au un para"etru hwnd1 care specific fereastra la care se refer funcia respecti$& 4ac un progra" creeaz "ai "ulte ferestre! fiecare are o $ariabil handle diferit& Bariabila handle a unei ferestre este una dintre cele "ai i"portante $ariabile folosite (n Windows& Afi$#re# fere"trei 4up e2ecutarea funciei 7reateWindow! fereastra a fost creat de Windows! dar (nc nu este afiat pe ecran& -entru aceasta "ai sunt necesare (nc dou apeluri de funcii& -ri"ul este: ShowWindow (hwnd! i7"dShow C -ri"ul para"etru este o $ariabil handle a ferestrei create de funcia CreateWindow. Al doilea para"etru este $ariabila iC-dShow1 trans"is funciei Win"ain. 4ac iC-dShow este SW?S65W35@/A8 (egal cu D ! fereastra este afiat nor"al& 4ac iC-dShow este SW?S65W/I335A7'IB) (egal cu M ! atunci fereastra nu este afiat! dar nu"ele i pictogra"a acesteia apar pe bara de tas9uri& Apelul: UpdateWindow (hwnd C deter"in redesenarea zonei client& Acest lucru se face prin tri"iterea ctre procedura de fereastr a unui "esa0 W/?-AI3'& Ciclul de %e"#&e 4up apelarea funciei !dateWindow1 fereastra de$ine $izibil pe ecran& -rogra"ul trebuie s fie acu" pregtit s citeasc intrrile de la "ouse i de la tastatur& Windows for"eaz o #coad de "esa0e% pentru fiecare progra" rulat concurenial& Atunci c*nd apare un e$eni"ent e2terior! Windows con$ertete acest e$eni"ent (ntr-un "esa0 pe care (l plaseaz (n coada de ateptare& Un progra" preia "esa0ele din coada de ateptare prin e2ecutarea unei sec$ene de cod nu"it #ciclu de "esa0e% (#"essage loop% : while (Get/essage (J"sg! 3U88! G! G

O 'ranslate/essage (J"sg C 4ispatch/essage (J"sg C P return "sg&w-ara"C Bariabila -sg este o structur de tip /SG& .uncia Get"essage apelat la (nceputul ciclului de "esa0e preia un "esa0 din coada de ateptare: Get/essage (J"sg! 3U88! G! G Acest apel trans"ite siste"ului de operare un pointer! nu"it -sg1 la o structur de tip /SG& Al doilea! al treilea i al patrulea para"etru au $aloarea 3U88 sau G! ceea ce indic faptul c progra"ul $rea s preia toate "esa0ele! pentru toate ferestrele create de progra"& Instruciunea: 'ranslate/essage (J"sg C retrans"ite structura -sg siste"ului de operare! pentru con$ertirea unor "esa0e de la tastatur& Instruciunea: 4ispatch/essage (J"sg C ca i funcia #ranslate"essage1 retrans"ite structura -sg siste"ului de operare& Windows tri"ite apoi "esa0ul ctre procedura de fereastr corespunztoare! (n $ederea prelucrrii - cu alte cu$inte! Windows apeleaz procedura de fereastr& 'rocedur# de fere#"tr 5 procedur de fereastr poate a$ea orice nu"e (cu condiia ca nu"ele respecti$ s nu e2iste de0a & Un progra" pentru Windows poate conine "ai "ulte proceduri de fereastr& 5 procedur de fereastr este (ntotdeauna asociat unei clase de fereastr! (nregistrat cu a0utorul funciei RegisterClassEx. -rocedura de fereastr este definit (ntotdeauna astfel: 8@)SU8' 7A88IA7Q Wnd-roc (6W34 hwnd! UI3' i/sg! W-A@A/ w-ara"& 8-A@A/ l-ara" -ri"ul para"etru este hwnd1 $ariabila handle a ferestrei care recepioneaz "esa0ul& Aceasta este aceeai $ariabil cu cea returnat de funcia CreateWindow& -entru un progra" care creeaz o singur fereastr aceasta este singura $ariabil handle cunoscut de progra"& 4ac progra"ul creeaz "ai "ulte ferestre pe baza aceleiai clase (i deci folosete aceeai

procedur de fereastr ! atunci hwnd identific fereastra care pri"ete "esa0ul& Al doilea para"etru este un nu"r ("ai precis! un (ntreg fr se"n UI3' - pe =; de bii care identific "esa0ul& Ulti"ii doi para"etri *w%ara-1 de tipul W-A@A/ si l%ara-1 de tipul 8-A@A/ furnizeaz "ai "ulte infor"aii despre "esa0& Acetia sunt nu"ii #para"etri de "esa0%& 7oninutul acestor para"etri este specific fiecrui tip de "esa0& 'relucr#re# %e"#&elor .iecare "esa0 recepionat de o procedur de fereastr este identificat printrun nu"r! acesta fiind para"etrul i"sg al procedurii de fereastr& 1n fiierele antet din Windows sunt definii identificatori! cu prefi2ul W/ (#window "essage% ! pentru fiecare para"etru de "esa0e& 1n general! progra"atorii Windows folosesc o construcie switch sau case ca s deter"ine ce "esa0e a pri"it fereastra i s stabileasc "odul de prelucrare a fiecrui "esa0& Atunci c*nd prelucreaz un "esa0! procedura de fereastr trebuie s returneze $aloarea G& 5rice "esa0 pe care procedura de fereastr nu-l prelucreaz este trans"is unei funcii Windows nu"it $e)Window%roc. Baloarea returnat de funcia $e)Window%roc trebuie s fie returnat i de procedura de fereastr& /ai 0os sunt descrise dou "esa0e cele "ai des (nt*lnite (n progra"ele scrise pentru Windows& Me"#&ul (M)'A*NT Unul din "esa0e prelucrat de funcia Wnd%roc este W/?-AI3'& Acest "esa0 este foarte i"portant (n progra"area sub Windows! deoarece infor"eaz fereastra pri$ind faptul c o parte sau (ntreaga zon client a acesteia este #in$alid% i trebuie s fie redesenat& 7u" poate s de$in in$alid o zon clientS Atunci c*nd fereastra este creat! (ntreaga zon client a ferestrei este in$alid! deoarece progra"ul nu a desenat (nc ni"ic (n fereastr& -ri"ul "esa0 W/?-AI3' (care apare! (n "od nor"al! atunci c*nd progra"ul apeleaz funcia !dateWindow din Win/ain cere procedurii de fereastr s deseneze ce$a (n zona client& Tona client de$ine in$alid i atunci c*nd redi"ensionai fereastra creatp de progra"& B a"intii c para"etrul de stil al structurii wndclass conine identificatorii 7S?B@)4@AW i 7S?6@)4@AW& Aceti identificatori deter"in siste"ul de operare Windows s in$alideze (ntreaga fereastr

DG

atunci c*nd aceasta (i schi"b di"ensiunea i apoi s tri"it un "esa0 W/?-AI3' ctre procedura de fereastr& 4ac "icorai la o pictogra" fereastra progra"ului i apoi (i refacei di"ensiunea iniial! Windows nu sal$eaz coninutul zonei client& 1ntr-un "ediu grafic ar fi "ult prea "ulte date de sal$at& 4e aceea Windows in$alideaz fereastra& -rocedura de fereastr pri"ete "esa0ul W/?-AI3' i reface coninutul acesteia& Atunci c*nd "utai ferestrele astfel (nc*t s se suprapun& Windows nu sal$eaz poriunea unei ferestre care a fost acoperit de o alt fereastr& 1n schi"b! atunci c*nd fereastra respecti$ este readus la suprafa! poriunea anterior acoperit este in$alidat& -rocedura de fereastr pri"ete un "esa0 W/?-AI3' pentru redesenarea poriunii respecti$e& 4e fiecare dat c*nd zona client de$ine in$alid (aa cu" se (nt*"pl atunci c*nd "odificai di"ensiunea ferestrei ! funcia Wnd-roc recepioneaz un "esa0 W/?-AI3'& Wnd%roc obine noua di"ensiune a ferestrei i afieaz din nou te2tul (n centrul acesteia& Me"#&ul (M)DESTRO+ Un alt "esa0 i"portant este W/?4)S'@5+& Acest "esa0 indic faptul c siste"ul de operare desfoar un proces de distrugere a ferestrei pe baza unei co"enzi de la utilizator& /esa0ul este tri"is atunci c*nd utilizatorul e2ecut clic pe butonul 7lose! selecteaz opiunea 7lose din "eniul siste" sau apas fastele AltU.F& -rogra"ul rspunde la acest "esa0 printr-o "etod standard! apel*nd funcia %ost(uit"essage0 -ostVuit/essage (G C Aceast funcie insereaz (n coada de ateptare a progra"ului un "esa0 W/?VUI'& A" spus anterior c funcia Get"essage returneaz o $aloare diferit de zero (n cazul prelurii oricrui "esa0 (n afar de W/?VUI'& Atunci c*nd preia din coada de ateptare un "esa0 W/?VUI'! funcia Get"essage returneaz $aloarea G! ceea ce deter"in ieirea din ciclul de tratare a "esa0elor din funcia Win/ain i (nchiderea progra"ului& S#rcin# lucrrii: 7reai o aplicaie Windows! (n centrul zonei client al creia este afiat un "esa0 WLucrarea de laborator al studentului ...W& 8a redi"ensionarea ferestrei! "esa0ul trebuie sa fie afiat (n centrul zonei client& ntre,ri de control:

DD

D& ;& =& F& H&

7are este sarcina principal a procedurii de fereastrS -e baza la ce se creeaz o fereastrS 4escriei c*"purile clasei de fereastr& 7e este o $ariabil handleS 7e se (nt*"pl cu "esa0ele nedescrise (n procedura de fereastr! dar plasate (n coada de "esa0eS L& 4escriei funciile utilizate (n progra"&

D;

LUCRARE DE LABORATOR NR. -

TEMA: Inter)a2a G$I Scopul lucrrii: de a studia !ri-iti3ele o)erite de inter)a2a G$I Noiuni teoretice Interfaa pentru dispoziti$e grafice (G4I - Graphics 4e$ice Interface este o co"ponent a siste"ului de operare Windows i are ca sarcin afiarea ele"entelor grafice (inclusi$ a te2tului pe ecran i la i"pri"ant& 4e ase"enea! trebuie s tii c interfa Windows G4I (i are li"itele ei& 7el puin (n acest "o"ent! interfa G4I nu poate s fac tot ce $-ai putea dori de la o interfa grafic& 4ei putei s "utai pe ecran obiecte grafice! G4I este! (n general! un siste" de afiare static! ce per"ite nu"ai ani"aii li"itate& Aa cu" este i"ple"entat (n Windows RH! interfa G4I nu asigur un suport direct pentru afiarea tridi"ensional sau pentru rotirea obiectelor& 4e e2e"plu! atunci c*nd desenai o elips! a2ele acesteia trebuie s fie paralele cu a2ele siste"ului de coordonate& 4ei unele li"ba0e grafice folosesc nu"ere (n $irgul "obil pentru coordonatele $irtuale& Windows RH - din "oti$e legate de perfor"an - folosete nu"ai nu"ere (ntregi pe DL bii aceasta este una dintre deficienele siste"ului de operare Windows RH& Windows 3' per"ite folosirea coordonatelor pe =; de bii& 4in punctul de $edere al progra"atorului! interfaa G4I este for"at din c*te$a sute de apeluri de funcii i unele tipuri de date! "acroinstruciuni i structuri asociate acestor funcii! (nainte de a studia (n detaliu c*te$a dintre aceste funcii! haidei s $ede" care este structura general a interfeei G4I& Tipuri de #peluri de funcii 1n general! apelurile de funcii G4I pot fi clasificate (n "ai "ulte categorii& 7hiar dac nu sunt foarte stricte i e2ist unele suprapuneri! aceste categorii pot fi enunate astfel:
D=

.uncii care obin (sau creeaz i elibereaz (sau distrug un conte2t de dispoziti$& .uncii care obin infor"aii despre conte2tul de dispoziti$& .uncii care deseneaz ce$a& .uncii care stabilesc sau obin atribute ale conte2tului de dispoziti$& .uncii care lucreaz cu obiecte G4I& )le"entele grafice pe care le afiai pe ecran sau le tiprii la i"pri"ant pot fi ("prite (n "ai "ulte categorii! nu"ite #pri"iti$e%& Iat care sunt aceste categorii: Linii 4i curbe. 8iniile reprezint baza oricrui siste" de desenare $ectorial& G4I per"ite folosirea liniilor drepte! a dreptunghiurilor! a elipselor (inclusi$ subsetul de elipse cunoscute sub nu"ele de cercuri ! a arcelor - care sunt curbe reprezent*nd poriuni din circu"ferina unei elipse sau a curbelor Iezier& 8iniile sunt desenate folosind penia curent selectat (n conte2tul de dispoziti$& Su!ra)e2e !line. 4ac o serie de linii sau de curbe (nchid o suprafa! aceasta poate fi #u"plut% folosind pensula G4I curent& Aceast pensul poate fi o culoare co"pact! un "odel (hauri orizontale! $erticale sau pe diagonal sau o i"agine bit"ap repetat pe $ertical sau pe orizontal& I-agini bit-a!. I"aginile bit"ap sunt "atrice dreptunghiulare de bii! care corespund pi2elilor unui dispoziti$ de afiare& 1n general! acestea sunt folosite pentru afiarea i"aginilor co"ple2e (deseori preluate din lu"ea real pe ecran sau pentru tiprirea acestora la i"pri"ant& 4e ase"enea! i"aginile bit"ap sunt folosite pentru afiarea unor "ici i"agini (cu" ar fi pictogra"e! indicatoare de "ouse i butoane de pe barele cu instru"ente de lucru ale aplicaiilor care trebuie afiate foarte rapid& #ext& 'e2tul este "ai puin #"ate"atic% dec*t alte aspecte ale graficii pe calculator& Structurile create pentru definirea fonturilor i pentru obinerea infor"aiilor despre fonturi sunt printre cele "ai "ari din Windows& 1ncep*nd cu $ersiunea Windows =&D! interfaa G4I accept fonturile 'rue',pe!
DF

bazate pe contururi u"plute! care pot fi "anipulate de alte funcii G4I& Windows RH accept (n continuare i fonturile "ai $echi! de tip bit"ap (cu" este fontul siste" prestabilit pentru co"patibilitate i pentru econo"isirea spaiului de "e"orie& Alte aspecte ale interfeei G4I nu sunt la fel de uor de clasificat& -rintre acestea se nu"r: "oduri de -a!are 4i trans)or-5ri. /odurile de "apare G4I $ per"it s desenai folosind ca unitate de "sur inci (sau fraciuni de inci ! "ili"etri sau orice alt unitate de "sur& 4e ase"enea& Windows RH asigur suportul pentru o #transfor"are real% e2pri"at printr-o "atrice =2=& Aceast transfor"are per"ite defor"area i rotirea obiectelor grafice& 4in pcate! aceast transfor"are nu este acceptat sub Windows RH& "eta)i4iere *-eta)iles+. Un "etafiier este o colecie de co"enzi G4I stocate (ntr-o for" binar& /etafiierele sunt folosite pentru transferarea reprezentrilor unor ele"ente grafice $ectoriale prin inter"ediul "e"oriei te"porare (clipboard & Regiuni *regions+. 5 regiune este o suprafa co"ple2 de orice for"! definit ca o co"binaie boolean de regiuni "ai si"ple& 1n general! regiunile sunt stocate intern de G4I ca o serie de linii de scanare! diferite de co"binaia de linii folosit iniial pentru definirea regiunii& -utei s folosii regiunile pentru contururi! pentru u"plere sau pentru decupare& 7i *!aths+. 5 cale este o colecie de linii drepte i curbe stocate intern de G4I& 7ile pot fi folosite pentru desenare! pentru u"plere sau pentru decupare& 4e ase"enea! cile pot fi transfor"ate (n regiuni& $ecu!are *cli!!ing+. 4esenarea poate fi li"itat la o anu"it seciune a zonei client! nu"it zon de decupare! care poate fi dreptunghiular sau poate a$ea o alt for"! definit printr-o serie de linii& Tona de decupare este definit! (n general! de o cale sau de o regiune&
DH

-alete *!alettes+. .olosirea paletelor proprii este li"itat! (n general! nu"ai la "onitoarele care pot reda ;HL de culori& Windows rezer$ ;G dintre aceste culori pentru siste"ul de operare& 7elelalte ;=L de culori pot fi "odificate pentru afiarea corespunztoare a i"aginilor din lu"ea real! stocate ca i"agini bit"ap& #i!5rire *!rinting+. 4ei discuiile din acest capitol sunt li"itate doar la afiarea pe ecran! tot ceea ce (n$ai (n acest capitol poate fi aplicat i operaiilor de tiprire& (Bezi 7apitolul DH pentru alte infor"aii despre tiprire&

Conte.tul de di"po/iti0 Atunci c*nd $rei s desenai la un dispoziti$ de ieire grafic (cu" ar fi ecranul sau i"pri"anta trebuie s obinei "ai (nt*i o $ariabil handle a conte2tului de dispoziti$ (47 - de$ice conte2t & Bariabila handle este apoi inclus ca para"etru (n apelul unei funcii G4I! identific*nd dispoziti$ul Ia care $rei s desenai& 7onte2tul de dispoziti$ conine "ai "ulte atribute curente! care specific "odul de lucru al funciilor G4I pentru dispoziti$ul respecti$& Aceste atribute per"it ca la apelarea funciilor G4I s fie specificate nu"ai coordonatele de (nceput sau di"ensiunea! nu i toate celelalte infor"aii de care siste"ul de operare are ne$oie pentru desenarea obiectelor pe dispoziti$ul folosit& Atunci c*nd dorii s "odificai unul dintre aceste atribute ale conte2tului de dispoziti$! apelai o funcie specializat& O,inere# 0#ri#,ilei 1#ndle # conte.tului de di"po/iti0 Siste"ul de operare Windows $ pune la dispoziie "ai "ulte "etode pentru obinerea $ariabilei handle a conte2tului de dispoziti$& 4ac obinei o $ariabil handle a conte2tului de dispoziti$ (n ti"pul prelucrrii unui "esa0! ar trebui s tergei aceast $ariabil (nainte de ieirea din procedura de fereastr& 4up ce este tears! $ariabila handle nu "ai poate fi folosit (nu "ai este $alid & 7ea "ai cunoscut "etod de obinere i de tergere a $ariabilei handle a conte2tului de dispoziti$ i"plic folosirea
DL

funciilor 'egin%aint i End%aint (n ti"pul prelucrrii "esa0ului W/?-AI3': hdc > Iegin-aint (hwnd! Jps C 6alte linii de !rogra-7 )nd-aint (hwnd! Jps C Bariabila !s este o structur de tip -AI3'S'@U7'& 7*"pul hdc al acestei structuri conine $ariabila handle a conte2tului de dispoziti$& .olosind $ariabila handle a conte2tului de dispoziti$! obinut prin apelarea funciei 'egin%aint1 nu putei s desenai dec*t (n regiunea in$alid a ferestrei& .uncia 'egin%aint $alideaz regiunea in$alid& -rogra"ele Windows pot s obin $ariabila handle a conte2tului de dispoziti$ i (n ti"pul prelucrrii altor "esa0e dec*t W/?-AI3': hdc > Get47 (hwnd C (alte linii de !rogra-7 @elease47 (hwnd! hdc C Acest conte2t de dispoziti$ se aplic zonei client a ferestrei care are $ariabila handle hwnd. -rincipala diferen (ntre apelul de "ai sus i "etoda folosirii funciilor 'egin%aint i End%aint este c $ariabila handle returnat de funcia Get$C $ per"ite s desenai (n toat zona client a ferestrei& 1n plus! funciile Get47 i Release$C nu $alideaz e$entualele regiuni in$alide ale zonei client& Un progra" Windows poate s obin i o $ariabil handle a unui conte2t de dispoziti$ care se aplic (ntregii ferestre! nu nu"ai zonei client a ferestrei: hdc > GetWindow47 (hwnd C 6alte linii de !rogra-7 @elease47 (hwnd! hdc C 6alte linii de !rogra-7 4elete47 (hdc C O,inere# infor%#iilor de"pre culori .uncia Get$e3iceCa!s $ per"ite s deter"inai "odul de organizare a "e"oriei (n adaptoarele $ideo i nu"rul de culori
DM

care pot fi reprezentate& Apelul de "ai 0os returneaz nu"rul de planuri de culoare: i-lanes 8 Get4e$ice7aps (hdc! -8A3)S C Apelul ur"tor returneaz nu"rul de bii de culoare folosii pentru fiecare pi2el: iIits-i2el > Get4e$ice7aps (hdc! II'S-IE)8 C /a0oritatea adaptoarelor $ideo care pot afia culori folosesc fie "ai "ulte planuri de culoare! fie "ai "uli bii de culoare pentru fiecare pi2el! dar nu pe a"*ndouC cu alte cu$inte! unul dintre cele dou apeluri de "ai sus $a returna $aloarea D& 3u"rul de culori care pot fi redate de o plac $ideo se poate calcula cu for"ula ur"toare: i7olors > DXX(i-lanes Y iIits-i2el C Aceast $aloare poate s nu fie identic cu nu"rul de culori obinut prin apelarea funciei Get$e3iceCa!s cu para"etrul 3U/7585@S: i7olors > Get4e$ice7aps (hdc! 3U/7585@S C Windows folosete pentru reprezentarea culorilor o $aloare (ntreag fr se"n! pe =; de bii& 'ipul de date folosit pentru culori se nu"ete 7585@@).& Ulti"ii trei octei ai nu"rului (cei "ai puin se"nificati$i specific $alorile pentru culorile rou! $erde i albastru! de la 5 la ;HH! aa cu" se poate $edea (n .igura F-=& @ezult o palet potenial de ;;F culori (apro2i"ati$ DL "ilioane de culori &

Baloarea pe =; de bii de "ai sus e nu"it deseori #culoare @GI%& 1n fisierele antet din Windows sunt definite "ai "ulte "acroinstruciuni pentru lucrul cu $alorile @GI& /acroinstructiunea @GI accept trei argu"ente! care reprezint $alorile pentru culorile rou! $erde i albastru i le co"bin (ntr-o $aloarea (ntreag pe =; de bii! fr se"n& Astfel! $aloarea @GI (;HH! G! ;HH este de fapt G2GG..GG..! $aloarea @GI pentru "agenta& 4ac toate cele trei argu"ente au $aloarea G! se obine negrul! iar dac
DN

au $aloarea ;HH! se obine albul& /acroinstruciunile Get@Balue! GetGBalue i Get'9alue e2trag $alorile pentru culorile pri"are! sub for"a unor octei fr se"n! din $aloarea @GI a culorii& Aceste "acroinstructiuni sunt utile atunci c*nd apelai funcii Windows care returneaz culori @GI& S#l0#re# conte.tului de di"po/iti0 1n "od nor"al! Windows creeaz un nou conte2t de dispoziti$ cu $alori prestabilite atunci c*nd apelai una dintre funciile Get$C sau 'egin%aint. 'oate "odificrile fcute (n atributele conte2tului de dispoziti$ se pierd atunci c*nd conte2tul de dispoziti$ este ters din "e"orie prin apelarea funciei Release$C sau a funciei End%aint. 4ac progra"ul trebuie s foloseasc un atribut cu o $aloarea diferit de cea prestabilit $a trebui s iniializai conte2tul de dispoziti$ de fiecare dat c*nd obinei o $ariabil handle: caseW/?-aint: hdc > Iegin-aint (hwnd! Jps C 6ini2iali,ea,5 atributele contextului de dis!o,iti37 6desenea,5 ,ona client a )erestrei7 )nd-aint (hwnd! Jps C return GC 4ei aceast abordare este (n general satisfctoare! s-ar putea s preferai s sal$ai "odificrile fcute asupra conte2tului de dispoziti$ ia distrugerea acestuia! astfel (nc*t $alorile sal$ate s rede$in acti$e la apelarea funciilor Get$C sau 'egin%aint. De"en#re# liniilor Interfaa Windows G4I conine i funciile Set%ixel i Get%ixel. 4ei $o" folosi funcia Set%ixel (n progra"ul 7533)7' din 7apitolul M! (n progra"ele de grafic propriu-zis aceste funcii sunt rareori folosite& 1n "a0oritatea cazurilor! cea "ai si"pl pri"iti$ grafic $ectorial trebuie s fie considerat linia& Windows poate s deseneze linii drepte! linii eliptice (linii curbe! pe circu"ferina unei elipse i curbe Iezier& 7ele apte funcii acceptate de Windows RH pentru desenarea liniilor sunt
DR

Line#o (linii drepte ! %ol&line i %ol&line#o (o serie de linii drepte conectate ! -ol,-ol,line ("ai "ulte linii poligonale ! .rc (linii eliptice ! %ol&'e,ier 4i %ol&'e,ier#o. (Interfaa G4I din Windows 3' accept (nc trei funcii pentru desenarea liniilor: .rc#o1 .ngle.rc i %ol&$raw. Aceste funcii nu sunt (ns acceptate (n Windows RH& Aspectul liniilor desenate cu aceste funcii poate fi influenat de cinci atribute ale conte2tului de dispoziti$: poziia curent a peniei (nu"ai pentru funciile Line#o! %ol&line#o i %ol&'e,ier#o+1 penia selectat! "odul de afiare a fondului (nu"ai pentru peniele care nu deseneaz cu o culoare co"pact ! culoarea fondului (pentru "odul 5-AVU) de afiare a fondului i "odul de desenare& .uncia Line#o este una dintre puinele funcii G4I care nu are ne$oie de di"ensiunile co"plete ale obiectului ce ur"eaz s fie desenat& .uncia Line#o deseneaz o linie de la #poziia curent% definit (n conte2tul de dispoziti$ pan la punctul specificat la apelarea funciei (e2clusi$ acest punct & -oziia curent este folosit ca punct de plecare i de alte funcii G4I& 1n conte2tul de dispoziti$ prestabilit! poziia curent are iniial $aloarea (G!G & 4ac apelai funcia Line#o fr s stabilii "ai (nt*i poziia curent! funcia deseneaz o linie pornind din colul din st*nga-sus al zonei client& 4ac dorii s desenai o linie din punctul *xStart1 &Start+ pan (n punctul *xEnd1 &End+ trebuie s apelai "ai (nt*i funcia "o3e#oEx ca s stabilii ca poziie curent punctul (2Start! ,Sfart : /o$e'o)2 (hdc! 2Start! ,Start! Jpt C unde pt este o structur de tip -5I3'! definit (n fiierele antet& .uncia "o3e#oEx nu deseneaz ni"ic! ci doar schi"b poziia curent& -oziia curent anterioar este stocat (n structura de tip -5I3'& -utei apoi s folosii funcia Line#o ca s desenai linia: 8ine'o (hdc! 2)nd! ,)nd C Apelul de "ai sus deseneaz o linie p*n (n punctul *xEnd1 &End+1 e2clusi$ acest punct& 4up apelul funciei Line#o1 poziia curent de$ine *xEnd1 &End+.
;G

-utei s obinei poziia curent a peniei apel*nd funcia GetCurrent%osition astfel: Get7urrent-osition)2 (hdc! Jpt C Atunci c*nd a$ei o "atrice de puncte pe care $rei s le conectai prin linii! putei s desenai "ai uor liniile folosind funcia %ol&line. Instruciunea de "ai 0os deseneaz acelai dreptunghi ca i sec$ena de cod din e2e"plul anterior: -ol,line (hdc! pt! H C Ulti"ul para"etru reprezint nu"rul de puncte& Aceast $aloare putea fi reprezentat i prin e2presia *si,eo)*!t+ : si,eo)*%OI/#++. .uncia %ol&line are acelai efect ca i o funcie "o3e#oEx ur"at de "ai "ulte funcii Line#o1 e2cept*nd faptul c funcia %ol&line nu schi"b poziia curent& .uncia %ol&line#o este puin diferit& Aceasta folosete ca punct de plecare poziia curent i stabilete ca poziie curent sf*ritul ulti"ei linii desenate& 7odul de "ai 0os deseneaz acelai dreptunghi folosit ca e2e"plu i "ai sus: /o$e'o)2 (hdc! ptZG[&2! ptZG[&,! 3U88 C -ol,line'o (hdc! pt U D!F C 4ei putei s folosii funciile %ol&line i %ol&line#o i pentru un nu"r "ic de funcii! acestea sunt "ai utile atunci c*nd desenai o curb co"ple2 for"at din sute sau chiar "ii de linii& 1n continuare a $rea s discut" despre funcia .rc1 funcie care deseneaz o curb eliptic& 4ar funcia .rc nu prea are sens dac nu discut" "ai (nt*i despre funcia Elli!se1 care! la r*ndul ei! nu are sens fr o discuie despre funcia Rectangle. Si dac discut" despre funciile Rectangle i Elli!se1 pute" la fel de bine s discut" i despre funciile RoundRect1 Chord i -ie& -roble"a este c funciile Rectangle1 Elli!se1 RoundRect1 Chord i %ie nu sunt toc"ai nite funcii de desenare a liniilor& 4esigur! ele deseneaz i linii! dar i coloreaz zona (nchis! cu pensula curent de colorare a suprafeelor& 1n "od prestabilit! aceast pensul are culoarea alb! aa c s-ar putea ca operaia s nu fie at*t de e$ident atunci c*nd (ncercai pentru pri"a dat s utilizai aceste funcii& 4ei! (n sens strict! funciile aparin unei alte seciuni din capitolul de fa! #4esenarea suprafeelor pline%! $o" discuta acu" despre fiecare&
;D

.unciile de "ai sus sunt ase"ntoare prin faptul c sunt construite pe baza unui #dreptunghi de (ncadrare% (#bounding bo2% & 4u"nea$oastr definii o caset care (ncadreaz obiectul dreptunghiul de (ncadrare - i Windows deseneaz obiectul (n acest dreptunghi& 7ea "ai si"pl dintre aceste funcii deseneaz un dreptunghi: @ectangle (hdc! 28eft! ,'op! 2@ight! ,Iotto" C -unctu cu coordonatele (xLe)t1 &#o! este punctul din st*nga sus! iar punctul cu coordonatele (xRight1 &'otto- este punctul din dreapta 0os& 4up ce ai aflat cu" se deseneaz un dreptunghi! folosind aceiai para"etri! $ei putea! la fel de si"plu! s desenai i o elips: )llipse (hdc! 28eft! ,'op! 2@ight! ,Iotto" C .uncia pentru desenarea unui dreptunghi cu colurile rotun0ite folosete acelai dreptunghi de (ncadrare ca i funciile Rectangle i Elli!se1 dar are (nc doi para"etri: @ound@ect (hdc! 28eft! ,'op! 2@ight! ,Iotto"! 27orner)llipse! ,7orner)llipse C -entru desenarea colurilor rotun0ite! Windows folosete o "ic elips& 8i"ea elipsei este xCornerElli!se iar (nli"ea acesteia este &CornerElli!se. 7olurile dreptunghiului sunt cu at*t "ai rotun0ite cu c*t $alorile para"etrilor xCornerElli!se i &CornerElli!se sunt "ai "ari& 4ac xCornerElli!se este egal cu 0u"tate din diferena dintre xLe)t i xRight iar &CornerElli!se este egal cu 0u"tate din diferena dintre ,'op i ,Iotto"! atunci funcia @ound@ect $a desena o elips& .unciile .rc1 Chord i -ie pri"esc aceiai para"etri: Arc (hdc! 28eft! ,'op! 2@ight! ,Iotto"! 2Start! ,Start! 2)nd! ,)nd C 7hord (hdc! 28eft! ,'op! 2@ight! ,Iotto"! 2Start! ,Start! 2)nd! ,)nd C -ie (hdc! 28eft! ,'op! 2@ight! ,Iotto"! 2Start! ,Start! 2)nd! ,)nd C 1n cazul funciei .rc1 Windows i-a ter"inat treaba! deoarece arcul este o linie eliptic! nu o suprafa plin& 1n cazul funciei 7hord! Windows unete capetele arcului! iar (n cazul funciei -ie!
;;

unete capetele arcului cu centrul elipsei& Interioarele suprafeelor (nchise obinute astfel sunt colorate cu pensula curent& 2olo"ire# penielor de "toc Atunci c*nd apelai oricare dintre funciile de desenare a liniilor! Windows folosete pentru desenarea liniilor #penia% (pen curent selectat (n conte2tul de dispoziti$& -enia selectat deter"in culoarea! li"ea i tipul de linie (acestea pot fi continue! punctate sau (ntrerupte & -enia din conte2tul prestabilit de dispoziti$ se nu"ete I8A7Q?-)3& Aceasta deseneaz o linie co"pact! de culoare neagr! cu grosi"ea de un pi2el! indiferent de "odul de "apare& I8A7Q?-)3 este una dintre cele trei penie #de stoc% (stoc9 pen furnizate de Windows& 7elelalte dou penie de stoc sunt W6I')?-)3 i 3U88?-)3& 3U88?-)3 este o peni care nu deseneaz ni"ic& 1n plus! putei s creai penie proprii& -enie sunt deter"inate de propriile $ariabile handle& 1n fiierele antet din Windows este definit tipul de date 6-)3! care reprezint o $ariabil handle a unei penie& -utei s definii o $ariabil (de e2e"plu! h-en folosind aceast definiie de tip: 6-)3 h-en C -utei s obinei $ariabila handle a uneia dintre peniele de stoc apel*nd funcia GetStockObject. 4e e2e"plu! s presupune" c $rei s folosii penia de stoc nu"it W6I')?-)3& 5binei $ariabila handle a acesteia astfel: h-en > GetStoc95b0ect (W6I')?-)3 C Apoi trebuie s selectai (n conte2tul de dispoziti$ penia a crei $ariabil ai obinut-o! apel*nd funcia SelectObject0 Select5b0ect (hdc! h-en C 4up acest apel toate liniile pe care le desenai $or folosi penia W6I')?-)3! p*n c*nd selectai o alt peni (n conte2tul de dispoziti$ sau tergei conte2tul de dispoziti$& 1n loc s definii e2plicit $ariabila h-en! putei s co"binai funciile GetStockObject i SelectObject (ntr-o singur instruciune: Select5b0ect (hdc! GetStoc95b0ect (W6I')?-)3 C
;=

4ac apoi $rei s re$enii la penia I8A7Q?-)3! putei s obinei o $ariabil handle a acesteia i s o selectai (n conte2tul de dispoziti$ tot cu o singur instruciune: Select5b0ect (hdc! GetStoc95b0ect (W6I')?-)3 C .uncia SelectObject returneaz $ariabila handle a peniei selectate anterior (n conte2tul de dispoziti$& 4ac deschidei un nou conte2t de dispoziti$ i e2ecutai instruciunea: h-en > Select5b0ect (hdc! GetStoc95b0ect (W6I')?-)3 C atunci penia curent selectat (n conte2tul de dispoziti$ $a fi W6I')?-)3 i h-en $a fi $ariabila handle a peniei I8A7Q?-)3& -utei apoi s selectai penia I8A7Q?-)3 (n conte2tul de dispoziti$ cu ur"toarea instruciune: Select5b0ect (hdc! h-en C -entru a crea o peni proprie apelai funcia: h-en > 7reate-en (i-enSt,le! iWidth! rgb7olor C -ara"etrul i%enSt&le precizeaz dac se deseneaz o linie continu! o linie punctat sau una (ntrerupt& -ara"etrul i%enSt&le poate fi unul dintre identificatorii definii (n fiierele antet din Windows& -ara"etrul rgbColor din funcia Create%en este un nu"r (ntreg fr se"n reprezent*nd culoarea peniei& -entru toate stilurile de penie! e2cept*nd -S?I3SI4).@A/)! atunci c*nd selectai penia (n conte2tul de dispoziti$! Windows con$ertete acest para"etru la cea "ai apropiat culoare pur pe care o poate reprezenta dispoziti$ul de afiare& -S?I3SI4).@A/) este singurul stil care poate folosi culori a"estecate! dar nu"ai pentru grosi"i "ai "ari de un pi2el& De"en#re# "upr#feelor pline 7ele apte funcii Windows pentru desenarea figurilor sunt prezentate (n tabelul ur"tor: .uncia Rectangle Elli!se RoundRect Chord .igura 4reptunghi cu coluri drepte )lips 4reptunghi cu coluri rotun0ite Arc pe circu"ferina unei elipse! a$*nd
;F

capetele unite printr-o coard Suprafa de for"a unei felii de plcint! reprezent*nd un seg"ent de elips& %ol&gon .igur geo"etric a$*nd "ai "ulte laturi %ol&%ol&gon /ai "ulte figuri geo"etrice cu "ai "ulte laturi Windows deseneaz conturul figurilor folosind penia curent selectat (n conte2tul de dispoziti$& -entru acest contur sunt folosite atributele stabilite pentru "odul de desenare a fondului! culoarea fondului i "odul de desenare! ca i (n cazul desenrii unei linii si"ple& 'ot ceea ce ai (n$at despre linii se aplic i (n cazul contururilor& .igurile sunt u"plute folosind pensula selectat (n conte2tul de dispoziti$& 1n "od prestabilit! aceasta este pensula de stoc W6I')?I@US6! ceea ce (nsea"n c interiorul figurilor $a fi u"plut cu alb& Windows definete ase pensule de stoc: W6I')?I@US6! 8'G@A+?I@US6! G@A+?I@US6! 4QG@A+?I@US6! I8A7Q?I@US6 i 3U88?I@US6 (sau 65885W?I@US6 & -utei s selectai una dintre aceste pensule (n conte2tul de dispoziti$ la fel cu" selectai o peni de stoc& Windows definete tipul 6I@US6 ca $ariabil handle a unei pensule! aa c putei s definii "ai (nt*i o $ariabil de acest tip: 6I@US6 hIrush C -utei s obinei $ariabila handle a pensulei de stoc G@A+?I@US6 apel*nd funcia GetStockObject0& hIrush > GetJto795b0ect (GIA+?I@US6 C -utei s o selectai apoi (n conte2tul de dispoziti$ folosind funcia SelectObject0 Select5b0ect (hdc! hIrush C 4in acest "o"ent! figurile desenate $or a$ea interiorul gri& 4ac $rei s desenai o figur fr contur! selectai (n conte2tul de dispoziti$ penia 3U88?-)3: Select5b0ect (hdc! GetStoc95b0ect (3U88?-)3 C 4ac $rei s desenai o figur fr s (i u"plei interiorul! selectai (n conte2tul de dispoziti$ pensula 3U88?I@US6: Select5b0ect (hdc! GetStoc95b0ect (3U88?I@US6 C %ie
;H

Aa cu" putei s creai penie proprii! putei s creai i pensule proprii& Si"te%ele de coordon#te #le di"po/iti0ului Windows "apeaz coordonatele logice specificate (n funciile G4I la coordonatele dispoziti$ului& 1nainte de a discuta despre siste"ele de coordonate logice folosite de diferitele "oduri de "apare! $o" discuta despre diferitele siste"e de coordonate de dispoziti$ definite (n Windows pentru zona de afiare& 4ei (n general a" lucrat doar (n zona client a ferestrei! (n anu"ite situaii Windows folosete alte dou siste"e de coordonate de dispoziti$& 1n toate siste"ele de coordonate de dispoziti$ sunt folosii pi2elii ca unitate de "sur& Balorile de pe a2a orizontal *x+ cresc de la st*nga la dreapta iar $alorile de pe a2a $ertical ( & cresc de sus (n 0os& Atunci c*nd folosi" (ntregul ecran! spune" c lucr" (n #coordonate ecran%& 7olul din st*nga-sus este punctul de coordonate (G! G & 7oordonatele ecran sunt folosite (n "esa0ul W/?/5B) (pentru alte ferestre dec*t ferestrele descendent i (n ur"toarele funcii Windows: CreateWinriow i "o3eWindow (a"bele pentru alte ferestre dec*t ferestrele descendent ! Get"essage%os1 GetCursor%os1 SetCursor%os1 GetWindowRect1 Window;ro-%oint i Set'rushOrgEx. Acestea sunt funcii care fie nu au o fereastr asociat (cu" ar fi cele dou funcii pentru cursor ! fie trebuie s "ute (sau s gseasc o fereastr pe baza unui punct de pe ecran& 4ac folosii funcia Create$C cu para"etrul 4IS-8A+ ca s obinei un conte2t de dispoziti$ pentru (ntregul ecran! atunci coordonatele logice specificate la apelarea funciilor G4I $or fi "apate la coordonatele ecranului& #7oordonatele de fereastr% se refer la (ntreaga fereastr a ecranului! inclusi$ bara de titlu! "eniu! barele de derulare i chenarul ferestrei& -entru o fereastr nor"al! punctul (G! G este colul din st*nga-sus al chenarului de redi"ensionare& 7oordonatele de fereastr sunt folosite "ai rar (n Windows! dar dac obinei un conte2t de dispoziti$ cu a0utorul funciei GetWindow47! atunci coordonatele logice specificate la apelarea funciilor G4I $or fi "apate la coordonatele ferestrei&
;L

Al treilea siste" de coordonate de dispoziti$ - cu care $o" lucra cel "ai des -folosete #coordonatele zonei client%& -unctul (G!G este colul din st*nga-sus al zonei client& 4ac obinei un conte2t de dispoziti$ cu a0utorul funciei Get$C sau al funciei 'egin%aint! atunci coordonatele logice specificate Ia apelarea funciilor G4I $or fi "apate la coordonatele zonei client& -utei s transfor"ai coordonatele zonei client (n coordonatele ecranului i in$ers folosind funciile Client#oScreen i Screen#oClient. $e ase"enea! putei obinei poziia i di"ensiunea (ntregii ferestre (n coordonate ecran folosind funcia GetWindowRect. S#rcin# lucrrii: Scriei un progra" care afieaz (n zona client un desen ani"at! utiliz*nd toate pri"iti$ele G4I& ntre,ri de control: D& 4escriei principalele pri"iti$e ale interfeei grafice& ;& )nu"erai "etodele de obinere a $ariabilei handle a dispoziti$ului de conte2t& =& 7e siste"e de coordonate ale dispoziti$ului de conte2t cunoateiS

;M

LUCRARE DE LABORATOR NR. 3

Te%#: Curbe 'e,ier Scopul lucrrii: 4e a studia pri"iti$ele grafice ce per"it afiarea curbelor Iezier i afiarea acestor curbe cu a0utorul for"ulelor& Noiuni teoretice 'er"enul #spline% se referea odat la o rigl fle2ibil din le"n! "etal sau cauciuc (florar ! folosit pentru desenarea curbelor& 4e e2e"plu! dac a$eai un nu"r de puncte aparin*nd unui grafic i doreai s desenai o curb (ntre acestea (prin interpolare sau e2trapolare trebuia s "arcai "ai (nt*i punctele pe h*rtie& Ancor*nd apoi rigla (n punctele respecti$e! nu $ r"*nea dec*t s trasai curba de-a lungul riglei& 1n prezent! #spline% se refer la o funcie "ate"atic& Aceste funcii au diferite for"e& 7urbele Iezier sunt unele dintre cele "ai cunoscute pentru progra"area grafic& 1n anii \LG! co"pania de auto"obile @enault trecea de la proiectarea "anual a caroseriilor (care i"plica folosirea argilei la o proiectare asistat de calculator& )rau necesare instru"ente "ate"atice! iar -ierre Iezier a pus la punct un set de for"ule care s-au do$edit foarte utile pentru rezol$area acestei proble"e& 4e atunci! datorit for"ei bidi"ensionale! curba Iezier s-a do$edit a fi cea "ai util curb pentru grafica pe calculator& 4e e2e"plu! (n li"ba0ul -ostScript funciile Iezier sunt folosite pentru toate curbele - elipsele sunt apro2i"are prin curbe Iezier 4e ase"enea! funciile Iezier sunt folosite pentru definirea contururilor caracterelor din fonturile -ostScript& (.onturile 'rue',pe folosesc o for" si"plificat! "ai rapida! a curbelor& 5 curb Iezier este definit prin patru puncte - dou capete i dou puncte de control& 7apetele curbei sunt ancorate (n cele dou puncte finale& -unctele de control acioneaz ca nite #"agnei% care defor"eaz linia dreapt dintre cele dou puncte finale& .unciile Iezier sunt considerate utile pentru proiectarea asistat de calculator! datorit c*tor$a caracteristici:
;N

1n pri"ul r*nd! cu puin practic! de obicei putei s "anipulai curba p*n a0unge la o for" apropiat de cea dorit& 1n al doilea r*nd! curbele Iezier sunt foarte uor de controlat& 1n unele $ariante ale funciilor spline! curba nu trece prin nici unul din punctele care o definesc& 7urbele Iezier! (ns! sunt (ntotdeauna ancorate (n cele dou puncte finale& (Aceasta este una dintre ipotezele de la care pornete calculul for"ulei Iezier& 4e ase"enea! unele for"e ale funciilor spline au puncte de singularitate! din care curba se (ntinde la infinit& 1n proiectarea asistat de calculator acest lucru este de cele "ai "ulte ori e$itat& 7a ur"are! curbele Iezier sunt (ntotdeauna li"itate de un patrulater (nu"it #carcas con$e2% - #con$e2 hull% for"at prin unirea punctelor finale i a punctelor de control& 1n al treilea r*nd! o alt caracteristic a curbelor Iezier i"plic relaiile dintre punctele finale i punctele de control& 7urba este (ntotdeauna tangent la linia trasat de la pri"ul punct final la pri"ul punct de control i are (ntotdeauna aceeai direcie cu aceast linie& (Aceast caracteristic este ilustrat $izual de progra"ul I)TI)@& 4e ase"enea! curba este (ntotdeauna tangent la linia trasat de la al doilea punct final la al doilea punct de control i are (ntotdeauna aceeai direcie cu aceast linie& (Acestea sunt alte dou ipoteze de la care este deri$at for"ula Iezier& 1n al patrulea r*nd! curbele Iezier sunt satisfctoare i din punct de $edere estetic& ]tiu c acesta este un criteriu subiecti$! dar nu este nu"ai prerea "ea& 1nainte de apariia siste"ului de operare Windows RH! trebuia s creai propriile curbe Iezier folosind funcia %ol&line. $e ase"enea! trebuia s cunoatei ur"toarele ecuaii para"etrice ale curbelor Iezier: x*t+ > *<-t+=x> ? =t*<-t+@x< U =t@*<-t+x@ U t=x= &*t+ 8 *<-t+=&> U =t*<-t+@&< ? =t@*<-t+&@ ? t=&= unde (x>1 &> este punctul de (nceput al curbei! (x=1 &= este punctul de sf*rit al curbei! iar cele dou puncte de control sunt ( x<1 &< i (x@1 &@ & 7urba este trasat pentru t a$*nd $alori de la G la D&
;R

1n Windows RH nu "ai este ne$oie s tii aceste for"ule& -entru trasarea uneia sau a "ai "ultor curbe Iezier cone2e! putei s folosii instruciunea:
-ol,Iezier (hdc! pt! i7ount C

sau instruciunea:
-ol,Iezier'o (hide! pt! i7ount C

1n a"bele cazuri! !t este o "atrice de structuri -5I3'& -entru funcia %ol&'e,ier pri"ele patru puncte specific (An aceast ordine punctul de (nceput! pri"ul punct de control! al doilea punct de control i punctul final al curbei Iezier& Ur"toarele curbe Iezier au ne$oie doar de trei puncte! deoarece punctul de (nceput al ur"toarei curbe Iezier este punctul de sf*rit al pri"ei curbe! i aa "ai departe& -ara"etrul iCount reprezint nu"rul de puncte din "atrice! adic unu plus de trei ori nu"rul curbelor pe care $rei s le desenai& .uncia %ol&'e,ier#o folosete poziia curent ca punct de (nceput pentru pri"a curb Iezier& .iecare curb desenat are ne$oie doar de trei puncte& 8a returnarea funciei! poziia curent este punctul final al ulti"ei curbe desenate& Atenie: atunci c*nd trasai o serie de curbe Iezier conectate (ntre ele! legtura $a fi lin nu"ai dac al doilea punct de control al pri"ei curbe! punctul de sf*rit al pri"ei curbe (care este i punctul de (nceput al celei de-a doua curbe i pri"ul punct de control al celei de-a doua curbe sunt coliniare! adic se afl pe aceeai linie dreapt& S#rcin# lucrrii: Scriei un progra"i care afiaz curba Iezier! utiliz*nd funciile G4I standarde i o curb Iezier! afiat dup calcule prin for"ule& n!re,ri de control: D& -entru ce se utilizeaz curbele IezierS ;& 7*te puncte sunt necesare pentru a afia o curb IezierS =& 7are sunt "etodele de afiare a curbelor IezierS F& 7are sunt caracteristicile curbelor IezierS

=G

LUCRARE DE LABORATOR NR. 4

TEMA: -rincipiile de lucru cu tastatura Scopul lucrrii: de a studia "etodele i principiile de lucru cu tastatura& 1nsuirea "odului de prelucrare a "esa0elor par$enite de la tastatura& Noiuni teoretice Arhitectura bazat pe "esa0e a siste"ului de operare Windows este ideal pentru lucrul cu tastatur& -rogra"ul #afl% despre apsarea unor taste prin inter"ediul "esa0elor care a0ung la procedura de fereastr& 4e fapt! lucrurile sunt puin "ai co"plicate: atunci c*nd utilizatorul apas i elibereaz tastele! dri$erul de tastatur trans"ite siste"ului de operare infor"aiile legate de aciunile asupra tastelor& Windows sal$eaz aceste aciuni (sub for" de "esa0e (n coada de ateptare a siste"ului& /esa0ele de la tastatur sunt apoi transferate! unul c*te unul! (n coada de "esa0e a progra"ului cruia (i aparine fereastra ce deine #cursorul de intrare% (despre care $o" discuta i"ediat & -rogra"ul distribuie "esa0ele procedurii de fereastr corespunztoare& /oti$ul acestui proces (n dou etape - stocarea "esa0elor "ai (nt*i (n coada de "esa0e a siste"ului i apoi transferarea acestora (n coada de "esa0e a aplicaiilor - este legat de sincronizare& Atunci c*nd utilizatorul apas pe taste (ntr-un rit" "ai rapid dec*t cel (n care progra"ul prelucreaz "esa0ele pri"ite! Windows stocheaz aciunile neprelucrate (n coada de ateptare a siste"ului! deoarece una dintre aciunile asupra tastaturii poate a$ea ca efect co"utarea cursorului de intrare (input focus ctre un alt progra"& 1n consecin! ur"toarele taste trebuie trans"ise celui de-al doilea progra"& 4ei tastatura este principala surs de intrri de la utilizatori a unui progra" pentru Windows! progra"ele nu trebuie s reacioneze la toate "esa0ele pe care le pri"ete de la tastatur& /ulte funcii ale tastaturii sunt tratate chiar de Windows& 4e
=D

e2e"plu! putei s ignorai apsrile de taste legate de funcii siste"& Acestea sunt! (n general! co"binaii cu tasta Alt& -rogra"ul nu este obligat s "onitorizeze aceste taste! deoarece Windows (i co"unic efectul acestora& ('otui! dac este ne$oie! progra"ul poate face i acest lucru& 4e e2e"plu! dac utilizatorul selecteaz un articol dintr-un "eniu cu a0utorul tastaturii& Windows tri"ite progra"ului un "esa0 prin care (i co"unic articolul de "eniu selectat! indiferent dac utilizatorul a folosit "ouse-ul sau tastatura& Unele progra"e pentru Windows folosesc #acceleratori% (sau #taste de accelerare% pentru opiunile de "eniu folosite "ai frec$ent& Acceleratorii sunt! de obicei! co"binaii de taste funcionale - sau alte taste corespunztoare unor caractere - cu tasta 7trl& 'astele de accelerare sunt definite (n fiierul de resurse al progra"ului& 'astatura trebuie s fie parta0at de toate aplicaiile rulate si"ultan sub Windows& Unele aplicaii pot a$ea "ai "ulte ferestre! iar tastatura trebuie s fie parta0at de toate ferestrele din cadrul aceleiai aplicaii& Atunci c*nd este apsat o tast! o singur fereastr trebuie s pri"easc "esa0ul pri$ind apsarea tastei respecti$e& .ereastra care pri"ete acest "esa0 este fereastra care deine #cursorul de intrare% (#input focus% & 4ac fereastra acti$ a fost redus la o pictogra"! atunci nici o fereastr nu deine cursorul de intrare& Windows continu s tri"it progra"ului "esa0e de la tastatur! dar acestea sunt tri"ise (ntr-o alt for" dec*t "esa0ele tri"ise unei ferestre acti$e nor"ale& 5 procedur de fereastr poate s afle c*nd are cursorul de intrare prin interceptarea "esa0elor W/?S)'.57US i W/?QI88.57US& /esa0ul W/?S)'.57US indic faptul c fereastra pri"ete cursorul de intrare (input focus ! iar "esa0ul W/?QI88.57US indic faptul c fereastra pierde cursorul de intrare& Atunci c*nd apsai o tast! Windows insereaz (n coada de ateptare a ferestrei care deine cursorul de intrare un "esa0 W/?Q)+45W3 sau un "esa0 W/?S+SQ)+45W3& Atunci
=;

c*nd eliberai fasta! Windows insereaz (n coada de ateptare a ferestrei un "esa0 W/?Q)+U- sau un "esa0 W/?S+SQ)+U-&
#ast5 obi4nuit5 #ast5 de sisteT#"t# # fo"t #p"#t W/?Q)+45W3 W/?S+SQ)+45W3 T#"t# # fo"t eli,er#t W/?Q)+UW/?S+SQ)+U-

4e obicei! "esa0ele de apsare i de eliberare a tastei sunt tri"ise (n pereche& 'otui! dac inei apsat o tast pan c*nd aceasta se autorepet! Windows tri"ite procedurii de fereastr o serie de "esa0e W/?Q)+45W3 (sau W/?S+SQ)+45W3 i un singur "esa0 W/?Q)+U- sau (W/?S+SQ)+U- dup eliberarea tastei& 7a toate "esa0ele tri"ise prin coada de ateptare! "esa0ele pentru acionri de taste conin infor"aii de ti"p& -utei s obinei "o"entul relati$ (n care a fost apsat sau eliberat o tast apel*nd funcia Get"essage#i-e. T#"te o,i$nuite $i t#"te de "i"te% -articula #S+S% din "esa0ele W/?S+SQ)+45W3 i W/?S+SQ)+U- pro$in de la cu$*ntul #s,ste"% i se refer la acionrile de taste care prezint "ai "ult i"portan pentru Windows dec*t pentru aplicaiile Windows& /esa0ele W/?S+SQ)+45W3 i W/?S+SQ)+U- sunt generate! de obicei! pentru taste apsate (n co"binaie cu tasta Alt& Aceste acionari de taste apeleaz opiuni din "eniul progra"ului ori din "eniul siste"! sunt folosite pentru funcii ale siste"ului! cu" ar fi co"utarea ferestrei acti$e (AltU'ab sau AltU)sc sau sunt folosite pentru acceleratori de "eniu (Alt (n co"binaie cu o tast funcional & 4e obicei! progra"ul ignor "esa0ele W/?S+SQ)+45W3 i W/?S+SQ)+U- i le retrans"ite funciei $e)Window%roc. 4eoarece Windows "anipuleaz co"binaiile AltUtast! nu este ne$oie s interceptai aceste "esa0e& -rocedura de fereastr $a pri"i alte "esa0e! legate de rezultatul acestor acionri de taste (cu" ar fi selectarea unei opiuni de "eniu & 7hiar dac dorii s includei (n progra" codul pentru interceptarea acestor "esa0e (aa cu" $o" face (n progra"ul Q)+857Q din acest capitol ! retrans"itei "esa0ele
==

funciei $e)Window%roc dup ce le prelucrai! astfel (nc*t Windows s le poat folosi (n scopurile obinuite& /esa0ele W/?Q)+45W3 i W/?Q)+U- sunt generate! de obicei! pentru tastele apsate i eliberate fr tasta Alt& -rogra"ul poate s foloseasc sau s ignore aceste "esa0e& Siste"ul de operare le ignor& -entru toate "esa0ele legate de acionrile de taste $ariabila l%ara- (pe =; de bii5 trans"is procedurii de fereastr este ("prit (n ase c*"puri: contorul de repetare6 codul de scanare 5)/! indicatorul flag pentru taste e2tinse! codul de conte2t! starea anterioar a tastei i starea de tranziie& 7ontorul de repetare (@epeat 7ount specific nu"rul de acionari de taste reprezentat de un "esa0& 1n "a0oritatea cazurilor! contorul de repetare are $aloarea D& 'otui! dac procedura de fereastr nu reuete s prelucreze "esa0ele de apsare a unei taste (n rit"ul de autorepetare ((n "od prestabilit apro2i"ati$ DG caractere pe secund & Windows co"bin "ai "ulte "esa0e W/?Q)+45W3 sau W/?S+SQ)+45W3 (ntr-un singur "esa0 i incre"enteaz corespunztor contorul de repetare& 7ontorul de repetare are (ntotdeauna $aloarea D pentru "esa0ele W/?Q)+U- i W/?S+SQ)+U-& 7odul de scanare 5)/ (5)/ Scan 7ode este codul de scanare al tastaturii! generat de co"ponentele hardware& (4ac ai scris progra"e (n li"ba0 de asa"blare! acest cod este identic cu cel trans"is (n registrul A6! (n ti"pul (ntreruperii apelului II5S DL6& 1n general! aplicaiile Windows ignor acest cod! deoarece e2ist "etode "ai bune de decodificare a infor"aiilor de la tastatur& Indicatorul flag pentru taste e2tinse ()2tended Qe, .lag are $aloarea D dac "esa0ul este generat de una dintre tastele supli"entare de pe tastatura II/ e2tins& ('astatura II/ e2tins are tastele funcionale (n partea de sus i un bloc separat sau co"binat de taste pentru tastele de deplasare i tastele nu"erice& Acest indicator are $aloarea D pentru tastele Alt i 7trl din partea dreapt a tastaturii! pentru tastele de deplasare (inclusi$ tastele Insert i 4elete care nu fac parte din blocul de taste nu"erice! pentru tastele Slash (K i )nter din blocul de taste nu"erice i
=F

pentru tasta 3u" 8oc9& 1n general! progra"ele Windows ignor acest indicator& 7odul de conte2t (7onte2t 7ode are $aloarea D dac este apsat tasta Alt& Acest bit $a a$ea (ntotdeauna $aloarea D pentru "esa0ele W/?S+SQ)+U- i W/?S+SQ)+45W3 i $aloarea G pentru "esa0ele W/?Q)+U- si W/?Q)+45W3! cu dou e2cepii: D& 5 fereastr acti$ redus la o pictogra" nu deine cursorul de intrare& 'oate acionrile de taste genereaz "esa0e W/?S+SQ)+U- i W/?S+SQ)+45W3& 4ac tasta Alt nu este apsat! bitul pentru codul de conte2t are $aloarea G& (Windows folosete aceste "esa0e astfel (nc*t fereastra acti$ redus la o pictogra" s nu prelucreze "esa0ele de la tastatur& ;& 1n cazul folosirii unui dri$er de tastatur pentru alte li"bi dec*t li"ba englez! unele caractere sunt generate prin co"binarea tastelor Shift! 7trl sau Alt cu alte taste& 1n aceast situaie! bitul pentru codul de conte2t din $ariabila I-ara" care (nsoete "esa0ele W/?Q)+U- i W/?Q)+45W3 are $aloarea D! dar "esa0ele nu reprezint acionri de taste de siste"& Starea anterioar a tastei (-re$ious Qe, State are $aloarea G dac tasta nu a fost anterior apsat! i $aloarea D dac tasta a fost apsat& Are (ntotdeauna $aloarea D pentru "esa0ele W/?Q)+Ui W/?S+SQ)+U-! dar poate fi G sau D pentru "esa0ele W/?Q)+45W3 i W/?S+SQ)+45W3& Baloarea D indic faptul c s-a pri"it un "esa0 generat de autorepetarea unei taste& Starea de tranziie ('ransition State are $aloarea G dac tasta este apsat i $aloarea D dac tasta este eliberat& Acest bit are $aloarea D pentru "esa0ele W/?Q)+U- si W/?S+SQ)+U- si $aloarea G pentru "esa0ele W/?Q)+45W3 i W/?S+SQ)+45W3& Coduri 0irtu#le de t#"te 4ei unele infor"aii din para"etrul l-ara" pot fi utile pentru prelucrarea "esa0elor W/?Q)+U-! W/?S+SQ)+U-! W/?Q)+45W3 i W/?S+SQ)+45W3! para"etrul w-ara"
=H

este "ult "ai i"portant& Acest para"etru conine codul $irtual care identific tasta apsat sau eliberat& 7odurile $irtuale pe care le $ei folosi cel "ai des au nu"e definite (n fiierele antet din Windows& -ara"etrii l%ara- i w%ara- care (nsoesc "esa0ele W/?Q)+U-! W/?S+SQ)+U-! W/?Q)+45W3 i W/?S+SQ)+45W3 nu spun ni"ic progra"ului despre starea tastelor de "odificare& -utei s obinei starea oricrei taste $irtuale folosind funcia GetBe&State. Aceast funcie este folosit! de obicei! pentru obinerea strii tastelor de "odificare (Shift! Alt i 7trl i a tastelor de co"utare (7aps 8oc9! 3u" 8oc9 i Scroll 8oc9 & 4e e2e"plu:
GetQe,State (BQ?S6I.' C

returneaz o $aloare negati$ (adic un nu"r (n care pri"ul bit are $aloarea D dac tasta Shift este apsat& Baloarea returnat de apelul:
GetQe,State (BQ?7A-I'A8 C

are un D (n bitul cel "ai puin se"nificati$ dac tasta 7aps 8oc9 este acti$& 4ac (ntr-ade$r a$ei ne$oie de starea curent a unei taste! putei s folosii funcia Get.s&ncBe&State. Utili/#re# %e"#&elor de #cion#re # t#"telor Ideea unui progra" care s obin infor"aii despre toate aciunile e2ercitate asupra tastelor este bun& 7u toate acestea! "a0oritatea progra"elor Windows ignor cea "ai "are parte a acestor "esa0e& /esa0ele W/?S+SQ)+Ui W/?S+SQ)+45W3 sunt folosite pentru funciile siste"ului! aa c nu este ne$oie s le interceptai& 4e ase"enea! dac prelucrai "esa0ele W/?Q)+45W3! de obicei putei s ignorai "esa0ele W/?Q)+U-& 1n general! progra"ele pentru Windows folosesc "esa0ele W/?Q)+45W3 pentru tastele care nu genereaz caractere& 4ei s-ar putea s $ $in ideea s folosii "esa0ele pentru acionri de taste (n co"binaie cu infor"aiile despre tastele de "odificare (furnizate de funcia GetBe&State+ ca s transfor"ai "esa0ele pentru acionri de taste (n "esa0e pentru caractere! nu facei acest lucru& Bei a$ea proble"e datorit diferenelor (ntre tastaturile
=L

internaionale& 4e e2e"plu! dac pri"ii un "esa0 W/?Q)+45W3 pentru care para"etrul w%ara- are $aloarea ==6! tii c utilizatorul a apsat tasta =& -*n aici totul este bine& 4ac apelai funcia GetBe&State $ei afla c tasta Shift este apsat i s-ar putea s presupunei c utilizatorul a introdus un caracter diez *C+1 lucru care poate s nu fie ade$rat& Un utilizator britanic ar fi introdus caracterul ^& /esa0ele W/?Q)+45W3 sunt utile pentru tastele de deplasare! tastele funcionale i tastele speciale! precu" Insert! 4elete& Uneori tastele Insert! 4elete si tastele funcionale sunt folosite ca acceleratori pentru co"enzi de "eniu& 4eoarece Windows transfor" acceleratorii (n co"enzi de "eniu! nu este ne$oie s prelucrai (n progra" "esa0ele pentru acionarea tastelor de accelerare& Unele progra"e non-Windows folosesc foarte des tastele funcionale (n co"binaie cu tastele Alt! 7trl i Shift& -utei face acest lucru i (n progra"ele pentru Windows! dar nu este reco"andat& 4ac $rei s folosii tastele funcionale! acestea trebuie s dubleze co"enzi din "eniuri& Unul dintre obiecti$ele siste"ului de operare Windows este s nu oblige utilizatorii s "e"oreze sau s foloseasc liste co"plicate de co"enzi& A" reuit s eli"in" aproape totul! cu e2cepia unui singur lucru: de cele "ai "ulte ori $ei prelucra "esa0ele W/?Q)+45W3 nu"ai pentru tastele de deplasare a cursorului& Atunci c*nd prelucrai "esa0ele tri"ise de tastele de deplasare putei s $erificai i starea tastelor Shift i 7trl! folosind funcia GetBe&State. Unele funcii Windows folosesc de "ulte ori tastele de deplasare (n co"binaie cu tasta Shift pentru e2tinderea unei selecii - de e2e"plu (ntr-un procesor de te2te& 'asta 7trl este folosit deseori pentru a schi"ba se"nificaia unei taste de deplasare& 4e e2e"plu! tasta 7trl (n co"binaie cu sgeata spre dreapta "ut cursorul cu un cu$*nt Ia dreapta& A" discutat "ai de$re"e despre ideea transfor"rii "esa0elor generate de aciona rea tastelor (n "esa0e caracter in*nd cont de starea tastelor de "odificare i $-a" a$ertizat c acest lucru nu este suficient: trebuie s inei sea"a i de configuraia diferit a tastaturii de la o ar la alta& 4in acest "oti$! nu trebuie s (ncercai s transfor"ai du"nea$oastr "esa0ele generate de
=M

acionarea tastelor (n "esa0e caracter& Windows o poate face (n locul du"nea$oastr& Ai "ai $zut aceast sec$en de cod:
while (Get/essage (J"sg! 3U88! G! G O 'ranslate/essage (J"sg C 4ispatch/essage (J"sg C P

Acesta este un ciclu tipic de tratare a "esa0elor din funcia Win"ain& .uncia Get"essage preia ur"torul "esa0 din coada de ateptare i co"pleteaz c*"purile structurii -sg. .uncia $is!atch"essage trans"ite "esa0ul procedurii de fereastr corespunztoare& 1ntre cele dou funcii este apelat funcia #ranslate"essage1 care transfor" "esa0ele generate de acionarea tastelor (n "esa0e caracter& 4ac "esa0ul este W/?Q)+45W3 sau W/?S+SQ)+45W3 i dac tasta apsat! (n funcie de starea tastelor de "odificare! genereaz un caracter! atunci funcia #ranslate"essage insereaz un "esa0 caracter (n coada de ateptare& Acesta $a fi ur"torul "esa0 pe care (l $a prelua funcia Get"essage dup "esa0ul generat de acionarea tastei& )2ist patru "esa0e caracter: C#r#ctere Caractere nonsisteCaractere sisteW/?76A@ W/?S+S76A@

Caractere moarte"
W/?4)A476A@ W/?S+S4)A476A@

/esa0ele W/?76A@ i W/?4)A476A@ sunt obinute din "esa0e W/?Q)+45W3& /esa0ele W/?S+S76A@ i W/?S+S4)A476A@ sunt obinute din "esa0e W/?S+SQ)+45W3& 1n "a0oritatea cazurilor progra"ul poate s ignore toate celelalte "esa0e (n afar de W/?76A@& -ara"etrul l%ara- trans"is procedurii de fereastr are acelai coninut ca i para"etrul l%ara- al "esa0ului generat de acionarea tastei din care a fost obinut "esa0ul caracter& -ara"etrul w%ara- conine codul AS7II al caracterului& 5 "etod cea "ai si"pl de a crea o interfa a tastaturii este utilizarea logicii prelucrrii "esa0elui W/?Q)+45W3 (n procedura
de fereastr& 4e e2e"plu: =N

... case W"DBEE$OW/0 switch*w%ara-+ F case GxH0 :: IJK LMNMOKK PQMRKSK GxH RPQTUMVOWX :: YZJMZYOUKP [MLLY\Y WYYZ]VLKX 6 ^VYZ_Y[K`aV YbVJMOYJa YZJMZYOPK 7 breakc ... d return >c ...

Acest frag"ent de progra" este ase"ntor cu sec$enele de cod pentru tratarea caracterelor dintr-un progra" /S-45S obinuit& S#rcin# lucrrii: de scris un progra" care (n zona client afiaz un desen! care poate fi "icat cu a0utorul tastelor _ (la st*nga ! `((n sus ! a(la dreapta ! b((n 0os & 4e ase"enea! trebuie s fie pre$zute taste pentru rotirea figurii& ntre,ri de control:

=R

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