Curs Win32

Published on May 2016 | Categories: Types, Instruction manuals | Downloads: 49 | Comments: 0 | Views: 795
of 65
Download PDF   Embed   Report

Comments

Content

Visual C++ Scurtă descriere
VisualC++ poate fi utilizat pentru a dezvolta programe pentru trei platforme Win32: Windows NT (pe procesoare multiple) Windows !"#!$ %& si Win32s' Windows NT este un () multifir (multit*readed ) pe 32 +iti cu mediu grafic integrat si posi+ilitati de server avansate' , fost dezvoltat pentru a ma-imiza porta+ilitatea sta+ilitatea si securitatea' (u+sistemul Win32s este un alt nivel pentru Windows 3'./ acesta implementeaza un su+set al sistemului Win32 care permite e-ecutia aplicatiilor pe 32 +iti'

Windows şi Mesajele
Windows este referit adesea ca un sistem de operare +azat pe mesa0e' 1iecare eveniment (apasarea unei taste clic de mouse etc') este transformat 2ntr3un mesa0' 4n mod o+i5nuit aplica6iile sunt construite 2n 0urul unei +ucle de mesa0e care reg7se5te aceste mesa0e 5i apeleaz7 func6ia potrivit7 pentru a trata mesa0ul' 8esa0ele de5i sunt trimise aplica6iilor nu se adreseaz7 acestora ci unei alte componente fundamentale a () fereastra (windows)' ) fereastra este mai mult dec9t o zon7 dreptung*iular7 afi5at7 pe ecran/ aceasta reprezint7 o entitate a+stract7 cu a0utorul c7reia utilizatorul 5i aplica6ia interac6ioneaz7 reciproc'

Aplicaţii, Fire şi Ferestre
) aplica6ie Win32 const7 din unul sau mai multe fire (t*reads) care sunt c7i paralele de e-ecu6ie' :9ndim firele ca fiind multats;ing3ul din cadrul unei aplica6ii' )+serva6ie: (u+ Win32s poate rula o aplica6ie cu un singur fir de e-ecu6ie' ) fereastr7 este totdeauna <gestionat7 de= un fir/ un fir poate fi proprietarul uneia sau mai multor ferestre sau pentru nici una' 4n final ferestrele sunt 2ntr3o rela6ie ierar*ic7/ unele sunt la nivelul cel mai de sus altele sunt su+ordonate p7rin6ilor lor sunt ferestre descendente'

&rocese fire 5i ferestre

>-ista mai multe tipuri de ferestre in Windows/ cele mai o+i5nuite sunt asociate cu o aplica6ie' ?o-ele de dialog din cadrul unei ferestre sunt de asemenea ferestre' ,cela5i lucru pentru +utoane controale de editatre list+o-3uri icoane etc'

Clase Window
Comportarea unei ferestre este definita de clasa fereastr7 ( window class). Clasa fereastră men6ine informa6ii despre modul de afi5are ini6ial icoana implicit7 cursor resursele meniu 5i cel mai important lucru adresa func6iei ata5at7 ferestrei @ procedura fereastră @ window procedure' C9nd o aplica6ie proceseaz7 mesa0e aceasta se face 2n mod o+i5nuit prin apelul func6iei Windows DispatchMessage pentru fiecare mesa0 primit/ Aispatc*8essage la r9ndul ei apeleaz7 procedura fereastr7 corespunz7toare identific9nd ini6ial c7rei ferestre 2i este trimis mesa0ul' Bn continuare procedura fereastr7 va trata mesa0ul' >-ist7 mai multe clase fereastr7 standard furnizate de Windows' ,ceste clase sistem globale implementeaz7 2n general func6ionalitatea controalelor comune' )rice aplica6ie poate folosi aceste controale de e-emplu orice aplica6ie poate implementa controale de editare utiliz9nd clasa fereastra >dit' ,plica6iile pot de asemeni s735i defineasc7 propriile clase fereastr7 cu a0utorul func6iei RegisterClass' ,cest lucru se 2nt9mpl7 2n mod o+i5nuit pentru fereastra principal7 a aplica6iei (icoana resurse etc')' Windows permite de asemeni subclasarea sau superclasarea unei ferestre e-istente' Subclasarea su+stituie procedura fereastr7 pentru o clas7 ferestr7 cu o alt7 procedur7' (u+clasarea se realizeaz7 prin sc*im+area adresei procedurii fereastr7 cu a0utorul func6iei SetWindowLong (instance su+classing) sau SetClassLong (su+clasare glo+al7)' 4nstance su+classing @ 2nseamn7 c7 se sc*im+7 numai comportarea ferestrei specificate' :lo+al su+classing @ 2nseamn7 c7 se sc*im+7 comportarea tuturor ferestrelor de tipul specificat' Obser aţie! :lo+al su+classing se comport7 diferit in Win32 5i 2n Windows pe .C +i6i (Win32s)' 4n cazul Win32 aceasta afecteaz7 numai fereastra care este su+ controlul aplica6iei ce face su+clasarea/ 2n windows pe .C +i6i efectul este glo+al se afecteaz7 ferestrele fiec7rei aplica6ii' Superclasarea creaz7 o nou7 clas7 +azat7 pe o clas7 e-istent7 re6in9nd numai procedura fereastr7' &entru a superclasa o clas7 fereastr7 o aplica6ie reg7se5te informa6iile despre clasa fereastr7 utiliz9nd func6ia GetClassInfo modific7 structura WNDCLASS astfel recep6ionat7 5i folose5te structura modificat7 2ntr3un apel al func6iei RegisterClass' :etClass4nfo 2ntoarce de asemenea 5i adresa procedurii fereastr7' 8esa0ele pe care noua fereastr7 nu le trateaz7 tre+uie trecute acestei proceduri'

"ipuri de #esaje
8esa0ele reprezint7 2n fapt evenimente la diferite nivele ale aplica6iei' >-ist7 o clasificare a acestor mesa0e (din p7cate nu prea e-act7): #esaje fereastră #esaje de notificare 5i #esaje de co#andă dar deocamdat7 nu ne intereseaz7 acest lucru' 8esa0ele windows constau din mai multe p7r6i descrise de structura 8(:' typedef struct tagMSG { HWND hwnd; UINT essage; W!A"AM w!ara ; L!A"AM #!ara ; DW$"D t% e; !$INT pt; & MSG; Aescriere:

$wnd identific7 2n mod unic fereastra la care a fost transmis acest mesa0' 1iecare fereastr7 2n Windows are un asemenea identificator' #essa%e reprezint7 identificatorul mesa0ului' 4dentificatorii mesa0ului sunt referi6i 2n mod o+i5nuit cu a0utorul constantelor sim+olice dec9t prin valoarea lor numeric7 care o au 2n sistem' ,ceast7 descriere se g7se5te 2n windows'*' Drm7toarele elemente pot fi privite ca parametrii ai mesa0ului care au valori specifice func6ie de fiecare mesa0 2n parte' 8area ma0oritate a mesa0elor 2ncep cu W8E' Ae e-emplu W8EF?DTT)NA)WN W8E8)D(>8)V> W8EF?DTT)ND& etc' ,plica6iile pot s735i defineasc7 propriile mesa0e' Cerin6a ma0or7 este ca identificatorul mesa0ului s7 fie unic' &entru a defini un mesa0 2n sistem folosim func6ia RegisterWindowMessage.

Mesaje şi #ultitas&in%
4n Windows 3'. +ucla de mesa0e are rol important 2n interac6iunea dintre aplica6ii 5i ()' 1unc6ionarea corect7 a unui () Windows 3'. depinde de cooperarea dintre aplica6ii' ,plica6iile sunt cele care permit () s7 preia controlul' ,cest nea0uns este 2nl7turat 2n Windows !"#!$ NT 2GGG' () este cel care realizeaz7 programarea aplica6iilor pentru cuantele de timp necesare pe procesor' Ae5i aceast7 planificare a e-ecu6iei este diferit7 pe Windows !"#!$ fa67 de NT rolul primordial revine ()'

Co'i de #esaje
Bn Windows pe .C +i6i () men6ine o singur7 coad7 de mesa0e' C9nd o aplica6ie 2ncearc7 s7 g7seasc7 urm7torul mesa0 din coada de mesa0e prin func6iile GetMessage sau PeekMessage () poate efectua un conte-t switc* 5i poate activa o alt7 aplica6ie pentru care mesa0ele a5teapt7 2n coad7' 8esa0ul din v9rful cozii este e-tras 5i returnat aplica6iei via structura 8(:' Aac7 aplica6ia e5ueaz7 2n apelul lui GetMessage PeekMessage sau Yield aceasta +loc*eaz7 sistemul' Coada de mesa0e poate deveni plin7''' Bn Win32 (!"#!$ NT 2GGG) mecanismul cozii de mesa0e este mult mai complicat' ) singur7 coad7 de mesa0e nu mai rezolv7 pro+lema' ,ici sistemul de operare d7 controlul unei aplica6ii 5i tot () permite multitas;ing3ul' Aou7 sau mai multe fire pot accesa coada de mesa0e 2n acela5i timp 5i nu e-ist7 nici o garan6ie c7 mesa0ele e-trase sunt ale lor' Acesta este unul motivele pentru care coada de mesaje a fost separată în cozi de mesaje individuale pentru fiecare fir din sistem.

(rocese şi Fire
Într-un S non-multifir! de e"emplu #$%&! unitatea cea mai mică de e"ecu'ie este tas(-ul sau procesul ' 8ecanismul de planificare (apar6ine ()) al tas;3urilor va comuta 2ntre acestea/ multitas;ing3ul se realizeaz7 2ntre dou7 sau mai multe procese (tas;3uri)' Aac7 o aplica6ie are nevoie s7 e-ecute mai multe func6ii simultan atunci aceasta se va divide 2n mai multe tas;3uri' Ain aceast7 te*nic7 decurg anumite nea0unsuri consum de resurse timp de lansare a unui nou tas; spa6ii de adrese diferite pro+leme de sincronizare etc' În contrast! într-un sistem multifir )multifilar! multit*readed) unitatea cea mai mică de e"ecu'ie este firul! nu procesul. Dn proces sau tas; poate con6ine mai multe fire dintre care unul singur este firul principal firul primar' Fansarea 2n e-ecu6ie a unui nou fir cere mai pu6ine resurse din partea () firul ruleaz7 2n cadrul aceluia5i proces pro+lemele de sincronizare sunt 5i nu sunt complicate' ricum apar două sincronizări+ sincronizare între procese ,i sincronizare între fire.

Fire şi Mesaje
Aup7 cum am mai spus proprietarul ferestrei este firul de e-ecu6ie' 1iecare fir are coada proprie privat7 de mesa0e 2n care () depoziteaz7 mesa0ele adresate ferestrei' ,ceasta nu 2nseamn7 c7 un fir tre+uie neap7rat s7 ai+7 o fereastr7 proprie 5i o coad7 proprie de mesa0e' -ot e"ista fire ,i fără fereastră ,i fără buclă de mesaje. Bn 81C aceste fire se numesc wor&er t$reads (nu au ata5at7 o fereastr7 nu prezint7 interfa67 c7tre utilizator) iar celelalte se numesc user)interface t$reads'

Apeluri de funcţii Windows
Windows ofer7 un mare num7r de func6ii pentru a e-ecuta o mare varietate de tas;3uri controlul proceselor gestionarea ferestrelor fi5ierelor memoriei servicii grafice comunica6ii etc' ,pelurile sistem pot fi organizate 2n trei categorii: .' servicii nucleu (apeluri sistem pentru controlul proceselor firelor gestiunea memoriei etc')/ 2' servicii utilizator (gestiunea elementelor de interfa67 ale utilizatorului cum ar fi ferestre controale dialoguri etc')/ 3' servicii ./% (:rap*ics Aevice 4nterface) (ie5irea grafic7 independent7 de dispozitiv)' (istemul Windows include de asemenea func6ii ,&4 pentru alte func6ionalit76i @ 8,&4 (8essaging ,&4) T,&4 (Telep*onH ,&4) sau )A?C ()pen Aata+ase ConnectivitH)'

Ser icii *ucleu
(erviciile nucleu cuprind de o+icei: %etionarea fişierelor, #e#oriei, proceselor, firelor, resurselor' +estionarea fişierelor nu ar tre+ui s7 se mai fac7 cu func6ii din +i+liotecile C sau prin iostream3urile din C++' ,plica6iile ar tre+ui s7 utilizeze conceptul Win32 de o+iect fisier @ file object @ 5i func6iile asociate cu acesta' Ae e-emplu e-ist7 fi5iere mapate 2n memorie care asigura comunicarea 2ntre tas;3uri' Ieferitor la %estionarea #e#oriei pe l9ng7 func6iile cunoscute () Windows ofer7 func6ii care pot manipula spa6ii de adrese de sute de 8? aloc9ndu3le dar nef7c9nd commiting' Cea mai important7 fa6et7 a proceselor şi firelor este %estiunea sincroni'ării' &ro+lema este complet nou7 5i nu a fost 2nt9lnit7 2n Windows 3'.' Bn Win32 sincronizarea se face cu a0utorul unor o+iecte de sincronizare pe care firele le pot utiliza pentru a informa alte fire despre starea lor de a prote0a zone senzitive de cod sau de a o+tine informatii despre alte fire sau starea altor o+iecte' 4n Win32 multe resurse nucleu sunt reprezentate ca obiecte @ o+iecte nucleu: fi5iere fire procese o+iecte de sincronizare etc' )+iectele sunt referite prin #anipulatori identificatori ($andlers)/ e-ist7 func6ii pentru manipularea generic7 a o+iectelor pentru manipularea o+iectelor de un anumit tip , Sub *", obiectele au ataşate proprietăţi de securitate' Ae e-emplu un fir nu poate accesa un o+iect fi5ier dac7 nu are drepturile necesare care s7 coincid7 cu propriet76ile de securitate' 8odulul nucleu furnizezz7 de asemeni func6ii pentru %estionarea resurselor interfaţă)utili'ator' ,ceste resurse includ icoane cursoare 5a+loane de dialog resurse string ta+ele de acceleratori +itmap3uri etc' Nucleul NT furnizeaz7 printre altele: atri+ute de securitate pentru o+iectele nucleu +ac;up func6ionalitatea aplica6iilor de tip consol7 care pot utiliza func6ii pentru memoria virtual7 sau pot utiliza mai multe fire de e-ecu6ie'

Ser icii utili'ator
8odulul utilizator furnizeaz7 apeluri sistem care %estionea'ă aspecte şi ele#ente ale interfeţei utili'atorului- sunt incluse func6ii care manipuleaz7 ferestre dialoguri meniuri controale clip+oard etc' (e e-emplific7 tipurile de opera6ii pentru fiecare resurs7 2n parte (2n general creare modificare 5tergere mutare redimensionare etc')'

8odulul utilizator furnizeaz7 func6ii pentru #ana%e#entul #esajelor şi co'ilor de #esaje ' ,plica6iile pot utiliza aceste apeluri pentru a controla con6inutul cozii de mesa0e proprii a reg7si 5i a procesa mesa0ele a crea noi mesa0e' Noile mesa0e pot fi trimise (sent) sau plasate (posted) la orice fereastr7' Dn mesa0 plasat pentru o fereastr7 @ func6ia PostMessage 3 2nseamn7 pur 5i simplu intrarea acestuia 2n coada de mesa0e nu 5i procesarea imediat7 a acestuia' Trimiterea unui mesa0 (sent) implic7 tratarea lui imediat7 sau mai corect spus func6ia SendMessage nu35i termin7 e-ecu6ia p2n7 c9nd mesa0ul nu a fost tratat'

Ser icii +./
1unc6iile din :A4 sunt utilizate 2n mod o+i5nuit pentru a e-ecuta opera6ii grafice primitive independente de dispozitiv pe conte-te de dispozitiv' Dn conte-t de dispozitiv este o interfa67 la un periferic grafic specific (2n fapt este o structur7 de date p7strat7 2n memorie)' Conte0tul de dispo'iti poate fi utili'at pentru a obţine infor#aţii despre periferic şi pentru a e0ecuta ieşirile %rafice pe acest periferic ' 4nforma6iile care pot fi o+6inute printr3un conte-t de dispozitiv descriu 2n detaliu acest periferic' /eşirea %rafică este e0ecutată printr)un conte0t de dispo'iti prin pasarea 1trecerea2 unui #anipulator 1identificator2 al conte0tului de dispo'iti funcţiilor %rafice din +./ ' Conte-tele de dispozitiv pot descrie o varietate mare de periferice' Conte-tele de dispozitiv o+i5nuite includ: conte-te de dispozitiv displaH conte-te de dispozitiv memorie (pentru ie5irea unui +itmap memorat 2n memorie) sau conte-te de dispozitiv printer' Dn conte-t de dispozitiv foarte special este conte-tul de dispozitiv metafile care permite aplica6iilor de a 2nregistra permanent apelurile din :A4 (fi5ierul p7streaz7 o serie de primitive grafice) care sunt independente de dispozitiv' 8etafi5ierele 0oac7 un rol crucial 2n reperzentarea independent7 de dispozitiv a o+iectelor )F> 2nglo+ate' Desenarea într-un context de dispozitiv se face cu ajutorul coordonatelor logice . Coordonatele logice descriu o+iectele utiliz9nd m7sur7tori reale independente de dispozitiv de e-emplu un dreptung*i poate fi descris ca fiind lat de 2 inc* 5i 2nalt de . inc*' +./ furni'ea'ă funcţionalitatea necesară pentru #aparea coordonatelor lo%ice 3n coordonate fi'ice, Aiferen6e semnificative e-ist7 2n modul cum aceast7 mapare are loc 2n Win32s Windows !" 5i Windows NT' Win45s şi Windows 67 folosesc repre'entarea coordonatelor pe 89 biti, Windows *" poate #anipula coordonate pe 45 biţi, Toatre cele trei sisteme suport7 map7ri (transform7ri) din coordonate logice 2n coordonate fizice' ,ceste transform7ri sunt determinate (influen6ate) de valorile ce specific7 originea coordonatelor 5i (signed e-tent) e-tensia cu semn a spa6iului logic 5i al celui fizic' )riginea coordonatelor specific7 deplasarea pe orizontal7 5i vertical7 iar e-tensia (e-tent) determina orientarea 5i scara o+iectelor dup7 mapare (transformare)' Bn plus Windows NT ofer7 ceea ce se nume5te world transformation functions. &rin aceste func6ii orice transformare liniar7 poate fi folosit7 pentru transformarea spa6iului de coordonate logice 2n spa6iul de coordonate fizice/ 2n plus pentru transla6ii 5i scalare ie5irile pot fi rotite sau s*eared' >-emple de func6ii grafice: Iectangle >llipse &olHgon Te-t)ut etc' ,lte func6ii de interes deose+it ( bit blit functions+ PatBlt, BitBlt, StechBlt) sunt cele legate de desenarea 5i copierea +itmap3urilor' Conte0tele de dispo'iti pot fi create şi distruse, starea lor poate fi sal ată şi re3ncărcată, Dn alt grup de func6ii gestioneaz7 transform7rile de coordonate' 1unc6ii comune tuturor platformelor pot fi utilizate pentru a seta sau reg7si originea 5i e-tent3ul unei ferestre (spa6iul de coordonate logic) 5i viewport3ului (spa6iul de coordonate al perifericului destina6ie)' NT posed7 func6ii specifice pentru transform7ri matriceale' 1unc6iile :A4 pot fi folosite de asemenea pentru gestionarea paletelor aceasta 2nseamn7 c7 prin gestionarea paletei de culori aplica6iile pot selecta o mul6ime de culori care se potrivesc cel mai +ine cu culorile din imaginea (gif pc-') care tre+uie afi5at7' :estionarea paletei poate fi utilizat7 5i 2n te*nici de anima6ie'

) alt7 tr7s7tur7 a :A43ului este crearea 5i gestionarea o+iectelor :A4 (pensoane peni6e fonturi +itmap3uri palete) precum 5i a regiunilor 5i a clipping3ului'

Alte A(/)uri
• • • • • • 0unc'ii pentru controale comune1 0unc'ii pentru dialoguri comune1 2A-% (8essaging ,pplications &rogramming 4nterface)/ 2C% (8ultimedia Control 4nterface)/ 34 A-%/ 5A-% (Telep*onH ,&4)'

:aportarea erorilor
8a0oritatea func6iilor Windows folosesc un mecanism pentru eviden6ierea erorilor' C9nd apare o eroare aceste func6ii seteaz7 o valoare a erorii pentru firul respectiv valoare care poate fi reg7sit7 cu func6ia GetLast!rror' Valoarile pe 32 +i6i returnate de aceast7 func6ie sunt definite in w%nerr'r(h sau 2n fi5ierul *eader al +i+liotecii specifice' Valoarea erorii poate fi setat7 5i din cadrul aplica6iei cu a0utorul func6iei SetLast!rror' Codurile de eroare tre+uie s7 ai+7 setat +itul 2!'

Folosirea funcţiilor din biblioteca C;C++
,plica6iile Win32 pot folosi setul standard al func6iilor din +i+lioteca C#C++ cu anumite restric6ii' ,plica6iile Windows nu au acces 2n mod normal la stream3urile stdin stdout stderr sau o+iectele iostream din C++' Numai aplica6iile consol7 pot utiliza aceste stream3uri' 1unc6iile relative la fi5iere pot fi folosite dar acestea nu suport7 toate facilit76ile oferite de () Windows @ securitate drepturi de acces' În locul func'iilor din familia e"ec se va folosi Create-rocess. Bn ceeea ce prive5te gestionarea memoriei se folosesc cu succes func6iile din C sau C++' 1unc6iile din +i+lioteca matematic7 pentru gestionarea stringurilor a +ufferelor a caracterelor a conversiilor de date pot fi de asemenea folosite' ,plica6iile Win32 nu tre+uie s7 foloseasc7 2ntreruperea 2. sau func6ii 4?8 &C ?4)('

Crearea unei aplicaţii Windows
VC++ nu compileaz7 numai cod ci 5i genereaz7 cod' &entru generarea unei aplica6ii se folose5te ,ppWizard' Bn primul r9nd aici se lucreaz7 cu proiecte' Dn proiect poate con6ine mai multe aplica6ii' &entru a crea un proiect vom folosi comenzile File)<*ew)<(rojects' Ain lista prezentat7 2n pagina (ta+3ul) &ro0ects vom selecta 20C App6izard )4&4) select7m locul unde va fi memorat pe JAA 5i apoi complet7m numele proiectului' Aup7 acest lucru va tre+ui s7 complet7m o serie de informa6ii grupate pe etape'

=tapa 8, "ip aplicaţie
Bn etapa 8 (pas .) vom selecta tipul aplica6iei (se alege interfa6a cu utilizatorul)' ,vem urm7toarele posi+ilit76i:

• • •

) aplica6ie single document interface ((A4) are numai un document desc*is la un moment dat' C9nd select7m 1ile3K)pen fi5ierul e-istent 5i care este desc*is va fi 2nc*is 2nainte ca s7 se desc*id7 noul document' ) aplica6ie multiple document interface (8A4) cum ar fi >-cel sau Word poate desc*ide mai multe documente odat7' Aac7 dorim vizualiz7ri multiple pentru un document va tre+ui s7 construim o aplica6ie 8A4' ) aplica6ie dialog-based cum ar fi utilitarul C*aracter 8ap' ,plica6iile nu au meniu'

O>S=:VA?/=!! ,plica6iile +azate pe dialog sunt diferite de cele de tip (A4 sau 8A4' Vor fi tratate 2n mod separat'
8ai e-ist7 un c*ec;+o- care ne d7 posi+ilitatea de a indica dac7 dorim suport pentru ar*itectura Aocument#View' )p6iunea se folose5te 2n special pentru portarea aplica6iilor dintr3un alt sistem de dezvoltare' Nu o vom folosi'

=tapa 5, >a'e de date
Bn aceast7 etap7 vom alege nivelul pentru suportul +azelor de date' >-ist7 patru posi+ilit76i: • &entru aplica6ii f7r7 +aze de date vom selecta *one' • Aac7 dorim s7 avem acces la +aze de date dar nu dorim s7 deriv7m vizualizarea din C)'r *%ew sau s7 nu avem meniu "ec'rd vom selecta @eader Files OnlA' • Aac7 dorim s7 deriv7m vizualizarea din C)'r *%ew 5i s7 avem meniul "ec'rd dar nu dorim s7 serializ7m documentul vom selecta .atabase View Wit$out File Support' • Aac7 dorim suport pentru +aze de date 5i 2n plus dorim 5i salvarea documentului vom selecta .atabase View Wit$ File Support' Aac7 select7m ultima op6iune va tre+ui s7 indic7m 52 sursa de date @ +utonul .ata Source'

=tapa 4, Suport pentru docu#ente co#puse
Te*nologia ,ctive% 5i )F> este referit7 ca fiind te*nologia documentului compus (compound document tec*nolog7). Bn aceast7 etap7 e-ist7 cinci posi+ilit76i: • Aac7 nu scriem o aplica6ie ,ctive% alegem *one' • Aac7 dorim o aplica6ie care s7 con6in7 o+iecte ,ctive% 2nglo+ate sau legate cum ar fi aplica6ia Word alegem Container' • Aac7 dorim ca aplica6ia noastr7 s7 furnizeze o+iecte care pot fi 2nglo+ate pentru alte aplica6ii dar aplica6ia s7 nu poat7 fi e-ecutat7 separat (stand alone) vom alege Mini Ser er' • Aac7 dorim ca aplica6ia noastr7 s7 furnizeze o+iecte care pot fi 2nglo+ate pentru alte aplica6ii 5i aplica6ia s7 poat7 fi e-ecutat7 separat (stand alone) vom alege Full Ser er' • Aac7 dorim ca aplica6ia s7 2ncorporeze op6iunile 3 5i L vom selecta >ot$ Container and Ser er' Aac7 alegem suport pentru documentele compuse vom avea 5i suport pentru fi5iere compuse ( compound files)' 1i5ierele compuse con6in unul sau mai multe o+iecte ,ctive% 5i sunt salvate 2ntr3un mod special astfel 2nc9t un o+iect poate fi modificat f7r7 a rescrie 2ntregul fi5ier' &entru acest lucru facem o selec6ie pe unul din +utoanele radio Bes, (lease sau *o, "$an& Bou' Tot 2n aceast7 pagin7 ne *ot7r9m dac7 aplica6ia suport7 automatizare sau va folosi controale ,ctive%'

O>S=:VA?/=! Aac7 dorim ca aplica6ia s7 fie un control ,ctive% nu tre+uie s7 cre7m o aplica6ie 'e-e o+i5nuit7' Crearea controlului ,ctive% se face select9nd o alt7 op6iune din &ro0ects'

=tapa C, Opţiuni pentru interfaţă, Alte Opţiuni
Drm7toarele op6iuni afecteaz7 modul de afi5are al interfe6ei: • /oc(ing 5oolbar' ,ppWizard preg7te5te un tool+ar' ,cesta poate fi editat (ad7ugare modificare 5tergere)' • %nitial Status 8ar' ,ppWizard creaz7 o +ar7 de stare care afi5eaz7 mesa0ele ata5ate comenzilor din meniu sau alte mesa0e specifice aplica6iei' • -rinting and -rint -review ' ,plica6ia va avea op6iunile &rint 5i &rint &review din meniul 1ile 5i o parte din codul necesar va fi generat de ,ppWizard' • Conte"t-Sensitive 9elp' 8eniul Jelp va avea op6iunile 4nde- 5i Dsing Jelp 5i o parte din codul necesar pentru a fi implementat Jelp va fi generat de ,ppWizard' ,ceast7 decizie este dificil de luat mai t9rziu pentru c7 p7r6i din cod sunt generate 2n diverse locuri din cadrul aplica6iei' • :/ Controls' ,plica6ia va ar7ta ca o aplica6ie o+i5nuit7 Windows !"' Aac7 nu select7m aceast7 op6iune +o-ele de dialog vor avea +ac;ground al+ 5i nu vor fi um+re 2n 0urul +o-elor de editare c*ec;+o-3urilor 5i alte controale' • 2A-%)2essaging A-%)' ,plica6ia va avea posi+ilitatea de trimite fa-3uri email3uri 5i alte mesa0e' • 6indows Soc(ets' ,plica6ia va putea accesa 4nternet3ul 2n mod direct folosind protocoale ca 1T& 5i JTT& (protocolul World Wide We+)' &utem seta de asemenea num7rul fi5ierelor din lista 8ID' 4mplicit acest num7r este L' ?utonul ,dvanced activeaz7 dou7 ta+3uri (Aocument Template (trings Window (tHles) unde putem sc*im+a numele aplica6iei titlul ferestrei cadru e-tensia fi5ierelor folosite 2n 1ile3K)pen etc' &rporpiet76ile care pot fi setate pentru ferestrele cadru: • 5*ic( 0rame' Aac7 nu o select7m se previne redimensionarea' • 2inimize 8o"' • 2a"imize 8o"' • S7stem 2enu' • 2inimized. Cadrul este minimizat c9nd aplica6ia este lansat7 2n e-ecu6ie' &entru aplica6iile (A4 aceast7 op6iune va fi ignorat7 c9nd aplica6ia ruleaz7 su+ Windows !"' • 2a"imized' T*e frame is ma-imized w*en t*e application starts' 1or (A4 applications t*is option will +e ignored w*en t*e application is running under Windows !"'

Alte Opţiuni
Aorim +i+lioteca 81C s7 fie <legat7= ca un AFF parta0a+il sau 2n mod staticM Dn AFF este o colec6ie de func6ii utilizate de diferite aplica6ii' 1olosirea AFF3urilor face ca programul s7 fie mai mic dar mai greu de instalat' Aac7 leg7tura este static7 cre5te m7rimea programului dar nu mai sunt pro+leme deose+ite cu instalarea'

=tapa 9, *u#ele fişierelor şi al claselor
Dltima etap7 sta+ile5te numele claselor 5i fi5ierelor create de ,ppWizard' &utem sc*im+a aceste nume' Aac7 aplica6ia include o clas7 pentru vizualizare care 2n mod o+i5nuit este derivat7 din CView putem sc*im+a clasa de +az7 de e-emplu C(collView sau C>ditView care ofer7 o func6ionalitate sporit7 vizualiz7rii' Vom ap7sa +utonul 1inis* pentru terminarea gener7rii aplica6iei'

Drmeaz7 e-emple de creare aplica6ii pentru fiecare tip 2n parte'

Crearea .DD)urilor, Aplicaţiilor de tip Consolă
,lte op6iuni ce se reg7sesc 2n ta+3ul &ro0ects: • ,TF C)8 ,ppWizard • Custom ,ppWizard • Aata+ase &ro0ect • Aev(tudio ,dd34n Wizard • >-tended (tored &rocedure ,ppWizard • 4(,&4 >-tension Wizard • 8a;efile • 81C ,ctive% ControlWizard • 81C ,ppWizard (dll) • DtilitH &ro0ect • Win32 ,pplication • Win32 Console ,pplication • Win32 AHnamic Fin; Fi+rarH • Win32 (tatic Fi+rarH

A"D COM AppWi'ard
,TF este ,ctive Template Fi+rarH 5i este utilizat7 pentru a scrie un mic control ,cite%'

Custo# AppWi'ard
(e folose5te 2n general pentru a crea noi proiecte din altele e-istente (se copie cod *elp etc')'

.atabase (roject
Aac7 avem instalat >nterprise >dition of Visual C++ putem crea un proiect de +aze de date'

.e Studio Add)/n Wi'ard
,dd3ins lucreaz7 e-act ca macro3urile care automatizeaz7 Aeveloper (tudio dar acestea sunt scrise 2n C++ sau alt lim+a0 de programare/ macro3urile sunt scrise 2n V?(cript' ,cestea folosesc automatizarea pentru a manipula Aeveloper (tudio'

/SA(/ =0tension Wi'ard
4(,&4 este pentru 4nternet (erver ,&4 5i se refer7 la func6ii pe care le putem apela pentru a interac6iona cu un server 8icrosoft 4nternet 4nformation (erver'

Ma&efile
Aac7 dorim s7 cre7m un proiect care este utilizat cu un alt utilitar ma;e diferit de Aeveloper (tudio vom selecta aceast7 op6iune' Nu se genereaz7 cod'

MFC Acti eE ControlWi'ard
Active& controls sunt controale pe care lescriem pentru a fi utilizate 2ntr3un dialog din VC++ o form7 din V? sau c*iar o pagin7 We+' ,ceste controale 2nlocuiesc controalele V?%'

MFC AppWi'ard 1.DD2
Aac7 dorim s7 colect7m un num7r de func6ii 2ntr3un AFF 5i aceste func6ii folosesc clase din 81C vom selecta aceast7 op6iune' Aac7 func6iile nu folosesc 81C alegem Win32 AHnamic Fin; Fi+rarH'

Win45 Application
(e creaz7 o aplica6ie o+i5nuit7 2n C++'

Win45 Console Application
) aplica6ie consol7 arat7 ca o aplica6ie o+i5nuit7 A)('

Win45 .Ana#ic Din& DibrarA
Aac7 dorim s7 colect7m un num7r de func6ii 2ntr3un AFF 5i aceste func6ii folosesc clase din 81C vom selecta aceast7 op6iune' Aac7 func6iile nu folosesc 81C alegem Win32 AHnamic Fin; Fi+rarH'

Win45 Static DibrarA
,plica6ia va 2ncorpora func6iile pe care folose5te dintr3un AFF'

>ucla de #esaje FascunsăG
+%nc#ude ,w%nd'ws(h%nt WINA!I W%nMa%n.HINSTANC/ d01 HINSTANC/ d21 L!ST" d31 %nt d45 { Message6'7.NULL1 8He##'1 W'r#d981 881 M6:$;5; & ?ucla de mesa0e 5i procedura fereastr7 sunt ascunse' Message6'7 afi5eaz7 o +o-7 de dialog care con6ine procedura fereastr7 5i deoarece +o-a de dialog este modal7 (nu poate fi p7r7sit7 f7r7 a se da clic pe ''') practic se cicleaz7 pe +ucla de mesa0e'

>ucla de #esaje e0istă
Dn program windows o+i5nuit 2n timpul ini6ializ7rii 2nregistreaz7 mai 2nt9i clasa fereastr7 apoi creaz7 fereastra principal7 utiliz9nd noua clas7 2nregistrat7' Bn e-emplul ce urmeaz7 folosim de0a clasa 2nregistrat7 ?DTT)N' +%nc#ude ,w%nd'ws(h%nt WINA!I W%nMa%n.HINSTANC/ hInstance1 HINSTANC/ d21 L!ST" d31 %nt d45 { MSG sg; HWND hwnd; hwnd < CreateW%nd'w.86UTT$N81 8He##'1 W'r#d981 WS:*ISI6L/ = 6S:C/NT/"1 0>>1 0>>1 0>>1 ?>1 NULL1 NULL1 hInstance1 NULL5; wh%#e .GetMessage.@ sg1 NULL1 >1 >55 { %f . sg( essage << WM:L6UTT$NU!5 { Destr'yW%nd'w.hwnd5; !'stAu%tMessage.>5; & D%spatchMessage.@ sg5;

& return &

sg(w!ara ;

>-plica6ii: Aup7 ce se creeaz7 fereastra programul intr7 2n +ucla wh%#e unde se apeleaz7 GetMessage' C9nd aplica6ia prime5te un mesa0 GetMessage 2ntoarce acel mesa0/ valoarea 2ntoars7 este 1,F(> numai dac7 mesa0ul primit a fost W8END4T' Fa tratarea mesa0ului W8EF?DTT)NA)WN se distruge fereastra aplica6iei 5i apoi se pune 2n coda de mesa0e mesa0ul W8END4T pentru a se realiza terminarea +uclei w*ile' )rice alt mesa0 diferit de W8EF?DTT)NA)WN nu este tratat de aplica6ie este preluat de /ispatc*2essage care va apela procedura fereastr7 a clasei ?DTT)N' Bn marea ma0oritate a cazurilor procedura nu e-ecut7 nimic special unul din rolurile ei fiind acela de a goli coada de mesa0e a aplica6iei 5i de a respecta principiul <2n Windows nici un mesa0 nu se pierde=' Bn afar7 de GetMessage mai e-ist75i func6ia !eeBMessage care se utilizeaz7 de o+icei c9nd aplica6ia dore5te s7 e-ecute anumite ac6iuni 5i nu are nici un mesa0 de procesat'

(roceduri fereastră
+%nc#ude ,w%nd'ws(hCC DDDDDDDDDDDDDDDD Ape#ata pe esaEu# WM:!AINT F'%d DrawHe##'.HWND hwnd5 { HDC hDC; !AINTST"UCT pa%ntStruct; "/CT c#%ent"ect; hDC < 6eg%n!a%nt.hwnd1 @pa%ntStruct5; %f .hDC 9< NULL5 { GetC#%ent"ect.hwnd1 @c#%ent"ect5; D!t'L!.hDC1 .L!!$INT5@c#%ent"ect1 25; DrawTe7t.hDC1 8He##'1 W'r#d981 D01 @c#%ent"ect1 DT:C/NT/" = DT:*C/NT/" = DT:SINGL/LIN/5; /nd!a%nt.hwnd1 @pa%ntStruct5; & & CC DDDDDDDDDDDDDDDDDDDDDDDDDDD !r'cedura fereastra L"/SULT CALL6AC; Wnd!r'c.HWND hwnd1 UINT uMsg1 W!A"AM w!ara 1 L!A"AM #!ara 5 { sw%tch.uMsg5 { case WM:!AINTG DrawHe##'.hwnd5; HreaB; case WM:D/ST"$IG !'stAu%tMessage.>5; HreaB; defau#tG return DefW%nd'w!r'c.hwnd1 uMsg1 w!ara 1 #!ara 5; & return >; CC treHu%e sa %nt'arca t'tdeauna > .Jer'5

& CC DDDDDDDDDDDDDDD !r'gra u# pr%nc%pa# %nt WINA!I W%nMa%n.HINSTANC/ hInstance1 HINSTANC/ h!reFInstance1 L!ST" d31 %nt nC dSh'w5 { MSG sg; HWND hwnd; WNDCLASS wndC#ass; %f .h!reFInstance << NULL5 CC Fa#aH%# nu a% pentru W%nd'ws 3(0 { e set.@wndC#ass1 >1 s%Je'f.wndC#ass55; CC st%#ur% de fereastra wndC#ass(sty#e < CS:H"/D"AW = CS:*"/D"AW; wndC#ass(#pfnWnd!r'c < Wnd!r'c; CC pr'cedura fereastra wndC#ass(hInstance < hInstance; CC %nstanta ap#%catiei wndC#ass(hCurs'r < L'adCurs'r.NULL1 IDC:A""$W5; CC resursa curs'r wndC#ass(hHr6acBgr'und < .H6"USH5.C$L$":WIND$W K 05; CC resursa pens'n wndC#ass(#psJC#assNa e < 8H/LL$8; CC nu e fereastra CC %nreg%strare fereastra %f .9"eg%sterC#ass.@wndC#ass55 return )ALS/; & CC ter %nat %f hwnd < CreateW%nd'w.8H/LL$81 8H/LL$81 WS:$*/"LA!!/DWIND$W1 CW:US/D/)AULT1 >1 CW:US/D/)AULT1 >1 NULL1 NULL1 hInstance1 NULL5; Sh'wW%nd'w.hwnd1 nC dSh'w5; UpdateW%nd'w.hwnd5; wh%#e .GetMessage.@ sg1 NULL1 >1 >55 D%spatchMessage.@ sg5; & return sg(w!ara ;

>-plica6ii:  se creaz7 fereastra prin completarea structurii WNACF,((/  se 2nregistreaz7 fereastra "eg%sterC#ass.@wndC#ass5;  se creaz7 fereastra CreateW%nd'w/  se sta+ileste modul de afi5are al ferestrei Sh'wW%nd'w.hwnd1 nC dSh'w5;  se afi5eaz7 fereastra propriu zis7 UpdateW%nd'w.hwnd5;  urmeaz7 +ucla de mesa0e' Codul ce tre+uie urm7rit este cel din Wnd&roc procedura fereastr7' Ce mesa0e sunt tratateM Care sunt r7spunsurile aplica6iei la aceste mesa0eM Wnd&roc trateaz7 dou7 mesa0e: W8E&,4NT 5i W8EA>(TI)O' ,lte mesa0e dec9t cele indicate sunt tratate de c7tre DefW%nd'w!r'c' Fa mesa0ul W8EA>(TI)O se plaseaz7 2n coada de mesa0e mesa0ul W8END4T care are ca efect terminarea +uclei de mesa0e 5i deci terminarea aplica6iei' Fa mesa0ul W8E&,4NT se apeleaz7 func6ia ArawJello'

Aar c9nd este trimis mesa0ul W8E&,4NT 5i de cineM 8esa0ul W8E&,4NT este trimis prima dat7 de func6ia UpdateW%nd'w adic7 atunci c9nd fereastra devine vizi+il7 prima dat7' Bncerca6i op6iunile (ize 5i 8ove din meniul sistem' Ce se 2nt9mpl7M Tre+uie re6inut urm7torul lucru: dac7 2n coada de mesa0e apar mai multe mesa0e W8E&,4NT sistemul va trata numai ultimul mesa0' Bn fapt ultima redesenare a ferestrei r7m9ne vizi+il7 restul afi57rilor ar fi consumatoare de timp 5i 2n plus ar crea 5i un efect nepl7cut datorat rdesen7rilor succesive' (7 e-plic7m codul din ArawJello' hDC < 6eg%n!a%nt.hwnd1 @pa%ntStruct5; 6eg%n!a%nt 2ncearc7 s7 completeze varia+ila pa%ntStruct 5i ca r7spuns o+6ine un conte-t de dispozitiv care va tre+ui folosit de func6iile din :A4' 4e5irile grafice au nevoie de acest conte-t de dispozitiv' GetC#%ent"ect.hwnd1 @c#%ent"ect5; (e o+6in dimensiunile zonei client completate 2n c#%ent"ect' )+serva6i parametrii func6iei: hwnd va indica pentru ce fereastr7 se dore5te acest lucru' D!t'L!.hDC1 .L!!$INT5@c#%ent"ect1 25; Coordonatele fizice sunt transformate 2n coordonate logice' &rimul parametru *AC indic7 pentru ce conte-t de dispozitiv se face acest lucru' DrawTe7t.hDC1 8He##'1 W'r#d981 D01 @c#%ent"ect1 DT:C/NT/" = DT:*C/NT/" = DT:SINGL/LIN/5; (e afi5eaz7 2n zona client <Jello WorldP= folosind conte-tul de dispozitiv o+6iunut de 6eg%n!a%nt' /nd!a%nt.hwnd1 @pa%ntStruct5; (e termin7 desenarea 5i se distrug informa6iile din pa%ntStruct' Fa terminarea func6iei *AC se distruge fiind local' Bn fapt dup7 /nd!a%nt *AC3ul nu mai este valid' &rocedura fereastr7 nu este nimic altceva dec9t o structura mare sw%tch'

Mai #ulte bucle de #esaje şi proceduri fereastră
,plica6iile pot avea c9te +ucle de mesa0e doresc' Ae e-emplu o aplica6ie care are propria +ucl7 de mesa0e 5i face apel la Message6'7 va avea cel pu6in dou7 +ucle de mesa0e' &entru e-emplificare vom considera cazul desen7rii li+ere realizat cu o captură a mouse-lui' ,plica6ia tre+uie s7 fie 2n stare s7 trateze mesa0ele W8EF?DTT)NA)WN W8EF?DTT)ND& 5i W8E8)D(>8)V> pentru a realiza aceast7 desenare' Vom avea tot timpul 2n minte faptul c7 un eveniment de mouse 2n zona client va genera un mesa0 care va fi 2nso6it de coordonatele punctului unde acesta a avut loc' Fogica aplica6iei este urm7toarea: +ucla de mesa0e va trata mesa0ul W8EF?DTT)NA)WN' Bn cadrul func6iei ce trateaz7 acest mesa0 se va realiza capturarea mouse3lui astfel aplica6ia este informat7 de orice mi5care a mouse3lui prin tratarea mesa0elor W8E8)D(>8)V> 5i W8EF?DTT)ND&' 4e5irea din cea de3a doua +ucl7 de mesa0e se face la tratarea mesa0ului W8EF?DTT)ND& caz 2n care 5i capturarea mouse3lui 2nceteaz7' Ae re6inut c7 2n cadrul acestei a doua +ucle de mesa0e control7m mereu dac7 mouse3ul este capturat pentru zona client' ,cest lucru

2nseamn7 c7 dac7 facem clic st9nga 2n afara zonei client 5i 6inem +utonul st9ng al mouse3lui ap7sat 5i ne mi5cam prin zona client nu se va desena nimic' 8ouse3ul nu a fost capturat de aceast7 fereastr7' 1unc6ii noi 2n acest cod' +etMessa%e(os12 Q o+6ine coordonatele punctului unde se afl7 mouse3ul coordonate relative la ecran' Coordonatele sunt o+6inute 2ntr3un AW)IA care con6ine 2n primii doi octeti valoarea lui - iar 2n ultimii doi octe6i valoarea lui H' (Num7r7toarea octe6ilor se face de la st9nga la dreapta') 8acro3ul MAH=(O/*"S transform7 valoarea unui AW)IA 2ntr3o structur7 de tip &)4NT(' Cum zona client (fereastra) este plasat7 2n cadrul ecranului va tre+ui s7 translat7m aceste coordonate 2n zona client' Screen"oClient12 Q transform7 coordonate ecran 2n zona client' .(toD(12 Q transform7 coordonatele fizice de dispozitiv 2n coordonate logice necesare pentru a desena 2n zona client' Dine"o12 Q deseneaz7 un segment de la origine (sau punctul sta+ilit cu Mo e"o Mo e"o=0) p9n7 la punctul curent' +etCapture12 Q testeaz7 dac7 mouse3ul a fost capturat de fereastra aplica6iei' SetCapture1@W*. 2 Q realizeaz7 capturarea mouse3ului pentru fereastra cu *andler3ul specificat :eleaseCapture12 Q eli+ereaz7 capturarea mouse3ului' +et.C12 Q o+6ine un conte-t de dispozitiv pentru a desena 2n fereastr7 (zona client)' :elease.C12 Q eli+ereaz7 conte-tul de dispozitiv o+6inut cu :etAC' +%nc#ude ,w%nd'ws(hF'%d AddSeg entAtMessage!'s.HDC hDC1 HWND hwnd1 6$$L HDraw5 { DW$"D dw!'s; !$INTS p'%nts; !$INT p'%nt; dw!'s < GetMessage!'s.5; p'%nts < MA;/!$INTS.dw!'s5; p'%nt(7 < p'%nts(7; p'%nt(y < p'%nts(y; ScreenT'C#%ent.hwnd1 @p'%nt5; D!t'L!.hDC1 @p'%nt1 05; %f .HDraw5 L%neT'.hDC1 p'%nt(71 p'%nt(y5; e#se M'FeT'/7.hDC1 p'%nt(71 p'%nt(y1 NULL5; & F'%d DrawHe##'.HWND hwnd5 { HDC hDC; MSG sg; %f .GetCapture.5 9< NULL5 return; hDC < GetDC.hwnd5; %f .hDC 9< NULL5 { SetCapture.hwnd5; AddSeg entAtMessage!'s.hDC1 hwnd1 )ALS/5; wh%#e.GetMessage.@ sg1 NULL1 >1 >55 { %f .GetCapture.5 9< hwnd5 HreaB; sw%tch . sg( essage5 { case WM:M$US/M$*/G AddSeg entAtMessage!'s.hDC1 hwnd1 T"U/5; HreaB; case WM:L6UTT$NU!G g't' /7%tL''p;

defau#tG D%spatchMessage.@ sg5; & & /7%tL''pG "e#easeCapture.5; "e#easeDC.hwnd1 hDC5; & & L"/SULT CALL6AC; Wnd!r'c.HWND hwnd1 UINT uMsg1 W!A"AM w!ara 1 L!A"AM #!ara 5 { sw%tch.uMsg5 { case WM:L6UTT$ND$WNG DrawHe##'.hwnd5; HreaB; case WM:D/ST"$IG !'stAu%tMessage.>5; HreaB; defau#tG return DefW%nd'w!r'c.hwnd1 uMsg1 w!ara 1 #!ara 5; & return >; & %nt WINA!I W%nMa%n.HINSTANC/ hInstance1 HINSTANC/ h!reFInstance1 L!ST" d31 %nt nC dSh'w5 { MSG sg; HWND hwnd; WNDCLASS wndC#ass; %f .h!reFInstance << NULL5 { e set.@wndC#ass1 >1 s%Je'f.wndC#ass55; wndC#ass(sty#e < CS:H"/D"AW = CS:*"/D"AW; wndC#ass(#pfnWnd!r'c < Wnd!r'c; wndC#ass(hInstance < hInstance; wndC#ass(hCurs'r < L'adCurs'r.NULL1 IDC:A""$W5; wndC#ass(hHr6acBgr'und < .H6"USH5.C$L$":WIND$W K 05; wndC#ass(#psJC#assNa e < 8H/LL$8; %f .9"eg%sterC#ass.@wndC#ass55 return )ALS/; & hwnd < CreateW%nd'w.8H/LL$81 8H/LL$81 WS:$*/"LA!!/DWIND$W1 CW:US/D/)AULT1 >1 CW:US/D/)AULT1 >1 NULL1 NULL1 hInstance1 NULL5; Sh'wW%nd'w.hwnd1 nC dSh'w5; UpdateW%nd'w.hwnd5; wh%#e .GetMessage.@ sg1 NULL1 >1 >55 D%spatchMessage.@ sg5; return sg(w!ara ; & )+serva6ie' 8esa0ul W8E8)D(>8)V> poate fi tratat 5i 2n +ucla de mesa0e din Win8ain dar pentru a realiza aceea5i func6ionalitate codul 5i logica aplica6iei tre+uiesc sc*im+ate'

Conclu'ii


Fiecare aplicaţie Windows este construită 3n jurul unei bucle de #esaje ' ) +ucl7 de mesa0e
face apeluri repetate la func6iile GetMessage sau !eeBMessage 5i reg7se5te mesa0ele pe care le dispecereaz7 procedurilor fereastr7 prin func6ia D%spatchMessage' &rocedurile fereastr7 sunt definite pentru clasele fereastr7 2n momemntul c9nd clasa fereastr7 a fost 2nregistrat7 prin "eg%sterC#ass' 8esa0ele adresate aplica6iei sunt tratate de procedura fereastr7 sau sunt trimise procedurii implicite DefW%nd'w!r'c sau DefD#g!r'c 2n situa6ia c9nd nu sunt tratate de procedura fereastr7' )rice mesa0 windows tre+uie tratat nu tre+uie pierdut' 8esa0ele pot fi plasate sau trimise unei aplica6ii' 8esa0ele plasate sunt depozitate 2n coada de unde sunt reg7site cu GetMessage sau !eeBMessage' 1a67 de un mesa0 plasat un mesa0 trimis ( SendMessage) implic7 imediat un apel al procedurii fereastr7' Cu alte cuvinte nu se termin7 e-ecu6ia func6iei SendMessage p9n7 c9nd mesa0ul nu a fost tratat' ) aplica6ie poate avea mai multe +ucle de mesa0e'

   



Citirea $ărţii de #esaje J7r6ile de mesa0e sunt p7r6i ale modelului 81C de programare Windows' Bn loc de a scrie func6ia W%nMa%n.5 care trimite mesa0e la procedura fereastr7 (func6ia) Wind&roc() 5i apoi s7 control7m ce mesa0 a fost trimis pentru a activa func6ia corespunz7toare vom scrie doar func6ia care trateaz7 mesa0ul 5i vom ad7uga mesa0ul la *arta de mesa0e a clasei' Cadrul de lucru va face opera6iunile necesare pentru a ruta acest mesa0 2n mod corect' Construirea $ărţii de #esaje J7r6ile de mesa0e se construiesc 2n dou7 etape' .eclaraţia *7rtii de mesa0e (macro A>CF,I>E8>((,:>E8,&()) se face 2n fi5ierul '* al clasei iar i#ple#entarea se face in fi5ierul 'cpp al clasei (?>:4NE8>((,:>E8,&() ''' >NAE8>((,:>E8,&())' =0e#plu CC{{A)L:MSG.CSh'wStr%ngApp5 af7: sg F'%d $nAppAH'ut.5; CC N$T/ D the C#assW%Jard w%## add and re 'Fe e Her funct%'ns here( CC D$ N$T /DIT what y'u see %n these H#'cBs 'f generated c'de 9 CC&&A)L:MSG D/CLA"/:M/SSAG/:MA!.5 (e declar7 func6ia )n,pp,+out() care este prefi-at7 cu af-Emsg ce constituie un comentariu pentru compilatorul de C++ dar care indic7 vizual c7 aceast7 func6ie trateaz7 un mesa0' ,ceast7 func6ie o vom g7si 5i 2n cadrul macro3ului ?>:4NE8>((,:>E8,&() ca un parametru al

macro3ului )NEC)88,NA()' &rimul parametru al acestui din urm7 macro este 4A3ul mesa0ului (comenzii 2n acest caz) iar al doilea numele func6iei ce trateaz7 acest mesa0' Cod in 'cpp 6/GIN:M/SSAG/:MA!.CSh'wStr%ngApp1 CW%nApp5 CC{{A)L:MSG:MA!.CSh'wStr%ngApp5 $N:C$MMAND.ID:A!!:A6$UT1 $nAppAH'ut5 CC N$T/ D the C#assW%Jard w%## add and re 'Fe app%ng acr's here( CC D$ N$T /DIT what y'u see %n these H#'cBs 'f generated c'de9 CC&&A)L:MSG:MA! CC Standard f%#e Hased d'cu ent c' ands $N:C$MMAND.ID:)IL/:N/W1 CW%nAppGG$n)%#eNew5 $N:C$MMAND.ID:)IL/:$!/N1 CW%nAppGG$n)%#e$pen5 CC Standard pr%nt setup c' and $N:C$MMAND.ID:)IL/:!"INT:S/TU!1 CW%nAppGG$n)%#e!r%ntSetup5 /ND:M/SSAG/:MA!.5 8acro3ul A>CF,I>E8>((,:>E8,&() adaug7 date me+ru 5i func6ii la clasa respectiv7' &ractic se declar7 o ta+el7 cu un num7r de intr7ri varia+il (sf9r5itul ta+elei este marcat (completat) de >NAE8>((,:>E8,&()) 5i func6ii care opereaz7 cu acest elementele acestui ta+el' Macro)uri pentru $arta de #esaje ?>:4NE8>((,:>E8,& 5i >NAE8>((,:>E8,& sunt macro3uri care ca 5i macro3ul A>CF,I>E8>((,:>E8,& din fi5ierul '* declar7 anumite varia+ile mem+ru 5i func6ii pe care cadrul de lucru le va utiliza pentru a naviga prin *7r6ile de mesa0e ale tuturor o+iectelor din sistem &rintre macro3urile folosite 2n *7r6ile de mesa0e enumer7m: • A>CF,I>E8>((,:>E8,&Rfolosit 2n fi5ierul '* pentru a declara c7 va e-ista o *art7esa0e in 'cpp • ?>:4NE8>((,:>E8,&R8arc*eaz7 2nceputul *7r6ii de mesa0e 2n fi5ierul surs7' • >NAE8>((,:>E8,&R8arc*eaz7 sf9r5itul *7r6ii de mesa0e 2n fi5ierul surs7' • )NEC)88,NAR1olosit pentru a face leg7tura 2ntre comenzi 5i func6iile care trateaz7 aceste comenzi' • )NEC)88,NAEI,N:>R1olosit pentru a face leg7tura 2ntre un grup de comenzi 5i func6ia care le trateaz7' • )NEC)NTI)FR1olosit pentru a face leg7tura 2ntre un mesa0 de notificare al unui control 5i func6ia ce3l trateaz7' • )NEC)NTI)FEI,N:>R1olosit pentru a face leg7tura 2ntre un grup de mesa0e de notificare al unui control 5i func6ia corespunz7toare' • )NE8>((,:>R1olosit pentru a realiza leg7tura 2ntre un mesa0 definit de utilizator 5i func6ia care3l trateaz7' • )NEI>:4(T>I>AE8>((,:>R1olosit pentru a realiza leg7tura 2ntre un mesa0 defint de utilizator dar 2nregistrat 5i func6ia care3l trateaz7'

• • • •



)NED&A,T>EC)88,NAED4R1olosit pentru a indica func6ia care va face actualizarea pentru o comand7 specific7' )NEC)88,NAED&A,T>ED4EI,N:>RCa mai sus dar pentru un grup de comenzi' )NEN)T41OR1olosit pentru a indica func6ia ce va ad7uga informa6ii suplimentare pentru un mesa0 de notificare al unui control' )NEN)T41OEI,N:>RCa mai sus dar pentru un grup de mesa0e de notificare al unui control' )NEN)T41OE>%RCa la )NEN)T41O dar func6ia va 2ntoarce TID> sau 1,F(> pentru a indica dac7 notificarea poate fi trecut7 altui o+iect pentru trat7ri suplimentare' )NEN)T41OE>%EI,N:>RCa mai sus dar se refer7 la un grup de comenzi de notificare'

Bn plus la ceste macro3uri e-ist7 peste .GG de macro3uri unul pentru fiecare din cele mai comune mesa0e' Ae e-emplu macro3ul )NECI>,T> pentru mesa0ul W8ECI>,T> etc' Bn mod o+i5nuit aceste macro3uri sunt ad7ugate la clas7 de c7tre Class Wizard' Cu# lucrea'ă $arta de #esaje 1iecare aplica6ie are un o+iect mo5tenit din clasa CW%nApp 5i o func6ie mem+ru "un.5( ,ceast7 func6ie apeleaz7 func6ia CW%nThreadGG"un.51 care apeleaz7 GetMessage.51 Trans#ateMessage.5 M% D%spatchMessage.5( 1unc6ia fereastr7 (2n (AS) 5tie *andler3ul ferestrei pentru care este trimis mesa0ul' 1iecare o+iect fereastr7 folose5te acela5i stil al clasei Windows 5i aceea5i func6ie Wind&roc numit7 Af7Wnd!r'c.5( 81C men6ine ceva asem7n7tor numit *andle map o ta+el7 cu *andler3ii ferestrelor 5i pointeri la o+iecte 5i framewor;3ul folose5te aceasta pentru a trimite un pointer la o+iectul C++ un CWndN( Bn continuare el apeleaz7 W%nd'w!r'c.51 o func6ie virtual7 a acestui o+iect' Aatorit7 polimorfismului indiferent c7 este vor+a de un ?utton sau o vizualizare se va apela func6ia corect7' W%nd'w!r'c.5 apeleaz7 $nC dMsg.51 func6ia C++ care efectiv manipuleaz7 mesa0ul' 8ai 2nt9i caut7 dac7 acesta este un #esaj, o co#andă sau o notificare' &resupun9nd c7 este un mesa0' caut7 2n *arta de mesage a clasei folosind func6iile 5i varia+ilele mem+ru ad7ugate la clas7 de A>CF,I>E8>((,:>E8,& ?>:4NE8>((,:>E8,& 5i >NAE8>((,:>E8,&' 8odul de organizare al acestei ta+ele permite c7utarea mesa0ului dac7 este nevoie 2n toat7 ar+orescen6a clasei' Af7Wnd!r'c.5D-W%nd'w!r'c.5D-$nC dMsg.5 (e va e-plica cum se adaug7 un mesa0 la o clas7 5i func6ia corespunz7toare acestuia care clas7 trateaz7 mesa0ul cum se scrie cod 2n func6ie etc' :ecunoaşterea #esajelor >-ist7 apro-imativ !GG mesa0e Windows' (refi0ele #esajului Windows şi "ipuri fereastră (refi0 Window "Ape

,?8 ,?N ,C8 ,CN ?8 ?N C? C?N CA8 CAN C&F A?T AF A8 >8 >N 18 18>V>NT JA8 JAN JS8 48C 48N F? F?N FV8 FVN N8 &?8 &?T &(8 &(N (? (?8 (T8 (TN T? T?N T?8 TC8 TCN TT8 TTN TV8 TVN DA8 W8

,pp+ar ,nimation control ?utton Com+o +oCommon dialog +oControl &anel application ,nH application (device c*ange message) Arag list +oAialog +o>dit +o1ile 8anager Jeader control JotSeH control 48> window Fist +oFist view ,nH parent window (notification message) &rogress +ar ,nH application (+atterH power +roadcast) &ropertH s*eet (tatus +ar (croll+ar (tatic control Tool+ar Trac; +ar Ta+ control ToolTip Tree view Dp Aown control :eneric window

Care e diferen6a 2ntre mesa0ele care se termin7 2n 8 5i cele care se termin7 2n NM &rimul este un mesa0 la control (am ap7sat +utonul de e-emplu) al doilea este un mesa0 de notificare de la control la fereastra proprietar7 a controlului care are semnifica6ia de <am fost ap7sat= <s3a 2nt9mplat ceva 2n control'''=' >-ist7 5i mesa0e care nu se termin7 2n 8 (C?E) dar ac6ioneaz7 la fel' Inţele%erea co#en'ilor ) co#andă este un tip special de mesa0' Windows genereaz7 comenzi c9nd utilizatorul alege un articol de meniu apas7 un +uton sau altfel spune sistemului s7 fac7 ceva' &entru un articol de meniu se prime5te mesa0ul WMJCOMMA*. iar pentru notificarea unui control WMJ*O"/FB cum ar fi selectarea dintr3un list +o-'

Co#en'ile şi notificările sunt trecute prin () ca orice alt mesa0 p9n7 c9nd acestea a0ung la $nWndMsg.5( Bn acest punct pasarea mesa0ului windows 2nceteaz7 5i se starteaz7 rutarea comenzilor 2n 81C'
2esajele de comandă au ca prim parametru! %/-ul articolului din meniu care a fost selectat sau a butonului care a fost apăsat.

Iutarea comenzilor este mecanismul pe care )nWnd8sg() 2l folose5te pentru a trimite comanda (sau notificarea) la o+iectele care pot trata acest mesa0' *u#ai obiectele care sunt #oştenite din CWnd pot pri#i #esaje dar toate obiectele care sunt #oştenite din CC#d"ar%et, inclu'Knd CWnd şi C.ocu#ent, pot pri#i co#en'i sau notificări' ,ceasta 2nseman7 c7 o clas7 mo5tenit7 din CD'cu ent poate avea o *art7 de mesa0e' &ot s7 nu e-iste mesa0e 2n aceast7 *art7 ci numai pentru comenzi 5i notific7ri dar tot *art7 de mesa0e se nume5te' Co#en'ile şi notificările a0ung la clas7 prin mecanismul de rutare al comenzilor' $nWndMsg.5 apeleaz7 CWndGG$nC' and.5 sau CWndGG$nN't%fy.5( $nC' and.5 apeleaz7 $nC dMsg.5( $nN't%fy.5 apeleaz7 de asemenea $nC dMsg.5( ?inen6eles c7 am+ele func6ii efectueaz7 anumite controale 2nainte de a face aceste apeluri' $nC dMsg.5 este virtual7 ceea ce 2nseamn7 c7 diferite comenzi au implement7ri diferite' 4mplementarea pentru fereastra cadru trimite comanda vizualiz7rilor 5i documentelor pe care le con6ine' Co#anda pentru actuali'ări 1olosit 2n special pentru actualizarea articolelor din meniu' Ae e-emplu c9nd se selecteaz7 te-t in vizualizare 5i op6iunile de CopH Cut &aste Dndo sunt implementate aceste articole de menu vor fi afi5ate 2n starea ena+le sau disa+le (func6ie de logica programului)' >-ist7 dou7 posi+ilit76i de a face acest lucru: continuous update approac* 5i update-on-demand approac*' Continuous update approac* presupune e-isten6a unei ta+ele mari ce con6ine c9te o intrare pentru fiecare meniu 5i un flag care va indica dac7 op6iunea este disponi+il7 sau nu' Cea de3a doua posi+ilitate presupune controlarea tuturor condi6iilor asupra unui articol de meniu 2nainte ca meniul s7 fie afi5at' Bn acest caz o+iectul care are meniul va 5ti mai multe despre acesta 2n sc*im+ nu toat7 aplica6ia va avea acces la aceste informa6ii' Te*inca 81C3ului este de a utiliza un o+iect numit CC dUI o comand7 a interfe6ei utilizatorului 5i de a da acest o+iect c9nd se trimite mesa0ul CNED&A,T>EC)88,NAED4' Bn *arta de mesa0e va ap7rea macro3ul )NED&A,T>EC)88,NAED4' Ce se 2nt9mpl7 in realitateM () trimite mesa0ul W8E4N4T8>ND&)&D&/ clasa C)ra eWnd va construi un o+iect CC dUI seteaz7 varia+ilele mem+ru ce corespund primului articol din meniu 5i apeleaz7 func6ia mem+ru D'Update.5( D'Update.5 trimite mesa0ul CNEC)88,NAED&A,T>ED4 la ea 2ns75i cu un pointer la o+iectul CC dUI' (e vor seta varia+ilele mem+ru ale o+iectului CC dUI cu articolul doi din meniu 5i procesul continu7 p9n7 c9nd este parcurs tot meniul' )+iectul

CCmdD4 este folosit pentru a valida (ena+le) sau invalida (disa+le) T gra7)disable) sau ungra7)enable) U articolele din meniu sau +utoane' CC dUI are urm7toarele func6ii mem+ru: • /naH#e.5 R ,re un parametru care poate lua valorile TID> sau 1,F(> (implicit TID>)' • SetChecB.5 R 8arc*eaz7 sau demarc*eaz7 articolul' • Set"ad%'.5 @ (eteaz7 sau nu unul din +utoanele radio al unui grup' • SetTe7t.5R(eteaz7 te-tul unui meniu sau +uton' • D'Update.5R:enereaz7 mesa0ul' /7e p#uG 6/GIN:M/SSAG/:MA!.CWh'%s*%ew1 C)'r *%ew5 ((( $N:U!DAT/:C$MMAND:UI.ID:/DIT:!AST/1 $nUpdate/d%t!aste5 ((( /ND:M/SSAG/:MA!.5 F'%d CWh'%s*%ewGG$nUpdate/d%t!aste.CC dUIN pC dUI5 { pC dUID-/naH#e.GGIsC#%pH'ard)'r atAFa%#aH#e.C):T/LT55; &

"ipărire şi (re i'uali'are
>a'ele tipăririi şi pre i'uali'ării 3n MFC
Cerinţe pentru acest curs! ⇒ ⇒ ⇒ ⇒ Conte"tul de dispozitiv1 Ar*itectura /ocument;<iew! aplica'ii tip S/%1 5ratarea mesajelor simple de mouse1 defilarea orizontală ,i;sau verticală )op'ional).

Obiecti e!  determinarea obiectelor folosite de către 20C pentru tipărire ,i previzualizare1  determinarea ordinii de apel al func'iilor implicate în tipărire ,i previzualizare1  determinarea elementelor ce identifică pagina de tipărit! etc.

Fec6ia se va desf75ura 2n la+orator' Arept e-erci6iu independent: s7 se adauge codul necesar pentru a realiza defilarea orizontal7 5i#sau vertical7' &entru 2nv76area manevr7rii conte-tului de dispozitiv se poate propune construirea unei aplica6ii care s7 deseneze graficul unei func6ii' (e vor avea 2n vedere toate situa6iile posi+ile unde poate fi desenat graficul func6iei astfel 2nc9t s7 fie ocupat7 c9t mai +ine zona client (pentru un grafic ce apare numai 2n cadranul 4V se va desena numai acest cadran 5i graficul etc')' Vom e-emplifica tip7rirea 5i vizualizarea pe +aza unui e-emplu' (e creaz7 o aplica6ie cu ar*itectura Aocument#View 5i tip (A4 (restul set7rilor r7m9n9nd cele implicite) 5i cu suport pentru print#preview' Numele proiectului este &rint.' &rima modificare' Bn func6ia C!r%nt0*%ewGG$nDraw.5 ad7ug7m: pDCD-"ectang#e.2>1 2>1 22>1 22>5; (e va desena un dreptung*i (cu m7rimile m7surate 2n pi-eli)' (2G 2G) reprezint7 col6ul din st9nga sus al dreptung*iului iar (22G 22G) reprezint7 col6ul din dreapta 0os al dreptung*iului' Aeci m7rimea laturilor dreptung*iului este 2GG pe 2GG pi-eli' Col6ul din st9nga sus al zonei client are coordonatele (G G) a-a )- este pe orizontal7 a-a )H este pe vertical7' ,ceast7 aplica6ie poate produce vizualizarea 5i tip7rirea documentului'

Scalarea
Aocumentul listat 5i cel afi5at pe ecran nu are aceea5i dimensiune (nu arat7 la fel) pentru c7 imprimanta folose5te unitatea de m7sur7 dots iar pe ecran se folose5te pi-elul 5i acestea au m7rimi diferite (2GG dots V 2GG pi-eli)' ,cest lucru este descris de modul de mapare (implicit 88ET>%T)' Aac7 dorim s7 scal7m imaginea tip7rit7 la o anumit7 dimensiune tre+uie s7 alegem diferite moduri de mapare'

Moduri de #apare
Mode 88EJ4>N:F4(J 88EJ48>TI4C 88E4()TI)&4C 88EF)>N:F4(J 88EF)8>TI4C 88ET>%T 88ETW4&( Lnit G'GG. inc* G'G. millimeter Dser3defined G'G. inc* G'. millimeter Aevice pi-el .#.LLG inc* E 4ncreases rig*t 4ncreases rig*t Dser3defined 4ncreases rig*t 4ncreases rig*t 4ncreases rig*t 4ncreases rig*t B 4ncreases up 4ncreases up Dser3defined 4ncreases up 4ncreases up 4ncreases down 4ncreases up

Fucrul cu grafice 2n modul 88ET>%T devine o pro+lem7 c9nd imprimantele 5i ecranele au un num7r diferit de dots#pi-eli pe pagin7' Dn mod de mapare mai +un pentru lucrul cu grafice este 88EF)>N:F4(J care folose5te ca unitate de m7sur7 a suta parte dintr3un inc*' &entru a folosi acest mod de mapare folosim func6ia (et8ap8ode(): pDCD-SetMapM'de.MM:L$/NGLISH5; pDCD-"ectang#e.2>1 D2>1 22>1 D22>5; ,tentie la originea a-elor 5i la sensul acestora (cre5terea lui- 5i a lui H) C9nd vom tip7ri documentul de mai sus vom o+6ine un dreptung*i cu laturile e-act de 2 inc*'

"ipărirea #ai #ultor pa%ini
81C trateaz7 tip7rirea documentului (mai pu6in +itmap3uri)' 1unc6ia )nAraw() din clasa pentru vizualizare realizeaz7 desenarea pe ecran c9t 5i tip7rirea la imprimant7' Fucrurile se complic7 c9nd documentul are mai multe pagini sau alte trat7ri speciale (informa6ii de 2nceput 5i de sf9r5it de pagin7)' >-emplificare: Vom modifica aplica6ia astfel 2nc9t s7 desen7m mai multe dreptung*iuri care s7 nu 2ncap7 pe o pagin7' ,d7ug7m o varia+il7 mem+ru (%nt :nu rects) la clasa document care va memora num7rul de dreptung*iuri care se vor desena 5i pe care o ini6ializ7m 2n constructor' &e mesa0ul W8EF?DTT)NA)WN vom incrementa aceast7 varia+il7 iar pe mesa0ul W8EI?DTT)NA)WN vom decrementa aceast7 varia+il7' Codul pentru cele dou7 func6ii este dat mai 0os:

print8View,cpp ))C(rint8View!!OnD>utton.own12
F'%d C!r%nt0*%ewGG$nL6utt'nD'wn.UINT n)#ags1 C!'%nt p'%nt5 { C!r%nt0D'cN pD'c < GetD'cu ent.5; ASS/"T:*ALID.pD'c5; pD'cD- :nu "ectsKK; InFa#%date.5; C*%ewGG$nL6utt'nD'wn.n)#ags1 p'%nt5; &

print8View,cpp ))C(rint8View!!On:>utton.own12
F'%d C!r%nt0*%ewGG$n"6utt'nD'wn.UINT n)#ags1 C!'%nt p'%nt5 { C!r%nt0D'cN pD'c < GetD'cu ent.5; ASS/"T:*ALID.pD'c5; %f .pD'cD- :nu "ects - >5 { pD'cD- :nu "ectsDD; InFa#%date.5; & C*%ewGG$n"6utt'nD'wn.n)#ags1 p'%nt5; &

Iescriem func6ia )nAraw() astfel: print8View,cpp ))C(rint8View!!On.raw12
F'%d C!r%nt0*%ewGG$nDraw.CDCN pDC5 { C!r%nt0D'cN pD'c < GetD'cu ent.5; ASS/"T:*ALID.pD'c5; CC T$D$G add draw c'de f'r nat%Fe data here pDCD-SetMapM'de.MM:L$/NGLISH5; char sO0>P; wspr%ntf.s1 8Qd81 pD'cD- :nu "ects5; pDCD-Te7t$ut.3>>1 D0>>1 s5; f'r .%nt 7<>; 7,pD'cD- :nu "ects; KK75 { pDCD-"ectang#e.2>1 D.2>K7N2>>51 2>>1 D.2>>K7N2>>55; & &

Vedem ce se 2nt9mpl7 2n &rint&review' Codul din &rint&review (2n acest moment) nu 5tie cum s7 afi5eze mai multe pagini' Aeterminarea num7rului de pagini se face 2n func6ia )n?egin&rinting()'

print8View,cpp ))C(rint8View!!On>e%in(rintin%12
F'%d C!r%nt0*%ewGG$n6eg%n!r%nt%ng.CDCN pDC1 C!r%ntInf'N pInf'5 { C!r%nt0D'cN pD'c < GetD'cu ent.5; ASS/"T:*ALID.pD'c5; %nt pageHe%ght < pDCD-GetDeF%ceCaps.*/"T"/S5; %nt #'g!%7e#sI < pDCD-GetDeF%ceCaps.L$G!IL/LSI5; %nt rectHe%ght < .%nt5.2(2 N #'g!%7e#sI5; %nt nu !ages < pD'cD- :nu "ects N rectHe%ght C pageHe%ght K 0; pInf'D-SetMa7!age.nu !ages5; & $n6eg%n!r%nt%ng.5 are doi parametri: un pointer la un conte-t de dispoztiv al imprmantei 5i un pointer la un o+iect C&rint4nfo' &entru c7 versiunea implicit7 nu se refer7 la ace5ti doi pointeri numele parametrilor sunt comenta6i pentru a preveni mesa0ele de avertizare la compilare' F'%d C!r%nt0*%ewGG$n6eg%n!r%nt%ng.CDCN CNpDCNC 1 C!r%ntInf'N CNpInf'NC5 &entru a seta num7rul paginii tre+uie s7 acces7m am+ele o+iecte CACW 5i C&rint4nfo deci va tre+ui s7 scoatem comentariile de la ce5ti doi parametri' Tre+uie s7 avem urm7toarele informa6ii: .' 2n7l6imea paginii/ 2' num7rul de dots pe inc*' Bn7l6imea paginii o o+6inem printr3un apel al func6iei GetDF%ceCaps.51 care furnizeaz7 informa6ii despre posi+ilit76ile conte-tului de dispozitiv' ,vem nevoie de rezolu6ia vertical7 (num7rul de dots tip7ri+ili de la 2nceputul paginii p9n7 la sf9r5itul ei) deci vom furniza ca parametru constanta V>ITI>( 2n func6ia GetDeF%ceCaps.5( Constanta J)IXI>( 2n aceea5i func6ie ne furnizeaz7 rezolu6ia orizontal7' GetDeF%ceCaps.5 acceptă un număr de => de constante diferite )a se vedea *elp-ul). Bn e-emplul nostru pentru a 5ti c9te dreptung*iuri 2ncap pe o pagin7 tre+uie s7 5tim 2n7l6imea dreptung*iului 2n dots deci va tre+ui s7 2mp7r6im dots pe pagin7 la dots pe dreptung*i' Ytim c7 fiecare dreptung*i este 2nalt de 2 inc* cu un spa6iu de 2G#.GG 2ntre fiecare dreptung*i' Aistan6a total7 de la 2nceputul desen7rii unui dreptung*i p9n7 la urm7torul este de 2'2 inc*' ,pelul :etAeviceCaps(F):&4%>F(O) ne d7 num7rul de dots pe inc* pentru imprimant7 (care este ata5at7 la sistem)' care 2nmul6it7 cu 2'2 ne d7 dots pe dreptung*i' Iul9nd aplica6ia vom o+serva c7 de5i 2n previzualizare avem dou7 pagini la listare vom o+6ine pagina . de dou7 ori' Trecerea de la o pagin7 la alta este urm7torul pas'

Setarea ori%inii
Va tre+ui s7 furniz7m informa6ia privitoare la 2nceputul unei noi pagini' &entru acest lucru vom rescrie func6ia $n!repareDC.5( ,d7ug7m aceaceast7 func6ie la clasa de vizualizare cu ClassWizard' Codul este:

print8View,cpp ))C(rint8View!!On(repare.C12
F'%d C!r%nt0*%ewGG$n!repareDC.CDCN pDC1 C!r%ntInf'N pInf'5 { %f .pDCD-Is!r%nt%ng.55

{

%nt pageHe%ght < pDCD-GetDeF%ceCaps.*/"T"/S5; %nt 'r%g%nI < pageHe%ght N .pInf'D- :nCur!age D 05; pDCD-Set*%ewp'rt$rg.>1 D'r%g%nI5;

& C*%ewGG$n!repareDC.pDC1 pInf'5; & Cadrul de lucru 81C apeleaz7 aceast7 func6ie 2nainte de afi5a datele pe ecran sau a le scrie la imprimant7' ,cela5i cod realizeaz7 previzualizarea c9t 5i tip7rirea datelor' Aac7 aplica6ia previzualizeaz7 datele nu este nevoie s7 sc*im+7m procesarea efectuat7 de $n!repareDC.5( Cod necesar este numai pentru tip7rire de aceea folosim func6ia Is!r%nt%ng.5 pentru a determina dac7 ac6iunea este de tip7rire sau nu' Aac7 tip7rim documentul tre+uie s7 determin7m care pagin7 tre+uie tip7rit7 adic7 s7 sta+ilim pagina curent7' &entru aceasta avem nevoie de 2n7l6imea 2n dots a paginii de tip7rit deci un nou apel al func6iei :etAeviceCaps()' Bn continuare tre+uie s7 detrermin7m originea noului viewport (pozi6ia coordonatelor (G G)) pentru afi5are' (c*im+9nd originea d7m informa6ia necesar7 cadrului de lucru 81C pentru a 5ti de unde s7 2nceap7 tip7rirea datelor' &entru prima pagin7 originea este (G G)/ pentru pagina a doua originea este mutat7 2n 0os cu num7rul de dots pe pagin7' In %eneral, co#ponenta erticală este #ări#ea pa%inii 3n#ulţită cu pa%ina curentă #inus 8 ' Num7rul paginii este men6inut 2ntr3o varia+il7 mem+ru a clasei C&rint4nfo' Aup7 ce calcul7m noua origine vom seta aceasta 2n cadrul conte-tului de dispozitiv apel9nd func6ia (etViewport)rg()' (e va rula aplica6ia cu aceste ultime modific7ri efectuate'

MFC şi "ipărirea
,lte func6ii importante 2n procesul de tip7rire sunt:

(rintin% Functions of a View Class
Function )n?egin&rinting() )nAraw() )n>nd&rinting() )n&repareAC() )n&repare&rinting() )n&rint() .escription )verride t*is function to create resources suc* as fonts t*at Hou need for printing t*e document' Oou also set t*e ma-imum page count *ere' T*is function serves triple dutH displaHing data in a frame window a print preview window or on t*e printer depending on t*e device conte-t sent as t*e functionZs parameter' )verride t*is function to release resources created in )n?egin&rinting()' )verride t*is function to modifH t*e device conte-t used to displaH or print t*e document' Oou can for e-ample *andle pagination *ere' )verride t*is function to provide a ma-imum page count for t*e document' 4f Hou donZt set t*e page count *ere Hou s*ould set it in )n?egin&rinting()' )verride t*is function to provide additional printing services suc* as printing *eaders and footers not provided in )nAraw()'

&entru a tip7ri documentul se apeleaz7 mai 2nt9i $n!repare!r%nt%ng.5 care apeleaz7 D'!repare!r%nt%ng.5 care la r9ndul ei este responsa+il7 pentru afi5area +o-ei de dialog &rint 5i creaz7 conte-tul de dispozitiv pentru imprimanta selectat7'

print8View,cpp ))C(rint8View!!On(repare(rintin%12 as +enerated bA AppWi'ard
6$$L C!r%nt0*%ewGG$n!repare!r%nt%ng.C!r%ntInf'N pInf'5 { CC defau#t preparat%'n return D'!repare!r%nt%ng.pInf'5; & 1olosind pointerul la o+iectul C&rint4nfo putem face aici diverse ini6ializ7ri' Tre+uie cercetat7 clasa C&rint4nfo'

Me#bers of t$e C(rint/nfo Class
Me#ber (et8a-&age() (et8in&age() :et1rom&age() :et8a-&age() :et8in&age() :etTo&age() mE+Continue&rinting mE+Airect mE+&review mEnCur&age mEnNum&review&ages mEp&A mErectAraw mEstr&ageAesc .escription (ets t*e documentZs ma-imum page num+er' (ets t*e documentZs minimum page num+er' :ets t*e num+er of t*e first page t*at users selected for printing' :ets t*e documentZs ma-imum page num+er w*ic* maH +e c*anged in )n?egin&rinting()' :ets t*e documentZs minimum page num+er w*ic* maH +e c*anged in )n?egin&rinting()' :ets t*e num+er of t*e last page users selected for printing' Controls t*e printing process' (etting t*e flag to 1,F(> ends t*e print 0o+' 4ndicates w*et*er t*e document is +eing directlH printed' 4ndicates w*et*er t*e document is in print preview' Jolds t*e current num+er of t*e page +eing printed' Jolds t*e num+er of pages (. or 2) +eing displaHed in print preview' Jolds a pointer to t*e print 0o+Zs C&rintAialog o+0ect' Jolds a rectangle t*at defines t*e usa+le area for t*e current page' Jolds a page3num+er format string'

C9nd func6ia Ao&repare&rinting() afi5eaz7 +o-a de dialog &rint utilizatorul poate seta o parte din datele mem+ru ale clasei C&rint4nfo' Bn mod o+i5nuit ultimul apel tre+uie f7cut pentru (et8a-&age() 2nainte ca Ao&repare&rinting() s7 afi5eze +o-a de dialog &rint' Aac7 nu putem determina num7rul de pagini p9n7 c9nd nu avem un AC pentru imprimanta selectat7 tre+uie s7 a5tept7m p9n7 c9nd o+6inem acest conte-t de dispozitiv' Bn mod normal conte-tul de dispozitiv al imprimantei se creaz7 la selec6ia acesteia 2n cadrul acestei +o-e de dialog' Aup7 )n&repare&rinting(CACW C&rint4nfoW) 81C apeleaz7 )n?egin&rinting() care este un alt loc potrivit pentru a seta num7rul ma-im de pagini dar 5i locul pentru a crea resurse cum ar fi fonturi necesare pentru a completa 0o+3 ul de tip7rire' Bn continuare 81C apeleaz7 )n&repareAC() pentru prima pagin7 a documentului' ,ceasta constituie 2nceputul +uclei care se e-ecut7 o dat7 pentru fiecare pagin7 a documentului' 4n )n&repareAC() putem controla care parte din 2ntreg documentul se tip7re5te ca fiind pagina curent7' ,ici vom seta originea viewportului pentru document' Aup7 )n&repareAC() 81C apeleaz7 )n&rint() pentru a tip7ri pagina curent7' Bn mod normal )n&rint() apeleaz7 )nAraw() cu un parametru pointer la CAC care automat redirecteaz7 ie5irea spre imprimant7' &utem rescrie )n&rint() pentru a controla modul cum documentul este tip7rit' &utem tip7ri *eaders 5i footers 2n )n&rint() 5i apoi s7 apel7m versiunea de +az7 a lui )nAraw() pentru a tip7ri pagina curent7' &entru a preveni vesriunea din clasa de +az7 ca s7 nu rescrie *eaders 5i footers restric6ion7m zona tip7ri+il7 prin setarea varia+ilei mErectAraw din o+iectul C&rint4nfo la un dreptung*i care nu acopr7 *eaders 5i footers'

Versiune posibilă On(rint12 cu @eaders şi Footers
F'%d C!r%nt0*%ewGG$n!r%nt.CDCN pDC1 C!r%ntInf'N pInf'5 { CC T$D$G Add y'ur spec%a#%Jed c'de here andC'r ca## the Hase c#ass CC Ca## #'ca# funct%'ns t' pr%nt a header and f''ter( !r%ntHeader.5; !r%nt)''ter.5; C*%ewGG$n!r%nt.pDC1 pInf'5; & (e poate renun6a la apelul lui )nAraw() 2n )n&rint() creind cod suplimentar ca 2n e-emplul de mai 0os'

Versiune posibilă On(rint12 fără On.raw12
F'%d C!r%nt0*%ewGG$n!r%nt.CDCN pDC1 C!r%ntInf'N pInf'5 {

CC T$D$G Add y'ur spec%a#%Jed c'de here andC'r ca## the Hase c#ass CC Ca## #'ca# funct%'ns t' pr%nt a header and f''ter( !r%ntHeader.5; !r%nt)''ter.5; CC Ca## a #'ca# funct%'n t' pr%nt the H'dy 'f the d'cu ent( !r%ntD'cu ent.5; & Aup7 ce 81C a terminat de tip7rit ultima pagin7 apeleaz7 func6ia )n>nd&rinting() unde putem distruge orice resurs7 de care nu mai avem nevoie'

8eniuri
(e vor descrie mai intai elementele aplicatiei (+ara de titlu meniul etc')' W furnizeaza suport aplicatiilor care utilizeaza meniuri: afisarea +arei de meniu derularea unui meniu popup cind acesta este selectat notifica aplicatia cind o comanda de meniu a fost selectata'

.efinire ter#eni! ?ara de meniu care apare in partea cea mai de sus a ferestrei se numeste top-level menu iar comenzile se numesc top-level menu items' 8eniul care apare cind un articol de meniu este selectat se numeste drop down menu iar articolele din acest meniu se numesc articole meniu (menu items)' ,rticolele de meniu sunt identificate prin valori intregi numite 4A3ul art' de meniu sau 4A3ul comenzii' W suporta meniurile popup care sunt asemanatoare cu cele drop down cu deose+irea ca pot fi afisate oriunde pe ecran' 8eniurile de conte-t (rig*t clic;) sunt meniuri popup' 8eniul sistem cuprinde czi pt' redimensionare mutare minimizare ma-imizare inc*idere fereastra' ,ct' legate de meniuri le gasim in clasa C8enu din 81C' C8enu contine o data mem+ru pu+lica J8>ND mE*8enu ce pastreaza un *andle la meniu si mai multe functii ce constituie in fapt apeluri ale fct din ,&4 (C8enu::Trac;&opup8enu C8enu::>na+le8enu etc' C8enu contine doua fct virt Araw4tem si 8easure4tem care pot fi rescrise daca dorim sa cream articole de meniu stilizate ce contin +itmap3uri si alte elemente grafice' Crearea unui meniu in 81C' 8odalitati: .' in mod programa+il Create8enu 4nsert8enu etc/ 2' initializind o serie de structuri de date ce descriu continutul unui meniu si apoi apelam C8enu::Foad8enu4ndirect/ 3' cream o resursa de meniu si incarcam meniul rezultat in aplicatie in timpul e-ecutiei'

Crearea unui meniu

2etoda cea mai usoara este de a adauga un template de meniu la fis. de resurse al aplicatiei. #n fisier de resurse este un fis. te"t care are e"t rc! si care instructiuni ce definesc meniul. Acest fis. de res este compilat si legat la aplicatie cu un utilitar numit rc.e"e )in 2S <C??). resursa este un obiect binar ca de e". un meniu! o icoana! stringuri! bitmap-uri. 0iecare resursa este identificata printr-un %/ intreg sau string )@272enuA sau %/BC2D24$#). %/-urile sunt definite cu Edefine. data ce o resursa este compilata si legata la o aplicatie ea poate fi incarcata printr-un simplu apel de functie. #n fis de resurse contine+ %/ resusrsa! numele art de meniu! %/urile art de meniu! atribute ale meniului.

4AIE8,4N1I,8> 8>ND &I>F),A A4(C,IA,?F> ?>:4N &)&D& <[1ile= ?>:4N 8>ND4T>8 <[New\tCtrl+N= 4AE14F>EN>W ''' 8>ND4T>8 (>&,I,T)I >NA &)&D& <[View= ?>:4N ''' >NA >NA 4ndicatii: ) elipsa in descrierea meniului inseamna ca sunt necesare inf suplimentare dupa ce art este selectat P inseamna ca se e-ecuta imediat o comanda (>-itP)' ,f-res'* defineste valorile 4A3urile pt' comenzile uzuale' Valori valide pt' 4A3uri in intervalul .3 G->111 sau mai e-act G-$GGG @ G-1GGG cf' Nota Te*' 2G din 81C' Te-tul ce urmeaza car' T,? \t identifica un accelerator' Dn accelerator este o tasta sau o com+inatie de taste (Ctrl+C Ctrl+V etc') care cind sunt apasate au acelasi efect ca selectarea art din meniu' Cind definim art de meniu putem sa3i indicam starea initiala de e- :I,O>A ceea ce3l face disa+le CJ>CS>A'

Incarcarea si afisarea unui meniu
4n timpul e-ec' o res' de meniu tr' incarcata si atasata la fereastra' Cind fer este afisata meniul va fi afisat de asemenea' 2etoda F+ apel la fct C1rameWnd::Create
Create(NDFF ET(<Nume aplicatie=) 8,S>4NTI>()DIC>(4AIE8,4N1I,8>))/ W(E)V>IF,&&>AW4NA)W rectAefault NDFF

&aram' C indica resursa de meniu' 8,S>4NTI>()DIC> transforma un intreg intr3o data de tip F&(TI' 2etoda =+ apel la fct C1rameWnd::Foad1rame care creaza o fereastra cadru si ataseaza un meniu la ac'

Foad1rame(4AIE8,4N1I,8> W(E)V>IF,&&>AW4NA)W NDFF NDFF)/ Foad1rame este asemenatoare cu Create dar poate incarca si icoane si alte resurse ceea ce nu face Create (in spate este CreateWindow CreateWindow>-)' 2etoda :+ construim un o+ de tip meniu clasa C8enu si3l incarcam C8enu::Foad8enu si apoi il atasam la fer' CWnd::(et8enu: C8enu menu/ menu'Foad8enu(4AIE8,4N1I,8>)/ (et8enu([menu)/ menu'Aetac*()/ C8enu::Aetac*() va detasa meniul din o+ C8enu a'i' meniul nu va fi distrus prematur cind on menu va fi distrus' Iegula gen' Ln #eniu incarcat cu DoadMenu ar trebui sa fie distrus cu .estroAMenu inainte ca aplicatia sa se ter#ine, 8etoda 3 este folosita in programe care au mai mult de un meniu' >-' de aplicatie cu doua meniuri: Create(NDFF ET(<aplicatie=))/ mEmenuFong'Foad8enu(4AIEF)N:8>ND)/ mEmenu(*ort'Foad8enu(4AIE(J)IT8>ND)/ (et8enu(mE+(*ort8enu M [mEmenu(*ort [mEmenuFong)/ Comutarea intre cele doua meniuri se face astfel (ca raspuns la o comanda a utilizatorului) de la meniul lung la cel scurt: mE+(*ort8enu Q TID>/ (et8enu([mEmenu(*ort)/ Araw8enu?ar()/ de la m's la m'l mE+(*ort8enu Q 1,F(>/ (et8enu([mEmenuFong)/ Araw8enu?ar()/
0ct. C6nd++/raw2enu8ar)) redeseneaza bara meniu pt. a reflecta sc*imbarile facute in meniu. /aca mCmenu3ong si mCmenuS*ort sunt var. membru ale clasei fereastra cadru )derivata din C6nd)! destructorii pt. meniuri se vor apela cind fer. cadru va fi distrusa! deci in acest caz nu mai e nevoie de /estro72enu.

Raspunsul la comenzile meniului
Cind utilizatorul selecteaza un art' de meniu (+ara de meniuri) fer primeste o serie de mesa0e: W8E4N4T8>ND ce notifica fer ca un articol al meniului superior (top3level menu item) a fost

selectat' 4nainte ca meniul sa fie afisat fer primeste mesa0ul W8E4N4T8>ND&)&D& locul unde ar putea fi actualizate (ena+le disa+le c*ec;ed etc') articolele meniului meniul inca nu este afisat' Cind parcurgem art' unui meniu drop down (popup) fer primeste mesa0ul W8E8>ND(>F>CT mesa0 ce poate fi tratat in special in (AS prin afisarea unui te-t in +ara de stare (scurt *elp)' Aar cel mai important mesa0 este W8EC)88,NA trimis cind util' selecteaza un art de meniu'
Cuv inferior al param. w-aram pastreaza %/-ul comenzii )art. din meniul popup) si in S/G se face practic switc* pe 3 6 B/)w-aram) pentru a identifica care comanda a fost selectata. %n 20C se adauga in *arta de mesaje a clasei respective macroul $CC 22A$/ care trateaza mesajul 62CC 22A$/. $CC 22A$/ are doi parametri! primul indica %/Cul comenzii! iar al doilea indica *andlerul comenzii )functia ce va fi apelata la selectia acestei comenzi). 4".

)NEC)88,NA(4AE14F>E(,V> )n1ile(ave)/ 1unctiile ce trateaza comenzile de meniu nu au parametri si nu intorc nimic'

Intervale pentru comenzi
Sunt folosite pentru a trata un grup de art. meniu cu o singura functie. 0unctia va avea codul necesar pentru a identifica corect care comanda a fost selectata. /e e"emplu tratam culorile penitei si construim un meniu cu comenzile+ Bosu! <erde! Albastru. -entru a manevra mai usor interfata! comenzile acestui meniu vor fi inserate in *arta de mesaje a clasei derivate din C<iew. -p. %/-urile sunt+ %/2CB S#! %/2C<4B/4! %/2CA38AS5B# iar fct. corespunzatoare nBosu! n<erde! nAlbastru! iar culoarea o pastram intr-un int! mCnCuloare! cu valorile respective H!F!=.

4n *arta de mesa0e vom avea: )NEC)88,NA(4A8EI)(D )nIosu)/ )NEC)88,NA(4A8EV>IA> )nVerde)/ )NEC)88,NA(4A8E,F?,(TID )n,l+astru)/ iar fctiile vor fi: void C%View::)nIosu() ] mEnCuloare Q G/^ void C%View::)nVerde() ] mEnCuloare Q ./^ void C%View::)n,l+astru() ] mEnCuloare Q 2/^ Aaca am avea mai multe culoriM Cum procedamM :rupam aceste comenzi si vom e-trage 4A3ul comenzii cu CWnd:/:etCurrent8essage iar *arta de mesa0e va fi: )NEC)88,NA(4A8EI)(D )nCuloare)/ )NEC)88,NA(4A8EV>IA> )nCuloare)/ )NEC)88,NA(4A8E,F?,(TID )nCuloare)/

void C%View::)nCuloare() ] DN4T n4A Q (D4NT) F)W)IA(:etCurrent8essage()3Kw&aram)/ mEnCuloare Q n4A @ 4A8EI)(D/ ^
%ndecsii meniului incep cu H )zero). /ar *arta de mesaje este inca prea mare. <om folosi macroul $CC 22A$/CBA$.4 care trateaza o serie de comenzi care au %/-uri contigue )secventiale)+

)NEC)88,NAEI,N:>(4A8EI)(D 4A8E,F?,(TID )nCuloare)/

Actualizarea art intr-un meniu
2etoda F+ actualizare in momentul cind art este selectat void C%View::)nCuloare() ] C8enuW p8enu Q :et8enu()/ p8enu3KC*ec;8enu4tem(mEnCuloare + 4A8EI)(D 81EDNCJ>CS>A)/ p8enu3KC*ec;8enu4tem(n4A 81ECJ>CS>A)/ mEnCuloare Q n4A @ 4A8EI)(D/ ^ 2etoda =+ mutam codul care actualizeaza meniul in tratarea mesa0ului W8E4N4T8>ND&)&D& iar fct este )n4nit8enu&opup' ,ici actualizarea se face inainte ca meniul sa fie afisat' ,ceasta functie are trei parametri: un pointer de tip C8enu ce pointeaza la su+meniul care va fi afisat un D4NT @ valoare ce da inde-ul art din su+meniu si o var' ?))F care este V G daca mesa0ul este al meniului sistem si G altfel' 4n *arta de mesa0e avem: )NEW8E4N4T8>ND&)&D&() iar fct: (C)F)IE8>NDE4NA>% este o varia+ila ce specifica pozitia meniului Color in +ara de meniu a aplicatiei) void C8ain1rame::)n4nit8enu&opup(C8enuW p&opup8enu D4NT n4nde- ?))F +(Hs8enu) ] if (P+(Hsmenu [[ (n4nde- QQ C)F)IE8>NDE4NA>%)) ] p&op8enu3KC*ec;8enu4tem(4A8EI)(D 81EDNCJ>CS>A)/ p&op8enu3KC*ec;8enu4tem(4A8EV>IA> 81EDNCJ>CS>A)/ p&op8enu3KC*ec;8enu4tem(4A8E,F?,(TID 81EDNCJ>CS>A)/ p&op8enu3KC*ec;8enu4tem(mEnCuloare + 4A8EI)(D 81ECJ>CS>A)/ ^
#n alt mecanism este tot la mesajul 62C%$%524$#- -#- si consta in a completa *arta de mesaje cu fct )*andleri) pentru comenzi! *andleri ce vor fi apelati inainte ca meniul sa fie vizibil si inaintea fiecarei selectii din meniu. 0iecarui *andler de actualizare ii este pasat un pointer la un obiect CCmd#% a carei functii membru pot fi folosite pentru a modifica art de meniu. Si pt. ca aceasta clasa CCmd#%! nu este specifica unui tip particular al unui

element al interfetei utilizatorului! acesti *andleri pot fi utilizati si pentru actualizarea butoanelor din toolbar si alte obiecte ale interfetei #%.

>-: in *arta de mesa0e: )NEC)88,NAED&A,T>ED4(4A8EI)(D )nDpdateIosu) )NEC)88,NAED&A,T>ED4(4A8EV>IA> )nDpdateVerde) )NEC)88,NAED&A,T>ED4(4A8E,F?,(TID )nDpdate,l+astru) void C8ain1rame::)nDpdateIosu(CCmdD4W pCmdD4) ] pCmdD43K(etC*ec;(mEnCuloare)/^ etc' 8etode din CCmdD4: >na+le (etC*ec; (etIadio (nu are ec*ivalent in (AS) (etTe-t

Keyboard Acceleratori – Adaugare la aplicatie
,cceleratori: com+inatii de taste pentru a selecta o comanda' Dn accelerator produce mesa0ul W8EC)88,NA' (e creaza o ta+ela de acceleratori in fis de resurse o resursa speciala care coreleaza 4A3ul art de meniu cu tastele sau com+inatiile de taste si incarca resursa in program cu un apel de functie' Iesursa ta+ela de acceleratori este definita de un +loc ,CC>F>I,T)I( in fis de resurse' 1ormat general:

:esurse/. ACC=D=:A"O:S
?>:4N ''' >NA 4n 81C ta+ela de acceleratori are structura: 4AIE8,4N1I,8> ,CC>F>I,T)I( &I>F),A 8)V>,?F> ?>:4N <N= 4AE14F>EN>W V4ITS>O C)NTI)F ''' VSE?,CS 4AE>A4TEDNA) V4ITS>O ,FT >NA
<%B5G4D I spune compilatorului de resurse ca prima intrare este un cod de c*eie virtuala! iar urmatorul este C $5B 3! A35 sau S9%05

4ncarcarea acceleratorilor se face cu fct: Foad,ccelTa+le(8,S>4NTI>()DIC>(4AIE8,4N1I,8>))/

Ae asemenea se poate face si cu Foad1rame' Aaca doua resurse au acelasi nume Foad1rame le incarca pe amindoua la un singur apel de functie' &entru ca acceleratorii sa lucreze +ucla de mesa0e tre+uie sa includa un apel la functia ,&4 ::Translate,ccelerator Crearea #eniului pro%ra#atic 1at run ti#e2 C8enu menu8ain/ menu8ain'Create8enu()/ Cmenu menu&opup/ menu&opup'Create&opup8enu()/ menu&opup',ppend8enu(81E(TI4N: 4A8EI)(D <[Iosu=)/ menu8ain',ppend8enu(81E&)&D& (D4NT) menu&opup'Aetac*() <[Culori=)/ menu&opup'Create&opup8enu()/ menu&opup',ppend8enu(81E(TI4N: 4A8E>%4T <[>-it=)/ ''' menu8ain',ppend8enu(81E&)&D& (D4NT)menu&opup'Aetac*() <[(esiune=)/ (et8enu([menu8ain)/ menu8ain'Aetac*()/

Modificarea programatica
1unctiile necesare pentru modificare sunt: ,ppend8enu 4nsert8enu 8odifH8enu Aelete8enu Iemove8enu 4nainte de a modifica un meniu tre+uie sa o+tinem un pointer la acel meniu CWnd:::et8enu' 4n top3level menu articolele sunt referite prin indici ce incep cu G (zero) @ cel mai din stinga' C8enuW p8enu Q :et8enu()/ p8enu3Aelete8enu(. 81E?O&)(4T4)N)/ sau p8enu3KAelete8enu(4A8ECDF)I4 81E?OC)88,NA)/ sau item3uri din meniuri C8enuW p8enu Q :et8enu()3:et(u+8enu(.)/ p8enu3KAelete8enu(4A8EV>IA> 81E?OC)88,NA)/ sau ec*ivalent: C8enuW p8enu Q :et8enu()/ p8enu3KAelete8enu(4A8EV>IA> 81E?OC)88,NA)/ ## merge +ine Cititi clasa C8enu'

Meniul system
C8enuW p(Hs8enu Q :et(Hstem8enu(1,F(>)/ 1,F(> Q inseamna ca dorim un pointer la o copie a meniului sistem pe care vrem sa3l modificam' TID> Q reset sHstem menu la starea sa implicita' p(Hs8enu3K,ppend8enu(81E(>&,I,T)I)/ p(Hsmenu3K,ppend8enu(81E(TI4N: 4A8EC)8,NA,EN)D, ET(<[Comanda adaugata=))/ in *arta de mesa0e: )NEW8E(O(C)88,NA() void C8ain1rame::)n(HsCommand(D4NT n4A F&,I,8 l&ram) ] if ((n4A [ G-111G ) QQ 4A8EC)88,NA,EN)D,) ] ## ceva ^ C1rameWnd::)n(HsCommand(n4A l&aram)/ ^

Owner Draw Menus

Meniuri grafice

2etoda F+ se creaza +itmap3uri care se folosesc apoi in ,ppend8enu' Vezi clasa C?itmap' Azavanta0: +itmap3urile au marime fi-a' 2etoda =+ articole meniu desenate de utilizator' (e trateaza mesa0ul W8EAI,W4T>8' ,rt' de meniu are atri+utul ca tre+uie desenat de proprietar si nu de windows' 4nainte ca meniul ce contine un articol owner3draw sa fie afisat pentru prima data W trimite un mesa0 W8E8>,(DI>4T>8 pentru a o+tine informatii despre dimensiunile art' meniului' &entru fiecare articol owner3draw al meniului se transmite un asemenea mesa0' &as .' &rimul pas in implementarea unui asemenea meniu este de a seta atri+utul (stilul) meniului cu 81E)WN>IAI,W' >ditorul de resurse nu suporta acest stil' (e poate apela la 8odifH8enu sau la modificarea manuala a resurselor' &as 2' se adauga fct )n8easure4tem la mesa0ul W8E8>,(DI>4T>8 af-Emsg )n8easure4tem(int n4ACtl F&8>,(DI>4T>8(TIDCT lpmis)/ n4ACtl Q 4A controlului tHpedef struct tagF&] D4NT CtlTHpe/ ## )ATE8>ND D4NT Ctl4A/

D4NT item4A/ ## 4A art meniu D4NT itemWidt*/ ## lat' orizontala in pi-eli D4NT itemJeig*t/ ## inalt in pi-eli D4NT itemAata/ ^ 8>,(DI>4T>8(TIDCT/ lpmis3KitemWidt* Q :::et(Hstem8etrics((8ECO8>ND) W L/ lpmis3KitemJeig*t Q :::et(Hstem8etrics((8ECO8>ND)/ &as 3' (e scrie fct )nAraw4tem pentru mesa0ul W8EAI,W4T>8 af-Emsg )nAraw4tem(int n4ACtl F&AI,W4T>8(TIDCT lpdis)/ ,re la +aza urmatoarea structura AI,W4T>8(TIDCT care contine: D4NT CtlTHpe/ D4NT Ctl4A/ D4NT item4A/ D4NT item,ction/ D4NT item(tate/ JWNA *wnd4tem/ JAC *AC/ I>CT rc4tem/ AW)IA itemAata/ 8ai multe informatii in Jelp si _' &rossie

!rocesare "M#M$%&'(AR ) OnMenu'*ar
) parte neplacuta a meniurilor owner3draw este aceea ca windows nu furnizeaza s*ortcut3uri pentru acestea' C*iar daca folosim inainte un meniu te-t apoi il modificam in owner3draw s*ortcut3ul de la te-t nu mai functioneaza' rezolvarea pro+lemei consta in tratarea mesa0ului W8E8>NDCJ,I care este primit de fer' cind un meniu este afisat si o tasta care nu corespunde unui articol de meniu este apasata' &rin procesarea acestui mesa0 putem adauga s*ortcut3uri la meniurile owner3draw' &rototipul functiei CWnd::)n8enuC*ar este urmatorul: af-Emsg FI>(DFT )n8enuC*ar(D4NT nC*ar D4NT n1lags C8enuW p8enu) nC*ar Q contine codul ,N(4 al tastei/ n1lags Q contine un flag 81E&)&D& daca meniul la care mesa0ul vine este un su+meniu/ p8enu Q pointer la meniu/ Valoarea returnata: J4W)IA(FI>(DFT) tre+uie sa contina una din urm' valori: G Q daca W ar tre+ui sa ignore tasta/ . Q daca W ar tre+ui sa inc*ida meniul

2 Q daca W ar tre+ui sa selecteze unul din art' afisate din meniu 4n acest din urma caz F)W)IA(FI>(DFT) contine 4A3ul art' de meniu corespunzator' >-ista definit macroul 8,S>FI>(DFT care seteaza valoarea returnata: FI>(DFT lIesult Q 8,S>FI>(DFT(4A8EI)(D 2)/ va seta *ig* word pe 2 si low word cu 4A8EI)(D

Meniuri conte+tuale) "M#'O%,$-,M$%&
(e activeaza de o+icei la clic dreapta mouse' Dn meniu conte-tual nu este nimic altceva decit un su+meniu care nu e atasat la un top3level menu' 1unctia C8enu::Trac;&opup8enu afiseaza un asemenea meniu' &rototipul fct' este:

?))F Trac;&opup8enu(D4NT n1lags int - int H CWndW pWnd F&I>CT lpIect Q NDFF) - H Q locatia pe ecran (coord' ecran) unde va apare meniul/ n1lags Q inf' despre alianiamentul relativ la - (T&8EF>1T,F4:N T&8EC>NT>I,F4:N T&8EI4:JT,F4:N) si care +uton este utilizat in continuare pt a fcae o selectie (T&8EF>1T?DTT)N T&8EI4:JT?DTT)N)' pWnd Q identifica fereastra care va primi mesa0ul dupa selectia unei comenzi din meniu/ lpIect Q dimensiunea unui dreptung*i (coord' ecran) in care utilizatorul poate face clic fara a anula meniul afisat' >-' C8enu menu/ menu'Foad8enu(4AIEC)NT>%T8>ND)/ C8enuW pConte-t8enu Q menu':et(u+8enu(G)/ pConte-t8enu3KTrac;&opup8enu(T&8EF>1T,F4:N ` T&8EF>1T?DTT)N point'point'H ,f-:et8ainWnd())/ Aaca tratam mesa0ul W8EC)NT>%T8>ND in *arta de mesa0e avem macroul: )NEW8EC)NT>%T8>ND si fct af-Emsg )nConte-t8enu(CWndW pWnd C&oint point)/ pWnd Q identifica fereastra in care s3a facut clic si point coordonatele punctului unde s3a facut clic' &rocesarea comenzilor' 1lagul T&8EI>TDINC8A Q folosit la o+tinerea unui raspuns la apelul unui meniu conte-tual' int nCmd Q (int) pConte-t8enu3KTrac;&opup8enu(T&8EI>TDINC8A''' switc*(nCmd) ] case 4A8EC)NT>%TE.: +rea;/ ''' ^ Dn meniu afisat in acest mod va genera mesa0e W8EC)88,NA cind un articol este selectat'

.ialo%uri şi Controale
&entru fiecare +o-7 de dialog care apare pe ecran e-ist7 dou7 entit76i pe care tre+uie s7 le dezvolt7m: o resursă bo"ă de dialog 5i o clasă bo"ă de dialog' Iesursa +o-7 de dialog este folosit7 pentru a desena +o-a de dialog 5i controalele pe care le con6ine' Clasa men6ine valorile din +o-a de dialog 5i e-ist7 o func6ie mem+ru a acestei clase care este folosit7 pentru a activa +o-a de dialog' Bn general se construie5te un meniu ce va con6ine o op6iune pentru activarea acestui dialog' Iesursa +o-7 de dialog se construie5te cu editorul de resurse' &e +aza acestei resurse Class Wizard va genera clasa corespunz7toare' Bn general +o-ele de dialog sunt derivate din CAialog'

Crearea unei resurse de dialo%
Controalele uzuale din Windows pot fi folosite 2ntr3o +o-7 de dialog' >numer7m dintre acestea: • Static te"t. 1olosit de alte controale pentru descriere' • 4dit bo". 1olosit pentru a prelua anumite informa6ii (5iruri de caractere numere)' &oate fi definit ca av9nd o singur7 linie sau mai multe linii' • 8utton. 1iecare +o-7 de dialog are implicit +utoanele )S 5i Cancel care pot fi p7strate sau 5terse' • C*ec( bo". &ermite selectare sau deselectare' Fucreaz7 independent' • Badio button. &ermite selectare sau deselectare' Nu lucreaz7 independent' • 3ist bo". Con6in o list7 de articole din care utilizatorul poate selecta un articol la un moment dat' Nu putem tasta te-t 2n cadrul acestui control' • Combo bo". >ste o com+ina6ie 2ntre >dit +o- 5i Fist +o-'

.efinirea bo0ei de dialod şi /.)ul Controlului
1iecare +o-7 de dialog are un 4A unic (un identificator) iar controalele din cadrul +o-ei de dialog au de asemenea 4A3uri' 1iecare control din cadrul unei +o-ei de dialog este v7zut ca o fereastr7' Aeci o parte din func6ionalitatea unei ferestre se va reflecta 5i asupra controlului' Clasa CAialog este derivat7 din clasa CWnd care descrie func6ioanlitatea unei ferestre' Aac7 avem un pointer la fereastr7 (:etAlg4tem() pentru dialoguri) putem apela metode specifice pentru aceasta' Ae e-emplu putem ascunde o fereastr7 ((*owWindow()) o putem activa sau dezactiva (>na+leWindow()) sau 2i putem citi#modifica con6inutul (:etWindowTe-t() (etWindowTe-t()) etc' &entru a 5ti ce func6ii se aplic7 va tre+ui s7 consult7m clasa de +az7 5i clasa derivat7' >ditorul de resurse define5te implicit un 4A pentru +o-a de dialog 5i 4A3uri pentru controalele pe care le ata57m acesteia' &utem modifica aceste 4A3uri (&roperties din meniul conte-tual disponi+il pentru controlul selectat sau +o-a de dialog) pentru a le da un sens conform aplica6iei noastre' Ae o+icei aceste 4A3uri 2ncep cu 4AAE urmate de un te-t pentru +o-ele de dialod 5i cu 4ACE pentru controalele din +o-a de dialog' (>-emple: 4AAEA4,F):. 4ACE(T,T4C. 4ACE>A4T. 4ACEI,A4). etc')' &entru controalele dintr3o +o-7 de dialog putem defini date mem+ru (varia+ile) 2n cadrul clasei pentru a men6ine starea acestora' Cu a0utorul Class Wizard3ului putem defini aceste varia+ile 5i le putem manevra 2ntr3o anumit7 m7sur7' Ae asemenea putem defini 5i implementa func6iile necesare trat7rii mesa0elor de notificare pe care acestea le suport7' )+serva6ie: 81C utilizeaz7 ta+ele pentru a gestiona *arta de mesa0e precum 5i pentru a men6ine leg7tura dintre o varia+il7 5i un control' , se vedea clasa CAata>-c*ange 5i func6ia AoAata>-c*ange()' =0erciţiu' (e va crea o +o-7 de dialog cu mai multe controale 5i se vor e-plica aceste lucruri pe codul rezultat' (e vor urm7ri posi+ilit76ile de aliniere a controalelor redimensionare ordinea controalelor stilurile etc' Tipuri de date pentru fiecare control: • 4dit bo". Bn mod o+i5nuit un string dar poate fi 5i un int long float' • C*ec( bo". int • Badio button. int • 3ist bo". (tring • Combo bo". (tring



Scrollbar. int

&entru a afi5a +o-a de dialog va tre+ui s7 apel7m func6ia mem+ru Ao8odal() 2n cazul +o-elor de dialog modale' ?o-ele de dialog amodale vor fi tratate separat deoarece nu urmeaz7 aceea5i construc6ie'

=0e#plu de lansare 3n e0ecuţie a unei bo0e de dialo%
CSd%D%a#'g d#g; CC se creaJa 'H%ectu# pe st%Fa d#g( :checB < T"U/; CC Far%aH%#a atasata unu% c'ntr'# checB d#g( :ed%t < 8h% there8; CC Far%aH%#a atasata unu% c'ntr'# /d%t CStr%ng sg; %f .d#g(D'M'da#.5 << ID$;5 CC are #'c af%sarea d%a#'gu#u% { sg < 8I'u c#%cBed $;( 8; & e#se { sg < 8I'u cance##ed( 8; & sg K< 8/d%t H'7 %sG 8; sg K< d#g( :ed%t; Af7Message6'7 . sg5;

"ipărirea codului 1Autoco#pletion! "ools)<Options)<=ditor2 C9nd tast7m codul avem posi+ilitatea de a vedea numele varia+ilelor mem+ru 5i a func6iilor din clas7' Aac7 tast7m d#g( 5i apoi pauz7 va ap7rea o fereastr7 ce va lista toate varia+ilel mem+ru 5i func6iile din clas7 inclusiv cele mo5tenite din clasa de +az7' Bn continuare vom folosi tastele s7ge6i pentru selec6ie 5i apoi ap7s7m tasta (pace pentru a trece selec6ia f7cut7 2n cadrul codului'

Ce se ascunde 3n spatele unei bo0e de dialo%M
Cel mai important lucru este 2n6elegerea func6iei care urmeaz7' F'%d CSd%D%a#'gGGD'Data/7change.CData/7changeN pDL5 { CD%a#'gGGD'Data/7change.pDL5; CC{{A)L:DATA:MA!.CSd%D%a#'g5 DDL:C'ntr'#.pDL1 IDC:LIST01 :#%stH'75; DDL:ChecB.pDL1 IDC:CH/C;01 :checB5; DDL:Te7t.pDL1 IDC:/DIT01 :ed%t5; DD*:Ma7Chars.pDL1 :ed%t1 0>5; DDL:"ad%'.pDL1 IDC:"ADI$01 :rad%'5; CC&&A)L:DATA:MA! & Tre+uie s7 5tim c7 2ntre +o-a de dialog afi5at7 pe ecran 5i varia+ilele care men6in starea anumitor controale este definit un sc*im+ +idirec6ional de date' Dn rol important 2l 0oac7 aici func6ia UpdateData.5 care sta+ile5te practic direc6ia de sc*im+ ecran3Kvaria+ile sau varia+ile3Kecran' 1unc6iile care 2ncep cu AA%E realizeaz7 sc*im+ul de date' >-ist7 3L de func6ii care 2ncep cu AA% una pentru fiecare tip de dat7 care poate fi sc*im+at7 2ntre clas7 5i dialog' &rimul parametru arat7 direc6ia al doilea este 4A3ul controlului iar al treilea parametru este numele varia+ilei' Codul este ad7gat de Class Wizard'

O>S=:VA?/=! ,numite func6ii AA% nu sunt generate de Class Wizard' Ae e-emplu c9nd ne conect7m la o valoare din Fist ?o- singura alegere posi+il7 pentru tip este C(tring' ,leg9nd acest lucru Class Wizard va genera un apel la AA%EF?(tring() care conecteaz7 stringul selectat la varia+ila mem+ru de tip C(tring' >-ist7 situa6ii c9nd un inde- de tip int este mai +un' &entru acest lucru e-ist7 func6ia AA%EF?4nde-() care realizez7 acest sc*im+ de informa6ii' ) parte dintre func6iile din Fist ?o- folosesc indec5i pentru a manevra articolele dintr3un list +o-' &utem ad7uga cod 2n Aodata>-c*ange() dar 2n afara comentariilor speciale introduse de Class Wizard' Bn acest caz vom ad7uga singuri varia+ila mem+ru la clas7'
1unc6iile care 2ncep cu AAV realizeaz7 validarea datelor' &rametrul al doilea este numele varia+ilei iar al treilea specific7 limitele'

Ltili'area controlului Dist >o0
Dn control de acest tip nu poate fi ini6ializat dec7t atunci c9nd +o-a de dialog este afi5at7 deci este pe ecran' Ain acest motiv tre+uie s7 fim aten6i la momentul ini6ializ7rii' Nu putem apela func6ii mem+ru din aceast7 clas7 at9ta timp c9t dialogul nu este afi5at' ,cest lucru este vala+il pentru orice control pe care 2l acces7m ca un control 5i nu ca o valoare' ) asemenea ini6ializare are loc 2n func6ia $nIn%t%a#D%a#'g.5 care este apelat7 de cadrul de lucru (frame wor;) imediat ce dialogul a fost afi5at pe ecran' ,ceast7 func6ie este apelat7 la trimiterea mesa0ului W8E4N4TA4,F):' Cade 2n sarcina noastr7 s7 includem acest mesa0 2n tratare (se face cu Class Wizard)' (e va e-plica 2n mod concret cum se folose5te Class Wizard pentru a ad7uga noi mesa0e tratate de clasa respectiv7' Ae asemenea tot cu Class Wizard se ata5eaz7 varia+ile pentru controalele dintr3o +o-7 de dialog'

Ln e0e#plu pentru On/nit.ialo%12
6$$L CSd%D%a#'gGG$nIn%tD%a#'g.5 { CD%a#'gGG$nIn%tD%a#'g.5; :#%stH'7(AddStr%ng.8)%rst Str%ng85; :#%stH'7(AddStr%ng.8Sec'nd Str%ng85; :#%stH'7(AddStr%ng.8Iet An'ther Str%ng85; :#%stH'7(AddStr%ng.8Str%ng Nu Her )'ur85; :#%stH'7(SetCurSe#.25; return T"U/; & CC return T"U/ un#ess y'u set the f'cus t' a c'ntr'# CC /LC/!TI$NG $CL !r'perty !ages sh'u#d return )ALS/

,ceast7 func6ie apeleaz7 mai 2nt9i )n4nitAialog() din clasa de +az7 iar 2n continuare se e-ecut7 codul din cadrul func6iei' (tringurile vor fi afi5ate 2n ordinea 2n care au fost introduse (ad7ugate) cu func6ia ,dd(tring()' Bn final se apeleaz7 func6ia (etCur(el() func6ie care are drept parametru un inde- ce identific7 articolele din Fist ?o-' 4nde-ul pentru primul articol are valoarea G (zero)'

O>S=:VA?/=! Bn mod o+i5nuit articolele 2n list +o- sunt ad7ugate dintr3un vector sau o list7' &entru acest lucru se folosesc clasele colec6ie din 81C (C(tring,rraH CFist etc')'

&entru a men6ine (memora) articolul (string3ul) selectat 2n list +o- vom ad7uga o varia+il7 mem+ru de tip C(tring la aceast7 clas7' ,ceast7 varia+il7 va fi privat7 5i deci vom ad7uga func6ii mem+ru pu+lice la clas7 pentru a manevra aceast7 varia+il7 pentru a p7stra stilul de programare impus de &))' &entru selec6ie se va trata mesa0ul de notificare ?NECF4CS>A care are semnifica6ia c7 utilizatorul a f7cut o selec6ie 2n list +o-' 1unc6ia care trateaz7 acest mesa0 se va ad7uga tot cu Class Wizard' Bn codul care urmeaz7 se e-emplific7 preluarea stringului din list +o- la ap7sarea +utonului )S' F'%d CSd%D%a#'gGG$n$;.5 { %nt %nde7 < :#%stH'7(GetCurSe#.5; %f .%nde7 9< L6:/""5 { :#%stH'7(GetTe7t.%nde71 :se#ected5; & e#se { :se#ected < 88; & CD%a#'gGG$n$;.5; & >-plica6ii' 1unc6ia :etCur(el() 2ntoarce inde-ul la articolul selectat' Aac7 acesta este valid (inde- PQ F?E>II) se o+6ine valoarea acestui articol 2n varia+ila mEselected care este de tip C(tring folosind func6ia :etTe-t al c7rei prim parametru este inde-ul articolului'' Bn final se apeleaz7 func6ia )n)S() din clasa de +az7 pentru a e-ecuta alte proces7ri necesare' Bn cele ce urmeaz7 vom o+serva apeluri la func6iile din clasa de +az7' ,ceste apeluri sunt generate de Class Wizard' >-ist7 5i e-cep6ii c9nd aceste apeluri tre+uiesc invalidae (comentate)' Ca un e-emplu vom vedea la 2mp7rtirea zonei client 2n mai multe ferestre (splitting window) la apelul func6iei )nCreateClient()'

Folosirea butoanelor radio
Fa afi5area unei +o-e de dialog care con6ine +utoane radio vom vedea c7 nici un +uton nu este selectat' &entru a realiza o selec6ie implicit7 ad7ug7m 2n )n4nitAialog() urm7toarele linii de cod' :rad%' < 0; UpdateData.)ALS/5; Varia+ila mEradio este ata5at7 unui grup de +utoane radio 5i reprezint7 inde-ul +utonului 2n acest grup' &rimul +uton are inde-ul G (zero)' 1unc6ia DpdateAata(1,F(>) sta+ile5te direc6ia de actualizare care 2n acest caz este de la varia+il7 la ecran 5i 2n final are loc un refres* al +o-ei de dialog' Dn grup de +utoane radio poate fi accesat dup7 ce +o-a de dialog nu mai este pe ecran deci nu tre+uie s7 trat7m )n)S() sau )NCancel()'

Controale clasice
W pune la dispozitie C (sase) controale clasice' Dn control nu este altceva decit o fereastra cu stiluri speciale' Tre+uie retinut faptul ca a lucra cu un asemea control este ca si cum am lucra cu o fereastra' Tipurile controalelor structurile WNACF,(( si clasele corespondente 81C sunt date in ta+ela urmatoare: Controale clasice

Control Type ?uttons Fist +o-es >dit controls Com+o +o-es (croll +ars (tatic controls

WNDC !SS a?DTT)Na aF4(T?)%a a>A4Ta aC)8?)?)%a a(CI)FF?,Ia a(T,T4Ca

"#C Class C8utton C3ist8o" C4dit CCombo8o" CScroll8ar CStatic

Dn control este creat prin instantierea clasei respective din 81C urmat apoi de apelul functiei Create din acea clasa' 81C creaza un o+iect in doi pasi' Ae descris avanta0ele si dezavanta0ele acestei metode' Aaca mCwnd-us*8utton este un o+iect C8utton! instructiunea+ :wnd!ush6utt'n(Create .:T .8Start851 WS:CHILD R WS:*ISI6L/ R 6S:!USH6UTT$N1 rect1 th%s1 IDC:6UTT$N5; creaza un control pus* +utton ce contine te-tul <(tart=' Aescriere parametrii pt' fct' Create: primul parametru specifica te-tul controlului/ al doilea param' reprezinta stilul ferestrei ce reprezinta o com+inatie intre stilurile ferestrei si stiluri specifice controlului'/ Controlul creat este o fereastra descendent (copil) al ferestrei identificata de al patrulea parametru (in (AS se furnizeaza un JWNA la fereastra parinte)/ al treilea parametru specifica marimea si pozitia (in pi-eli) controlului data printr3un o+iect CIect/ pozitia este relativa la coltul din stg sus al ferestrei parinte/ ultimul parametru este 4A3ul +utonului (controlului 3 un intreg) folosit in diverse functii pentru a avea access la el/ acest 4A tre+uie sa ai+a o valoare unica in interiorul ferestrei date pentru a putea identifica corect controlul si functiile care trateaza mesa0ele de notificare' Dnele controale (Fist?o- >dit) pentru a se alinia la noile stiluri au o noua functie mem+ru Create>-' (tilurile e-tinse se scriu numai in cadrul acestei functii (vezi CreateWindow si CreateWindow>-)' Aaca mCwnd3ist8o" este un o+iect C3ist8o" urmatoarea instructiune creaza un control list +o- cu stilulu e-tins W(E>%ECF4>NT>A:>: :wndL%st6'7(Create/7 .WS:/L:CLI/NT/DG/1 :T .8LIST6$L851 NULL1 WS:CHILD = WS:*ISI6L/ = L6S:STANDA"D1 rect1 th%s1 IDC:LIST6$L5; Ca o alternativa putem deriva clasa noastra din CFist?o- si apoi rescriem functia -reCreate6indow in clasa derivata si aplicam stilul de fereastra W(E>%ECF4>NT>A:>: 6$$L CMyL%st6'7GG!reCreateW%nd'w .C"/AT/ST"UCT@ cs5 { %f .9CL%st6'7GG!reCreateW%nd'w .cs55 return )ALS/; cs(dw/7Sty#e =< WS:/L:CLI/NT/DG/; return T"U/; & Dn control trimite notificari parintelui su+ forma de mesa0e W8EC)88,NA' Tipurile de notificari depind de tipul controlului dar in fiecare caz informatia din parametrii mesa0ului w&aram si l&aram identifica controlul care trimite mesa0ul si actiunea ceruta de mesa0' Ae e-emplu cind un pus* +utton este apasat (clic) codul de notificare este ?NECF4CS>A in J4W)IA(w&aram) si 4A3ul controlului in F)W)IA(w&aram) iar *andler3ul ferestrei controlului in l&aram'

Cadrul de lucru 81C insereaza in *arta de mesa0e acest mesa0 de notificare ascunzind detaliile de implementare pentru tratarea mesa0ului W8EC)88,NA (se face legatura intre 4A3ul controlului si functia care trateaza mesa0ul de notificare): $N:6N:CLIC;/D .IDC:6UTT$N1 $n6utt'nC#%cBed5 )NE?NECF4CS>A este un macrou si asemenea macro3uri e-ista pentru fiecare mesa0 de notificare de la fiecare control' >-ista un macro generic )NEC)NTI)F care manipuleaza toate notificarile si toate tipurile de controale si )NEC)NTI)FEI,N:> care mapeaza notificari in mod identic de la doua sau mai multe controale la o functie comuna' Comunicarea intre controale si parinti (proprietarii controlului) este in am+ele directii' Ae e-' parintele poate trimite mesa0ul ?8E(>TCJ>CS unui control c*ec; +o- cu parametrul w&aram ?(TECJ>CS>A' 81C simplifica interfata controlului +azata pe mesa0e prin construirea de functii mem+ru in clasa controlului care wrap ?8E(>TCJ>CS si alte mesa0e ale controlului' Ae e-emplu: :wndChecB6'7(SetChecB .6ST:CH/C;/D5; plaseaza un c*ec; mar; in interiorul c*ec; +o-3ului reprezentat de un o+iect C?utton numit mCwndC*ec(8o"' Ain cauza ca un control este o fereastra anumite functii mem+ru pe care controlul le mosteneste din CWnd sunt folositoare pentru controlul programarii' Ae e-emplu aceeasi functie care modifica titlul unei ferestre (etWindowTe-t modifica te-tul (etic*eta) unui pus* +utton sau sc*im+a continutul unui control de editare (+o- edit)' ,lte functii: :etWindowTe-t >na+leWindow (et1ont' Aaca vrem sa facem ceva in control si nu gasim o functie corespunzatoare in clasa controlului va tre+ui sa cautam o asemenea functie in clasa CWnd din care sunt derivate toate contraolele'

Clasa C$utton
C8utton reprezinta controale de tip +utton +azate pe clasa WNACF,(( a?DTT)Na' Controalele +utton e-ista in patru variante: pus* +uttons c*ec; +o-es radio +uttons si group +o-es' (e vor desena cele patru tipuri' Cand cream un control +uton vom specifica tipul acestuia prin includerea unuia din urmatoarele flag3uri in stilul ferestrei +utonului: Style ?(E&D(J?DTT)N ?(EA>1&D(J?DTT)N ?(ECJ>CS?)% ?(E,DT)CJ>CS?)% ?(E3(T,T> ?(E,DT)3(T,T> ?(EI,A4)?DTT)N ?(E,DT)I,A4)?DTT)N ?(E:I)D&?)% Description Creates a standard pus* +utton control Creates a default pus* +utton/ used in dialog +o-es to identifH t*e pus* +utton t*atZs clic;ed if >nter is pressed Creates a c*ec; +o- control Creates a c*ec; +o- control t*at c*ec;s and unc*ec;s itself w*en clic;ed Creates a t*ree3state c*ec; +o- control Creates a t*ree3state c*ec; +o- control t*at cHcles t*roug* t*ree statesR c*ec;ed unc*ec;ed and indeterminateRw*en clic;ed Creates a radio +utton control Creates a radio +utton control t*at w*en clic;ed c*ec;s itself and unc*ec;s ot*er radio +uttons in t*e group Creates a group +o- control

4n plus putem adauga urmatoarele valori ()I pe +iti) la stilul ferestrei controlului privitoare la linierea te-tului ce insoteste controlul:

Style ?(EF>1TT>%T

Description 8oves t*e te-t accompanHing a radio +utton or c*ec; +o- control from t*e

?(EI4:JT?DTT)N ?(EF>1T ?(EC>NT>I ?(EI4:JT ?(ET)& ?(EVC>NT>I ?(E?)TT)8 ?(E8DFT4F4N>

+uttonZs rig*t (t*e default) to its left (ame as ?(EF>1TT>%T Feft 0ustifies t*e +utton te-t in t*e control rectangle Centers t*e +utton te-t in t*e control rectangle Iig*t 0ustifies t*e +utton te-t in t*e control rectangle &ositions t*e +utton te-t at t*e top of t*e control rectangle &ositions t*e +utton te-t in t*e center of t*e control rectangle verticallH &ositions t*e +utton te-t at t*e +ottom of t*e control rectangle ,llows te-t too long to fit on one line to +e +ro;en into two or more lines

>-ista si alte tipuri de stiluri de +utoane dar care sunt folosite mai putin' Ae e-' ?(EN)T41O programeaza un +uton sa trimita notificarile ?NEA)D?F>CF4CS>A ?NES4FF1)CD( si ?NE(>T1)CD(' ?(E)WN>IAI,W creaza un +uton owner-draw (desenat de proprietar @ programatorul va scrie cod pentru acest lucru) R infatisarea (aparenta) +utonului este gestionata de parintele +utonului'

>utoane (us$
Dn pus* +utton este un control +uton creat cu stilul ?(E&D(J?DTT)N' Cind este apasat controlul trimite parintelui notificarea ?NECF4CS>A printr3un mesa0 W8EC)88,NA' 4n a+senta stilului ?(EN)T41O un asemenea control nu trimite nici un alt tip de notificare' 8acroul )NE?NECF4CS>A din 81C leaga notificarile ?NECF4CS>A de functia mem+ru din clasa fereastra parinte: )NE?NECF4CS>A(4ACE?DTT)N )n?uttonClic;ed) 1unctiile pentru ?NECF4CS>A nu au parametri si nu intorc valori'

C$ec& >o0es
C*ec; +o-es sunt +utoane create cu stilul ?(ECJ>CS?)% ?(E,DT)CJ>CS?)% ?(E3(T,T> sau ?(E,DT)3(T,T>' (tilurile ?(ECJ>CS?)% si ?(E,DT)CJ>CS?)% pot presupune doua stari: c*ec;ed si unc*ec;ed' Dn c*ec; +o- trece in starea c*ec;ed sau unc*ec;ed cu C8utton++SetC*ec(: :wndChecB6'7(SetChecB .6ST:CH/C;/D5; CC ChecB :wndChecB6'7(SetChecB .6ST:UNCH/C;/D5; CC UnchecB &entru a determina daca un c*ec; +o- este in starea c*ec;ed folosim C8utton++.etC*ec(' ) valoare de retur egala cu ?(TECJ>CS>A inseamna ca c*ce; +o-3ul este in starea c*ec;ed iar ?(TEDNCJ>CS>A este pt unc*ec;ed' C*ec; +o-es trimit notificarile ?NECF4CS>A parintilor lor cind facem clic; in zona lor' (tilul ?(E,DT)CJ>CS?)% face ca acest control sa lucreze ca un switc* on#off automatizat in raspuns la even' clic; mouse' (tilul ?(ECJ>CS?)% nu face acelasi lucru' Dn e-emplu de cod pentru un c*ec; +o- cu stilul ?(ECJ>CS?)% si ce tre+uie sa facem la ?NECF4CS>A: F'%d CMa%nW%nd'wGG$nChecB6'7C#%cBed .5 { :wndChecB6'7(SetChecB . :wndChecB6'7(GetChecB .5 << 6ST:CH/C;/D S 6ST:UNCH/C;/D G 6ST:CH/C;/D5; & (tilurile ?(E3(T,T> si ?(E,DT)3(T,T> creaza un c*ec; +o- care presupune o a treia stare numita nedeterminata (indeterminate) si controlul intra in aceasta stare cind facem clic pe un asemenea +uton iar starea lui curenta este c*ec;ed sau cind apelam SetC*ec( cu parametrul ?(TE4NA>T>I84N,T>: :wndChecB6'7(SetChecB .6ST:IND/T/"MINAT/5; Dn c*ec; +o- in starea indeterminate contine a gra7ed c*ec( mar(' ,ici pare sa lucreze o logica trivalenta <partiala= in sensul ca starea nu poate fi sigura nici c*ec;ed nici unc*ec;ed' (>-' selectam te-t in +old si ne+old')

>utoane :adio
Dn +uton radio este un control de tip +uton cu stilul ?(EI,A4)?DTT)N sau ?(E,DT)I,A4)?DTT)N' 4n mod normal +utoanele radio lucreaza in grup si reprezinta o lista de optiuni mutual e-clusive' Cind selectam un +uton radio cu stilul ?(E,DT)I,A4)?DTT)N va ramine activ numai +utonul selectat celelalte +utoane din grup devenind inactive in mod automat' Aaca folosim stilul ?(EI,A4)?DTT)N va tre+ui sa scriem noi cod pentru a dezactiva celelalte +utoane folosind functia C8utton++SetC*ec(' ?utoanele radio trimit notificarile ?NECF4CS>A parintilor lor la fel ca mai sus' Drmatorul cod trateaza ?NECF4CS>A: F'%d CMa%nW%nd'wGG$n"ad%'6utt'n0C#%cBed .5 { :wnd"ad%'6utt'n0(SetChecB .6ST:CH/C;/D5; :wnd"ad%'6utt'n2(SetChecB .6ST:UNCH/C;/D5; :wnd"ad%'6utt'n3(SetChecB .6ST:UNCH/C;/D5; :wnd"ad%'6utt'n4(SetChecB .6ST:UNCH/C;/D5; & Aeselectind (unc*ec;ing) celelalte +utoane radio mentine e-clusivitatea selectiei' Dn *andler (o fct') pentru ?NECF4CS>A nu este necesar pentru +utoanele cu stilul ?(E,DT)I,A4)?DTT)N' &entru +utoane radio cu stilul ?(E,DT)I,A4)?DTT)N pentru a deselecta corect alte +utoane din grup tre+uie sa grupam +utoanele in momentul crearii a'i' W sa stie care +utoane apartin grupului' &entru a crea un grup d e+utoane radio cu stilul ?(E,DT)I,A4)?DTT)N urmam urmatoarea procedura (te*nica): .' 4n codul aplicatiei cream +utoanele unul dupa altul fara a intercala intre acestea alte controale de alt tip' 2' &entru a marca inceputul grupului atri+uim stilul W(E:I)D& primului +uton radio pe care il cream' 3' Aaca cream controale aditionale dupa ultimul +uton radio din grup atri+uim stilul W(E:I)D& primului control aditional pe care il cream' Cream doua grupuri de cite L respectiv 3 +utoane radio cu stilul ?(E,DT)I,A4)?DTT)N cu un control c*ec; +o- intre ele: :wnd"ad%'6utt'n0(Create .:T .8C$M0851 WS:CHILD WS:G"$U! R 6S:AUT$"ADI$6UTT$N1 rect01 th%s1 :wnd"ad%'6utt'n2(Create .:T .8C$M2851 WS:CHILD 6S:AUT$"ADI$6UTT$N1 rect21 th%s1 IDC:C$M25; :wnd"ad%'6utt'n3(Create .:T .8C$M3851 WS:CHILD 6S:AUT$"ADI$6UTT$N1 rect31 th%s1 IDC:C$M35; :wnd"ad%'6utt'n4(Create .:T .8C$M4851 WS:CHILD 6S:AUT$"ADI$6UTT$N1 rect41 th%s1 IDC:C$M45; :wnd"ad%'6utt'n0(SetChecB .6ST:CH/C;/D5; R WS:*ISI6L/ R IDC:C$M05; R WS:*ISI6L/ R R WS:*ISI6L/ R R WS:*ISI6L/ R

:wndChecB6'7(Create .:T .8SaFe sett%ngs 'n e7%t851 WS:CHILD R WS:*ISI6L/ R WS:G"$U! R 6S:AUT$CH/C;6$L1 rectChecB6'71 th%s1 IDC:SA*/S/TTINGS5; :wnd"ad%'6utt'nT(Create .:T .8UV>>851 WS:CHILD R WS:*ISI6L/ R WS:G"$U! R 6S:AUT$"ADI$6UTT$N1 rectT1 th%s1 IDC:UV>>5; :wnd"ad%'6utt'nV(Create .:T .8044>>851 WS:CHILD R WS:*ISI6L/ R 6S:AUT$"ADI$6UTT$N1 rectV1 th%s1 IDC:044>>5; :wnd"ad%'6utt'nW(Create .:T .82??>>851 WS:CHILD R WS:*ISI6L/ R 6S:AUT$"ADI$6UTT$N1 rectW1 th%s1 IDC:2??>>5; :wnd"ad%'6utt'nT(SetChecB .6ST:CH/C;/D5;

?utoanele radio nu sunt niciodata c*ec;ed implicit' >ste responsa+ilitatea programatorului'

+roup >o0es
Dn control group +o- este creat cu stilul ?(E:I)D&?)%' ,cest control nu primeste si nici nu trimite mesa0e' (ingurul rol al lor este de a grupa anumite controale in interfata destinata utilizatorului'

Clasa C ist$ox
Clasa C3ist8o" din 81C incapsuleaza controalele list +o- care afiseaza o lista de stringuri numite articole' Dn list +o- optional poate sorta articolele pe care le contine si are implementata navigarea verticala optional si cea orizontala' Cind pe un item (articol) facem clic sau du+lu clic list +o-3urile (care au stilul F?(EN)T41O) notifica parintilor lor printr3un mesa0 W8EC)88,NA' 81C simplifica procesarea acestor mesa0e furnizind macro3ul )NEF?N in *arta de mesa0e care ruteaza notificarile list +o-3ului la functii din clasa fereastra parinte'' Dn list +o- standard afiseaza stringuri intr3o coloana verticala si permite ca un singur articol sa fie selectat la un moment dat' ,rticolul curent selectat este afisat in video invers cu culoarea sistem C)F)IEJ4:JF4:JT' Windows suporta un numar de variatii de la standardul initial variatii ce permit selectii multiple afisarea pe mai multe coloane list +o-3uri desenate de proprietar afisare de imagini in locul te-tului'

Crearea unui Dist >o0
Drmatoarea instructiune creaza un list +o- din o+iectul C3ist8o" numit mCwnd3ist8o": :wndL%st6'7(Create .WS:CHILD R WS:*ISI6L/ R L6S:STANDA"D1 rect1 th%s1 IDC:LIST6$L5; F?(E(T,NA,IA com+ina t*e stilurile W(E?)IA>I W(EV(CI)FF F?(EN)T41O si F?(E()IT pentru a crea un list +o- care are margini o +ara de scroll verticala care notifica parintilor sai cind selectia s3a sc*im+at sau s3a facut du+lu clic pe un articol si ca articolele vor fi sortate in ordine alfa+etica' 4mplicit +ara de scroll este vizi+ila numai cind articolele nu pot fi afisate in intregime in fereastra controlului' &entru a face ca +ara de scroll sa fie afisata tot timpul va tre+ui sa includem stilul F?(EA4(,?F>N)(CI)FF' , list +o- doesnZt *ave a vertical scroll +ar unless t*e stHle W(EV(CI)FF or F?(E(T,NA,IA is included' &utem crea list +o-3uri care cuprind toata zona client' Fist +o-3urile au incapsulata interfata cu tastatura (tastele sageti page up down apasarea unui caracter muta selectia pe articolul care incepe cu acel caracter' ,pasarea +arei de spatiu face sa avem selectie multipla sau nu (on#off)' &utem programa interfata cu tastatura prin includerea stilului F?(EW,NTS>O?),IA4N&DT si procesarea mesa0elor W8EVS>OT)4T>8 si W8ECJ,IT)4T>8' ) aplicatie 81C poate mapa aceste mesa0e cu fct' n<Ge75o%tem si nC*ar5o%tem folosind macro3urile )NEW8EVS>OT)4T>8 si )NEW8ECJ,IT)4T>8' ) clasa list +o- derivata poate manipula aceste mesa0e singura prin suprascrierea functiilor virtuale C3ist8o"++<Ge75o%tem si C3ist8o"++C*ar5o%tem. ) utilizarae a acestei proprietati este de a crea clase list +o-3uri self3contained list +o- class care raspund la Ctrl3A prin stergerea articolului curent selectat' Dist >o0 StAles Style F?(E(T,NA,IA F?(E()IT F?(EN)(>F F?(EN)T41O Description Creates a astandarda list +o- t*at *as a +order and a vertical scroll +ar notifies its parent window w*en t*e selection c*anges or an item is dou+le3clic;ed and sorts items alp*a+eticallH' (orts items t*at are added to t*e list +o-' Creates a list +o- w*ose items can +e viewed +ut not selected' Creates a list +o- t*at notifies its parent w*en t*e selection c*anges or an item is dou+le3clic;ed'

F?(EA4(,?F>N)(C I)FF

Aisa+les t*e list +o-Zs scroll +ar w*en it isnZt needed' Wit*out t*is stHle an unneeded scroll +ar is *idden rat*er t*an disa+led' F?(E8DFT4&F>(>F Creates a multiple3selection list +o-' F?(E>%T>NA>A(>F ,dds e-tended selection support to a multiple3selection list +o-' F?(E8DFT4C)FD8N Creates a multicolumn list +o-' F?(E)WN>IAI,WV,I4,?F> Creates an owner3draw list +o- w*ose items can varH in *eig*t' F?(E)WN>IAI,W14%>A Creates an owner3draw list +o- w*ose items are t*e same *eig*t' F?(ED(>T,?(T)&( Configures t*e list +o- to e-pand ta+ c*aracters in item te-t' F?(EN)I>AI,W Creates a list +o- t*at doesnZt automaticallH redraw itself w*en an item is added or removed' F?(EJ,((TI4N:( Creates a list +o- t*at aremem+ersa t*e strings added to it' Conventional list +o-es *ave t*is stHle +H default/ owner3draw list +o-es donZt' F?(EW,NTS>O?),IA4N&DT Creates a list +o- t*at sends its parent a W8EVS>OT)4T>8 or W8ECJ,IT)4T>8 message w*en a ;eH is pressed' T*is stHle is used to customize t*e list +o-Zs response to ;eH+oard input' F?(EN)4NT>:I,FJ>4:JT ,llows a list +o- to assume anH *eig*t' ?H default Windows sets a list +o-Zs *eig*t to a multiple of t*e item *eig*t to prevent items from +eing partiallH clipped' &entru ca fontul implicit pe care W il foloseste pt list +o-3uri este proportional spatiat virtual este imposi+il de a alinia coloanele prin spatii' ) modalitate de a crea liste ce contin informatii pe mai multe coloane este sa folosim (et1ont pt a aplica un font fi-ed3pitc* la un list +o-' ) solutie mai +una este de a asigna list +o-Gurilor stilul F?(ED(>T,?(T)&( si de a separa coloanele de informatii cu ta+' Dn list +o- cu stilul F?(ED(>T,?(T)&( trateaza caracterele ta+ ca un procesor de te-te' 4mplicit ta+ este de marimea a $ caractere pentru latime' &utem sc*im+a acest lucru cu fct' C3ist8o"++Set5abStops. Set5abStops masoara distanta in unitati de dialog I o patrime din latimea unui caracter in fontul sistem. 4nstructiunea: :wndL%st6'7(SetTaHSt'ps .V45; pune spatiul dintre ta+3uri la CL unitati de dialog and %nt nTaHSt'psOP < { 321 4?1 V41 02? &; :wndL%st6'7(SetTaHSt'ps .41 nTaHSt'ps5; plaseaza stop ta+3uri la 32 L$ CL si .2$ unitati de dialog fata de marginea din stinga' 4mplicit un list +o- se redeseneaza singur cind este adaugat#sters un articol' &entru a impiedica acest lucru putem seta stilul F?(EN)I>AI,W' ) asemenea lista va fi redesenata cind zona ei client va fi invalidata' ) alta alternativa este de a in*i+a procesul de actualizare cu F?(EN)I>AI,W si a3l reactiva dupa ce ultimul articol din list +o- a fost adaugat' &utem face redesenarea ena+le#disa+le prin trimiterea mesa0ului si nu mai este necesar 4nvalidate() :wndL%st6'7(SendMessage .WM:S/T"/D"AW1 )ALS/1 >5; CC D%saH#e redraws( :wndL%st6'7(SendMessage .WM:S/T"/D"AW1 T"U/1 >5; CC /naH#e redraws( (tilul F?(E8DFT4&F>(>F este folosit pentru selectii multiple' Cele mai multe list +o-3uri sunt create cu stilul F?(E>%T>NA>A(>F care permite selectii e-tinse' Cu un asemenea stil se fac selectii cu a0utorul mouse3ului si a tastei Ctrl (pe sarite) sau (*ift (selectie contigua) (se poate com+ina Ctrl si (*ift)' (tilul F?(E8DFT4C)FD8N creaza un list +o- cu mai multe coloane (implicit .C car per art') care in mod normal au si stilul W(EJ(CI)FF pentru defilare orizontala' Fist ?o-3urile multicoloana nu pot avea +ara verticala pentru scroll' Fatimea coloanei se a0usteaza cu functia C3ist8o"++SetColumn6idt*.

Adau%area si Ster%erea articolelor
,rticolele sunt adaugate cu fct' C3ist8o"++AddString si C3ist8o"++%nsertString' 4nstructiunea: :wndL%st6'7(AddStr%ng .str%ng5; adauga un o+' C(tring la list +o-' Aaca stilul include F?(E()IT at' art' e pozitionat corespunzator ordinii de sortare alfa+etice altfel este adaugat la sfirsitul listei' %nsertString adauga art' la o pozitie indicata de primul parametru al fct' (zero3+ased inde-): :wndL%st6'7(InsertStr%ng .31 str%ng5; F?(E()IT nu are efect asupra stringurilor adaugate cu %nsertString' ,m+ele functii AddString si %nsertString intorc pozitia stringului din list +o-' 4n caz de esec se returneaza F?E>II(&,C> pentru a indica ca un list +o- este plin sau F?E>II pt' a indica ca s3a intimplat altceva din diverse motive' Capacitatea unui list +o- este limitata numai de memoria disponi+ila' 1unctia C3ist8o"++.etCount returneaza numarul art' dintr3un list +o-' 1ct' C3ist8o"++/eleteString elimina un articol dintr3un list +o- articol identificat prin inde-ul sau' 4ntoarce numarul articolelor ramase in list +o-' &entru a sterge toate art' fol' fct' C3ist8o"++BesetContent' Aaca dorim sa asociem un pointer pe 32 +iti sau o valoare AW)IA cu un articol din list +o- putem folosi fct' C3ist8o"++Set%tem/ata-tr sau C3ist8o"++Set%tem/ata' Dn pointer sau un AW)IA asociat cu un art' poate fi regasit cu fct' C3ist8o"++.et%tem/ata-tr sau C3ist8o"++.et%tem/ata' ) folosire a acestei trasaturi este de e-' de a asocia o structura de date @ce contine nr' de telefon @ pentru persoanele dintr3un list +o-' Ain cauza ca .et%tem/ata-tr intoarce un pointer la void tre+uie facuta conversia' ) alta te*nica este de a asocia e-tra date @ in particular te-t @ cu art' dintr3un list +o- s acream un list +o- cu stilul F?(ED(>T,?(T)&( sa setam primul ta+ stop la o pozitie din afara marginii drepte a list +o-3ului si din a adauga stringuri ce contin car ta+ urmate de e-tra data (te-t)' Te-tul de la dreapta ta+3ului va fi invizi+il dar C3ist8o"++.et5e"t va returna intregul te-t deci si cel e-tra'

Cautarea si re%asirea articolelor
C3ist8o"++.etCurSel intoarce inde-ul (G3+ased) al articolului care este selectat' Aaca valoarea returnata este F?E>II inseamna ca nu s3a selectat nimic' .etCurSel este adesea apelata ca urmare a unei notificari ce semnifica ca selectia s3a sc*im+at sau a fost facut du+lu clic pe un articol' Dn program poate seta selectia curenta cu SetCurSel. &asind valoarea @. pt' SetCurSel vom deselecta toate articolele. &entru a gasi daca un art particular este selectat folosim C3ist8o"++.etSel' SetCurSel identifica un articol prin inde-ul sau dar art' pot fi selectate si dupa continut cu fct' C3ist8o"++SelectString care realizeaza o singura selectie pentru un articol ce incepe cu te-tul specificat si selecteaza art' daca se gaseste unul care satisface conditia' 4nstructiunea :wndL%st6'7(Se#ectStr%ng .D01 :T .8T% es855; incepe cautarea cu primul art din list +o- si va selecta primul art care incepe cu Times' Cautarea nu este case senzitive' &rimul parametru indica inde-ul de unde incepe cautarea/ 3. inseamna de la inceput' 4ndiferent de unde incepe cautarea aceasta poate sa parcurga circular intreaga lista asociata list +o-3ului daca este necesar' &entru a cauta pentru un art' particular fara a sc*im+a selectia vom folosi C3ist8o"++0indString sau C3ist8o"++0indString4"act' 0indString face cautare numai pe primele caractere din art' Aaca se intoarce F?E>II inseamna ca nu s3a gasit acel art altfel se intoarce inde-ul art' 0indString4"act adauga in plus cautarea e-acta' Cu inde-ul o+tinut anterior putem ao+tine te-tul art' cu C3ist8o"++.et5e"t' (e copie te-tul art' in var' string' CStr%ng str%ng; %nt nInde7 < :wndL%st6'7(GetCurSe# .5; %f .nInde7 9< L6:/""5 :wndL%st6'7(GetTe7t .nInde71 str%ng5;

,l doilea parametru este un pointer la c*ar' &utem folosi C3ist8o"++.et5e"t3en pentru a determina marimea zonei necesare pentru a primi te-tul art' inainte de a apela :etTe-t' (electiile multiple sunt tratate diferit' .etCurSel SetCurSel si SelectString nu pot fi folosite in acest caz' ,rt' sunt selectate (deselectate) cu fct' SetSel si Sel%temBange. 4n continuare se selecteaza art' cu indecsii G " C b $ si ! si deselecteaza art' 3: :wndL%st6'7(SetSe# .>5; :wndL%st6'7(Se#Ite "ange .T"U/1 T1 U5; :wndL%st6'7(SetSe# .31 )ALS/5; Alte functii+ .etSelCount pt' determinarea nr' art' selectate .etSel%tems pentru regasirea indecsilor art' selectate' 4ntr3un list +o- cu selectie multipla dreptung*iul ce reprezinta art' cu focus3ul asupra lui poate fi mutat fara a sc*im+a selectia curenta' Areptung*iul care are focusul poate fi mutat sau o+tinut cu fct' SetCaret%nde" si .etCaret%nde"' 8ulte din fct' ce lucreaza cu o singura selectie sunt disponi+ile si pentru list +o-3urile cu sele' multipla: .et5e"t .et5e"t3engt* 0indString si 0indString4"act.

*otificarile Dist >o0
Notificarile sunt trimise via mesa0ul W8EC)88,NA' 4n app' 81C notificarile list +o-3urilor sunt mapate la functiile din clasa cu macro3ul )NEF?Nc'Vezi ta+elul de mai 0os' Notific7rile F?NEA?FCFS F?NE(>FCJ,N:> si F?NE(>FC,NC>F sunt trimise numai daca list +o-3ul a fost creat cu stilul F?(EN)T41O sau F?(E(T,NA,IA' Dist >o0 *otifications Notification F?NE(>T1)CD( F?NES4FF1)CD( F?NE>II(&,C> Sent W%en "essage-"ap "acro )NEF?NE(>T1)CD( )NEF?NES4FF1)CD( )NEF?NE>II(&,C> )NEF?NEA?FCFS )NEF?NE(>FCJ,N:> )NEF?NE(>FC,NC>F No No No Oes Oes Oes $S&N'T(#) *e+uired,

T*e list +o- gains t*e input focus' T*e list +o- loses t*e input focus' ,n operation failed +ecause of insufficient memorH' F?NEA?FCFS ,n item is dou+le3clic;ed' F?NE(>FCJ,N:> T*e selection c*anges' F?NE(>FC,NC>F T*e selection is canceled'

Notificarile cele mai folosite sunt: F?NEA?FCFS si F?NE(>FCJ,N:>' &entru a determina inde-ul articolului pe care s3a facut du+lu clic intr3un list +o- cu o singura selectie folosim C3ist8o"++.etCurSel' Vezi e-' CC In CMa%nW%nd'wXs essage ap $N:L6N:D6LCL; .IDC:LIST6$L1 $nIte D'uH#eC#%cBed5 F'%d CMa%nW%nd'wGG$nIte D'uH#eC#%cBed .5 { CStr%ng str%ng; %nt nInde7 < :wndL%st6'7(GetCurSe# .5; :wndL%st6'7(GetTe7t .nInde71 str%ng5; Message6'7 .str%ng5; & &entru un F? cu selectie multipla folosim .etCaret%nde" in locul fct' .etCurSel pentru a determina articolul pe care s3a facut du+lu clic' Notificarea F?NE(>FCJ,N:> este trimisa cind utilizatorul sc*im+a selectia dar nu si in cazul cind selectia este sc*im+ata automat prin program' Dn F? cu selectie simpla trimite notificarea F?NE(>FCJ,N:> cind selectia se muta din cauza unui clic sau a apasarii unei taste' 4ntr3un F? cu sel' multipla notificarea F?NE(>FCJ,N:> este trimisa cind se face clic pe un art' cind starea selectiei art' este modificata (on#off) si cind dreptung*iul care are focus3ul este mutat'

Clasa CStatic
CStatic reprez' un control static creat din a(T,T4Ca WNACF,((' >-ista trei tipuri de C(: te-t (folosit pentru a etic*eta alte controale) dreptung*iuri si imagini' :wndStat%c(Create .:T .8Na e851 WS:CHILD R WS:*ISI6L/ R SS:L/)T1 rect1 th%s1 IDC:STATIC5; ((EF>1T Q aliniaza te-t in stinga' Aaca te-tul nu incape se continua pe linia urmatoare' &t' a preveni trecerea te-tului pe linia urm' putem folosi stilul ((EF>1TN)W)IAWI,& in locul lui ((EF>1T' ,lte stiluri: ((EC>NT>I sau ((EI4:JT' (tilul ((E(48&F> este asemanator cu ((EF>1T dar creaza un control al carui te-t poate fi modificat cu C6nd++Set6indow5e"t' &t' a centra vertical te-tul facem )I pe flagul ((EC>NT>I48,:>' (((E(DNS>N pentru desenarec) C( pt' desenat dreptug*iuri' (tilul poate fi ales din urmatoarele: Style ((E?F,CS1I,8> ((E?F,CSI>CT ((E>TCJ>A1I,8> ((E>TCJ>AJ)IX ((E>TCJ>AV>IT ((E:I,O1I,8> ((E:I,OI>CT ((EWJ4T>1I,8> ((EWJ4T>I>CT 4nstructiunea: :wndStat%c(Create .:T .8851 WS:CHILD R WS:*ISI6L/ R SS:/TCH/D)"AM/1 rect1 th%s1 IDC:STATIC5; creaza un C( asemanator cu grup +o-' Dn C( dreptung*i nu afiseaza te-t' C( pt' imagini formate din +itmap3uri icoane cursoare sau metafisiere :A4' (tilurile folosie in acest caz sunt: Style ((E?4T8,& ((E>NJ8>T,14F> ((E4C)N Description , static control t*at displaHs a +itmap , static control t*at displaHs a metafile , static control t*at displaHs an icon or a cursor Description Jollow rectangle painted in t*e sHstem color C)F)IEW4NA)W1I,8> (default Q +lac;) (olid rectangle painted in t*e sHstem color C)F)IEW4NA)W1I,8> (default Q +lac;) Jollow rectangle wit* etc*ed +orders Jollow rectangle wit* etc*ed top and +ottom +orders Jollow rectangle wit* etc*ed left and rig*t +orders Jollow rectangle painted in t*e sHstem color C)F)IE?,CS:I)DNA (default Q graH) (olid rectangle painted in t*e sHstem color C)F)IE?,CS:I)DNA (default Q graH) Jollow rectangle painted in t*e sHstem color C)F)IEW4NA)W (default Q w*ite) (olid rectangle painted in t*e sHstem color C)F)IEW4NA)W (default Q w*ite)

Aupa ce se creaza un control static imagine asociem +itmap icoana sau cursor cu fct' Set8itmap Set4n*2eta0ile Set%con sau SetCursor. 4nstructiunile: :wndStat%c(Create .:T .8851 WS:CHILD R WS:*ISI6L/ R SS:IC$N1 rect1 th%s1 IDC:STATIC5; :wndStat%c(SetIc'n .hIc'n5;

creaz un C( care afis' o icoana si ii atasam icoana cu (et4con' Areptug*iul este marit automat pentru a cuprinde imaginea' >-ista o serie de falg3uri care pot fi folosite pentru a controla modul de afisare al imaginii in control (((EC>NT>I48,:> Q are ca cerinta ma0ora drept' de afisare tr' sa fie destul de mare pentru a cuprinde imaginea) 4mplicit un C( nu trimite mesa0e de notificare' Aaca se creaza C( cu stilul ((EN)T41O at' C( trimite urm' notificari: Static Control *otifications Notification Sent W%en (TNECF4CS>A T*e control is clic;ed' (TNEA?FCFS T*e control is dou+le3clic;ed' (TNEA4(,?F> T*e control is disa+led' (TNE>N,?F> T*e control is ena+led' "essage-"ap "acro )NE(TNECF4CS>A )NE(TNEA?FCFS )NE(TNEA4(,?F> )NE(TNE>N,?F>

Notificarile (TNECF4CS>A si (TNEA?FCFS permit crearea de C( care raspund la clic3uri de mouse ca in e-': CC In CMa%nW%nd'wXs essage ap $N:STN:CLIC;/D .IDC:STATIC1 $nC#%cBed5 CC In CMa%nW%nd'wGG$nCreate :wndStat%c(Create .:T .8C#%cB e851 WS:CHILD R WS:*ISI6L/ R SS:C/NT/" R SS:C/NT/"IMAG/ R SS:N$TI)I R SS:SUN;/N1 rect1 th%s1 IDC:STATIC5; F'%d CMa%nW%nd'wGG$nC#%cBed .5 { :wndStat%c(!'stMessage .WM:CL$S/1 >1 >5; &

Clasa C-dit 1C=2
C4dit din 81C incapsuleaza functionalitatea unui control de editare folosit pt' a edita te-t: pe o singura linie sau pe mai multe linii' Xona client din Notepad este un control de editare multilinie' Dn control de editare este limitat la CG S? te-t' Aaca e nevoie de mai mult te-t vom folosi un control I4CJ >A4T (im+ogatit)'

Crearea unui control =dit
Aaca mCwnd4dit este un o+iect C4dit instructiunea :wnd/d%t(Create .WS:CHILD R WS:*ISI6L/ R WS:6$"D/" R /S:AUT$HSC"$LL1 rect1 th%s1 IDC:/DIT5; creaza un control single line care face scroll orizontal automat daca te-tul nu incape in zona de afisare' 4ncluzind stilul >(E8DFT4F4N> vom crea un C> multilinie: :wnd/d%t(Create .WS:CHILD R WS:*ISI6L/ R WS:6$"D/" R WS:HSC"$LL R WS:*SC"$LL R /S:MULTILIN/1 rect1 th%s1 IDC:/DIT5;

W(EJ(CI)FF si W(EV(CI)FF adauga +arele de scroll vertical si orizontal' &utem folosi C4dit++SetBect sau C4dit++SetBect$- pt' a defini zona edita+ila a controlului independent de marginile controlului' ) utilizare pt' aceste functii este de a defini marimea paginii care ramine constanta c*iar daca controlul este redimensionat' &utem folosi de asemenea C4dit++Set2argins pentru a specifica latimea (in pi-eli) marginii stg si dreapta' 4mplicit latimile marginilor sunt G' Cind este prima data creat un C> va accepta numai 3G GGG caractere' &utem modifica acest lucru cu C4dit++3imit5e"t sau C4dit++Set3imit5e"t' Drmatoarea instructiune seteaza nr' ma- de car' la 32: :wnd/d%t(SetL% %tTe7t .325; Cind folosim un C> multilinie Set3imit5e"t limiteaza cantitatea totala de te-t din control deci nu lungimea fiecarei linii' 4n acest caz putem controla lungimea liniei numai manual' ) metoda este de a folosi Set0ont pt a comuta fontul C> la un font fi-ed3pitc* si C4dit++SetBect pt a specifica dreptung*iul de formatare a carui latime este un pic mai mare decit latimea caracterelor din font inmultita cu nr' de caractere dorit a se afisa pe o linie' =dit Control StAles Style >(EF>1T >(EC>NT>I >(EI4:JT >(E,DT)J(CI)FF >(E,DT)V(CI)FF >(E8DFT4F4N> >(EF)W>IC,(> >(ED&&>IC,(> >(E&,((W)IA >(EI>,A)NFO >(EN)J4A>(>F >(E)>8C)NV>IT >(EW,NTI>TDIN Description Feft3aligns te-t in t*e control' Centers te-t in t*e control' Iig*t3aligns te-t in t*e control' &ermits t*e edit control to scroll *orizontallH wit*out a *orizontal scroll +ar' To add a *orizontal scroll +ar include t*e stHle W(EJ(CI)FF' &ermits t*e edit control to scroll verticallH wit*out a vertical scroll +ar' To add a vertical scroll +ar include t*e stHle W(EV(CI)FF' Creates a multiline edit control' AisplaHs all c*aracters in lowercase' AisplaHs all c*aracters in uppercase' AisplaHs asteris;s instead of tHped c*aracters' Creates an edit control w*ose te-t canZt +e edited' &revents t*e edit control from *iding t*e selection w*en t*e control loses t*e input focus' &erforms an ,N(43to3)>83to3,N(4 conversion on all c*aracters tHped into t*e control so t*at t*e application wonZt get une-pected results if it performs an ,N(43to3)>8 conversion of its own' )+solete' &rograms t*e >nter ;eH to insert line +rea;s instead of invo;ing t*e default pus* +utton for multiline edit controls used in dialog +o-es'

) alta functie folositoare pt a initializa un C> este C4dit++Set5abStops care seteaza spatiile dintre ta+Euri' 4mplicit ta+ stopul este de $ caractere' Ca si C3ist8o"++Set5abStops C4dit++Set5abStops masoara distanta in unitati de dialog'

/nserarea si :e%asirea "e0tului
Te-tul se insereaza cu Set6indow5e"t si se regaseste cu .et6indow5e"t' C4dit mosteneste am+ele functii din clasa de +aza C6nd' 4nstructiunea :wnd/d%t(SetW%nd'wTe7t .:T .8He##'1 M)C855; insereaza te-tul aJello 81Ca in controlul mCwnd4dit si :wnd/d%t(GetW%nd'wTe7t .str%ng5; regaseste te-tul intr3un o+iect CString numit string' .et6indow5e"t si Set6indow5e"t lucreaza cu am+ele tipuri de controale single line si multiline' Te-tul inserat cu Set6indow5e"t inlocuieste te-tul e-istent iar .et6indow5e"t

returneaza tot te-tul din control c*iar daca acesta este pe mai multe linii' &t' a stegte te-tul apelam Set6indow5e"t cu un sir nul: :wnd/d%t(SetW%nd'wTe7t .:T .8855; &utem insera te-t fara a stege cel e-istent cu C4dit++BeplaceSel' Aaca unul sau mai multe caractere sunt selectate cind apelam BeplaceSel te-tul care se insereaza inlocuieste te-tul selectat in caz contrar te-tul este inserat la pozitia curenta a cursorului (caret3ului)' Dn control multiline insereaza line +rea; automat' Aaca dorim sa determinam line +rea;3urile dintr3un te-t folosim C4dit++0mt3ines pt a face ena+le soft line +rea;s inainte de apelul lui .et6indow5e"t: :wnd/d%t() tL%nes .T"U/5; Cu soft line +rea;s ena+led fiecare linie este delimitata cu doua CI (G-.3) urmat de un F1 (G-.G)' &t' a invalida soft line +rea; folosim 0mt3ines) 1,F(>): :wnd/d%t() tL%nes .)ALS/5; CI introdus in te-t la apasarea tastei d>nterK sunt semnificate de o perec*e CI#F1' 0mt3ines nu afecteaza modul de afisare al te-tului intr3un C> multilinie ci afecteaza numai modul cum este memorat intern te-tul si formateaza te-tul regasit cu .et6indow5e"t' &entru a citi e-act o linie de te-t dintr3un control multilinie folosim C4dit++.et3ine' .et3ine copie continutul unei linii intr3un +uffer pe care tre+uie sa3l alocam si apoi furnizam functiei adresa acestuia' Finia este identificata de un inde- G3+ased' 4nstructiunea: :wnd/d%t(GetL%ne .>1 p6uffer1 n6ufferS%Je5; copie prima linie din control in zona data de p?uffer iar par' 3 indica dimensiunea +uff' in +Htes' .et3ine returneaza numarul de octeti copiati in +uffer' &utem determina dinaninte marimea necesara a +uff' cu fct' C4dit++3ine3engt*! iar numarul de linii din control il det' cu fct' C4dit++.et3ineCount' .et3ineCount nu returneaza niciodata G c*iar daca nu e-ista te-t valoarea returnata este .'

Clear, Cut, CopA, (aste, and Lndo
C4dit furnizeaza functii pentru operatiile enumerate mai sus' 4nstructiunea: :wnd/d%t(C#ear .5; sterge te-tul selectat fara a afecta continutul clip+oard3ului'4nstructiunea: :wnd/d%t(Cut .5; sterge te-tul selectat si il copie in clip+oard'4nstructiunea: :wnd/d%t(C'py .5; copie te-tul selectat in clip+oard fara a3l sterge' &utem interoga C> pt' selectia curenta cu un apel al fct' C4dit++.etSel care returneza o valoare AW)IA ce contine doi intregi pe .C +iti ce specifica inde-ul de inceput si inde-ul de sfarsit al selectiei' Aaca indecsii sunt egali nu e-ista te-t selectat' >-ista o forma a fct' .etSel care copie indecsii in doi intregi ale caror adrese sunt pasate ca parametrii prin referinta' &utem adauga urmatoare functie %s5e"tSelected la clasa controlului de editare derivat din C>dit pentru a determina daca e-ista sau nu te-t selectat in control: 6$$L CMy/d%tGGIsTe7tSe#ected .5 { %nt nStart1 n/nd;

GetSe# .nStart1 n/nd5; return .nStart 9< n/nd5; & C4dit++Cut and C4dit++Cop7 nu fac nimic daca nu este te-t selectat' Te-tul poate fi selectat prin program cu C4dit++SetSel' 4nstructiunea: :wnd/d%t(SetSe# .0>>1 0T>5; selecteaza "G de caractere incepind cu al .G.3lea caracter si o face vizi+ila in view daca aceasta nu este vizi+ila (se face scroll automat)' &t' a preveni defilarea (scrolling) vom folosi si al 33lea param' al functiei cu valoarea TID>' Cind facem selectii prin program intrGun control multilinie este necesar adesea sa convertim un numar de linie si posi+il un offset din interiorul acestei linii intr3un inde- pe care3l vom folosi in SetSel' 1unctia C4dit++3ine%nde" accepta un numar de linie G3+ased si returneaza inde-ul primului caracter din acea linie' 4n e-' care urmeaza se determina inde-3ul primului caracter din linia $ (Fine4nde-) apoi determinam lungimea liniei si selectam tot te-tul care se gaseste in acea linie ((et(el): %nt nStart < :wnd/d%t(L%neInde7 .W5; %nt nLength < :wnd/d%t(L%neLength .nStart5; :wnd/d%t(SetSe# .nStart1 nStart K nLength5; C4dit furnizeaza fct' 3ine0romC*ar pt' a calcula numarul liniei plecind de la inde-3ul unui caracter' C4dit++-aste pastes te-t intr3un C>' :wnd/d%t(!aste .5; Aaca clip+oard3ul nu contine te-t C4dit++-aste nu are efect' Aaca nu e-ista te-t selectat cind se apeleaza -aste se insereaza te-tul din clip+oard la pozitia curenta a caret3ului' Aaca e-ista o selectie atunci te-tul din clip+oard inlocuieste selectia e-istenta' &utem determina din timp daca e-ista te-t in clip+oard printr3un apel al fct' ++%sClipboard0ormatAvailable' 4nstructiunea: 6$$L HCan!aste < GGIsC#%pH'ard)'r atAFa%#aH#e .C):T/LT5; seteaza bCan-aste la o val' V G daca e-ista te-t in clip+oard sau G in caz contrar' ) alta trasatura a unui C> este posi+ilitatea roll +ac;3ului (undo)' reface ultima stergere: :wnd/d%t(Und' .5; (e poate determina din timp daca am putea apela #ndo prinapelul fct' C4dit++Can#ndo' ) alta fct' C4dit++4mpt7#ndo8uffer reseteaza manual flag3ul pentru undo a'i' urmatoarele apeluri la Dndo nu vor face nimic'

*otificarile Controlului de =ditare
4n app' 81C notificarile sunt mapate cu macro3uri de forma )NE>N in *arta de mesa0e a clasei' 4n e-' urm' se trateaza notificarea (mesa0) >NECJ,N:> a unui C>' Dn control de tip pus* +uton (mCwnd-us*8utton) este facut ena+le#disa+le dupa cum e-ista#nu e-ista te-t in C> cu 4AQ4ACE>A4T si dat de o+' (mCwnd4dit) : ## 4n C8ainWindowZs message map $N:/N:CHANG/ .IDC:/DIT1 $nUpdate!ush6utt'n5 F'%d CMa%nW%nd'wGG$nUpdate!ush6utt'n .5 { :wnd!ush6utt'n(/naH#eW%nd'w . :wnd/d%t(L%neLength .55;

& =dit Control *otifications Notification Sent W%en >NED&A,T> T*e controlZs te-t is a+out to c*ange' >NECJ,N:> T*e controlZs te-t *as c*anged' >NES4FF1)CD( T*e edit control loses t*e input focus' >NE(>T1)CD( T*e edit control receives t*e input focus' >NEJ(CI)FF T*e edit control is scrolled *orizontallH using a scroll +ar' >NEV(CI)FF T*e edit control is scrolled verticallH using a scroll +ar' >NE8,%T>%T , c*aracter canZt +e entered +ecause t*e edit control alreadH contains t*e num+er of c*aracters specified wit* C4dit++3imit5e"t or C4dit++Set3imit5e"t' T*is notification is also sent if a c*aracter canZt +e entered +ecause t*e caret is at t*e rig*t or t*e +ottom edge of t*e controlZs formatting rectangle and t*e control doesnZt support scrolling' >NE>II(&,C> ,n operation fails +ecause of insufficient memorH' "essage-"ap "acro )NE>NED&A,T> )NE>NECJ,N:> )NE>NES4FF1)CD( )NE>NE(>T1)CD( )NE>NEJ(CI)FF )NE>NEV(CI)FF )NE>NE8,%T>%T

)NE>NE>II(&,C>

Clasa CCo.bo$ox 1control co#bo bo02
Dn C? este format dintr3un C> si un F?' Tipuri de Com+o +o-3uri: simple drop3down si drop3down list' C> si#ple (stil C?(E(48&F>) sunt cele mai putin folosite' Trasatura principala a acestora este ca sunt permanent afisate' Cind un utilizator selecteaza un art din lista ac' art' este automat copiat in C>' Dtilizatorul poate tipari te-t direct in C>' Aaca te-tul se potriveste cu un art din lista art este automat pus pe video invers si se e-ecuta scroll3ul ' Ln C> drop)down (stil C?(EAI)&A)WN) difera de un C? simplu prin aceea ca lista este afisata numai la cererea utilizatorului si nu permite introducerea de te-t in C> asociat' Ln C> drop)down list (stil C?(EAI)&A)WNF4(T) are in plus fata de C? drop3down +ara de navigare verticala' (tilurile se dau in functia Create or Create4" ' ,lte stiluri e-ista pentru cosmetizarea C?' Cind cream un C? tre+uie sa punem stilul W(EV(CI)FF daca dorim scroll vertical ' Aaca mCwndCombo8o" este un o+iect CCombo8o" instructiunea: :wndC' H'6'7(Create .WS:CHILD R WS:*ISI6L/ R WS:6$"D/" R WS:*SC"$LL R C6S:D"$!D$WNLIST R C6S:S$"T1 rect1 th%s1 IDC:C$M6$6$L5; ceara un C? drop3down list care contine +ara pt' scroll vertical' Aimensiunea controlului (dreptung*iul) tre+uie sa fie destul de mare pt' a afisa tot te-tul' Co#bo >o0 StAles Style C?(E,DT)J(CI)FF C?(EA4(,?F>N)(CI)FF C?(EAI)&A)WN C?(EAI)&A)WNF4(T Description >na+les *orizontal scrolling in t*e edit control portion of a com+o +o-' Aisa+les t*e com+o +o- list +o-Zs scroll +ar w*en it isnZt needed' Wit*out t*is stHle an unneeded scroll +ar is *idden rat*er t*an disa+led' Creates a drop3down com+o +o-' Creates a drop3down list com+o +o-'

C?(EJ,((TI4N:( C?(EF)W>IC,(> C?(EN)4NT>:I,FJ>4:JT C?(E)>8C)NV>IT

C?(E)WN>IAI,W14%>A C?(E)WN>IAI,WV,I4,?F> C?(E(48&F> C?(E()IT C?(ED&&>IC,(>

Creates a com+o +o- t*at aremem+ersa t*e strings added to it' Conventional com+o +o-es *ave t*is stHle +H default/ owner3draw com+o +o-es donZt' 1orces all te-t in t*e com+o +o- to lowercase' &revents t*e com+o +o-Zs list +o- *eig*t from *aving to +e an e-act multiple of t*e item *eig*t' , com+o +o- w*ose edit control performs an ,N(43to3)>83to3 ,N(4 conversion on all c*aracters so t*at t*e application wonZt get une-pected results if it performs an ,N(43to3)>8 conversion of its own' )+solete' Creates an owner3draw com+o +o- w*ose items are all t*e same *eig*t' Creates an owner3draw com+o +o- w*ose items can varH in *eig*t' Creates a simple com+o +o-' ,utomaticallH sorts items as t*eH are added' 1orces all te-t in t*e com+o +o- to uppercase'

>-ista asemanari intre fct din C> si F?' ,daugare art se face cu CCombo8o"++AddString si CCombo8o"++%nsertString' Nr' ma-' de car' pt' C> al C? este setat cu CCombo8o"++3imit5e"t' 1ct' .et6indow5e"t si Set6indow5e"t lucreaza pt' C> al C?' 1unctii specifice: .et385e"t care regaseste te-tul unui art' identificat printr3un inde- G3+ased' .et385e"t3en returneaza lung' unui art' in caractere/ S*ow/rop/own afiseaza sau ascunde un C? drop3down list/ .et/roppedState returneaza o valoare ce indica daca C? drop3down list este afisat'

*otificari Co#bo >o0
Co#bo >o0 *otifications Notification C?NEAI)&A)WN (ent w*en t*e drop3down list is displaHed' C?NECF)(>D& (ent w*en t*e drop3down list is closed' C?NEA?FCFS (ent w*en an item is dou+le3clic;ed' C?NE(>FCJ,N:> (ent w*en t*e selection c*anges' C?NE(>F>NA)S (ent w*en a selection is made' C?NE(>F>NAC,NC>F (ent w*en a selection is canceled' C?NE>A4TD&A,T> (ent w*en t*e te-t in t*e edit control is a+out to c*ange' C?NE>A4TCJ,N:> (ent w*en t*e te-t in t*e edit control *as c*anged' C?NES4FF1)CD( (ent w*en t*e com+o +o- loses t*e input focus' C?NE(>T1)CD( (ent w*en t*e com+o +o- receives t*e "essage-"acro "ap )NEC?NEAI)&A)WN )NEC?NECF)(>D& )NEC?NEA?FCFS )NEC?NE(>FCJ,N:> )NEC?NE(>F>NA)S )NEC?NE(>F>NAC,NC>F NEC?NE>A4TD&A,T> )NEC?NE>A4TCJ,N:> )NEC?NES4FF1)CD( )NEC?NE(>T1)CD( e e e e e e e e e e e e e e e e e e e Si. ple DropDo/n e e Drop-Do/n ist e e

input focus' C?NE>II(&,C> (ent w*en an operation fails +ecause of insufficient memorH'

)NEC?NE>II(&,C>

e

e

e

Nu toate notificarile se aplica la toate tipurile de C?' Notificarile C?NEAI)&A)WN si C?NECF)(>D& nu sunt trimise la un C? simpla (C?(E(48&F>) pt' ca un asemenea C? este desc*is tot timpul' C? cu stilurile C?(EAI)&A)WN si C?(EAI)&A)WNF4(T3nu primesc notificarea C?NEA?FCFS pt' ca pe art' din lista nu se poate face du+lu clic' (F? asociat C? se inc*ide dupa primul clic)' Notificarile C?NE>A4TD&A,T> si C?NE>A4TCJ,N:> sunt ec*ivalente cu >NED&A,T> si >NECJ,N:> trime de C> si C?NE(>FCJ,N:> este la fel cu F?NE(>FCJ,N:> pt' F?' Cind procesam notificarea C?NE(>FCJ,N:> C> asociat poate sa nu fie actualizat cu selectia din F? asociat' Va tre+ui sa folosim .et385e"t pentru a regasi noul te-t selectat in loc de .et6indow5e"t' 4nde-ul art' selectat il gasim cu CCombo8o"++.etCurSel'

Clasa CScroll$ar
Clasa CScroll8ar incapsuleaza controlul scroll +ar creat din a(CI)FF?,Ia WNACF,((' Controalele scroll +ar sunt identice in cea mai mare parte cu <ferestrele= scroll +ar' 4n timp ce ferestrele scroll +ars sunt create cu stilurile W(EV(CI)FF si W(EJ(CI)FF controalele scroll +ar sunt create e-plicit cu CScroll8ar++Create' ?arele scroll window sint lipite de fereastra principala controalele scroll +ar pot fi plasate oriunde in fereastra si pot fi setate la orice latime si inaltime' (til (?(EV>IT pentru C(? vertical si (?(EJ)IX pentru orizontal' Aaca mCwnd<Scroll8ar si mCwnd9Scroll8ar sunt o+iecte CScroll8ar instructiunile: :wnd*Scr'##6ar(Create .WS:CHILD R WS:*ISI6L/ R WS:6$"D/" R S6S:*/"T1 rect*ert1 th%s1 IDC:*SC"$LL6A"5; :wndHScr'##6ar(Create .WS:CHILD R WS:*ISI6L/ R WS:6$"D/" R S6S:H$"Y1 rectH'rJ1 th%s1 IDC:HSC"$LL6A"5; creaza doua controale C(? unul vertical si unul orizontal' )+tinerea dim' standard folosite de W se o+tin printr3un apel al fct' ,&4 ++.etS7stem2etrics' %nt nW%dth < GGGetSyste Metr%cs .SM:CL*SC"$LL5; %nt nHe%ght < GGGetSyste Metr%cs .SM:CIHSC"$LL5;

Status >ars şi "oolbars 1>ara de stare şi de instru#ente2

Ducrul cu barele de instru#ente 1"oolbars2
?utoanele de pe tool+ar corespund la comenzi la fel ca articolele dintr3un meniu' Bn general +utoanele din tool+ar sunt duplicate pentru comenzi din meniu (s*ortcut3uri)' ?ara de instrumente poate fi ad7ugat7 cu ,ppWizard' ,ppWizard creaz7 +ara de instrumente pentru cele mai utilizate comenzi din 1ile >dit 5i Jelp' I7m9ne 2n sarcina noastr7 s7 modific7m +ara de instrumente dup7 cum dorim' 1iecare +uton de pe +ara de instrumente are un 4A care3l identific7' &e +aza acestui 4A vom ata5a o comand7 pentru +uton'

Nter%erea butoanelor din bara de instru#ente
Vom e-emplifica cele ce urmeaz7 pe +aza unei aplica6ii numit7 Tool cu ar*itectura Aocument#View 5i de tip 8A4' ,ppWizard furnizeaz7 o +ar7 de instrumente doc(ing (+ara de instrumente nu este fi-7 poate fi mutat7 oriunde 2n zona client arat7 ca o palet7 plutitoare) implicit pentru aceast7 aplica6ie' ,ceast7 func6ionalitate este dat7 de ,ppWizard 5i 81C' &entru a 5terge un +uton din tool+ar proced7m 2n felul urm7tor: .' select7m pagina (ta+) Iesource View 2' e-pand7m Tool Iesources pentru a vedea resursele aplica6iei 3' select7m Tool+ar L' du+lu clic pe 4AIE8,4N1I,8> pentru a3l edita' "' 5tergerea unui +uton se face prin tragerea +utonului respectiv din aceast7 list7 (clic pe +uton se 6ine +utonul st9ng al mouse3ului ap7sat 5i se trage +utonul in afara tool+ar3ului 5i apoi eli+erarea +utonului)'

Adău%area de butoane la "oolbar
,d7ugarea se face 2n doi pa5i: .' se deseneaz7 icoana +utonului select9nd +utonul al+ (+lan;) din tool+ar/ desenarea se face folosind instrumentele puse la dispozi6ie de mediul de programare' 2' se ata5eaz7 o comand7 noului +uton ad7ugat/ se selecteaz7 &roperties pentru acest nou +uton 5i vom indica 4d3ul acestui +uton (4AEC4ICF> 2n acest caz)'

.escriere şi "ool"ip
Bn continuare vom (defini) ata5a descrierea +utonului 5i a ToolTip3ului' Aescrierea apare 2n +ara de stare iar ToolTip3ul apare c9nd mouse3ul r7m9ne deasupra +utonului pentru o secund7 sau dou7' ,ceste dou7 5iruri de caractere le vom introduce 2n +o-a de editare &rompt: mai 2nt9i 5irul pentru descrierea +utonului 5i apoi separat cu newline (\n) 5irul pentru ToolTip'

Adău%are co#andă pentru buton
(e disting dou7 situa6ii: .' +utonul din tool+ar are un articol de meniu corespunz7tor adic7 selectarea +utonului sau a articolului de meniu are acela5i efect/ 2' +utonul din tool+ar nu are un articol de meniu corespunz7tor' Bn primul caz vom alege acela5i 4A pentru +uton ca 5i pentru comanda din meniu' (e presupune c7 pentru comenzile din meniu am scris codul' Bn cel de3al doilea caz vom proceda 2n felul urm7tor:

8, (elect7m +utonul pentru care dorim s7 cre7m tratarea mesa0ului 5i apoi desc*idem ClassWizard' 5, Ain foia de propriet76i care apare cu 4A3ul +utonului selectat select7m in +o-a Class Name clasa la care vom ad7uga func6ia 2n mod o+i5nuit clasa pentru vizualizare (derivat7 din CView sau alte clase din aceast7 ierar*ie)' 4, >-ecut7m du+lu clic pe C)88,NA din +o-a 8essages' C, ,ccept7m numele func6iei propus de 81C 5i apoi edit7m codul' Obser aţie! Aac7 nu se define5te nici o comand7 pentru un +uton din tool+ar atunci 81C 2l va face disa+led 2n timpul e-ecu6iei' ,cela5i lucru este vala+il 5i pentru o comand7 din meniu'
(e va e-ersa acest lucru la calculator' Dn r7spuns posi+il pentru +utonul cu 4A3ul 4AEC4ICF>'

Distin% C"oolView!!OnCircle12
F'%d CT''#*%ewGG$nC%rc#e.5 { CC#%entDC c#%entDC.th%s5; C6rush new6rush."G6.2TT1>1>55; C6rushN '#d6rush < c#%entDC(Se#ect$HEect.@new6rush5; c#%entDC(/##%pse.2>1 2>1 2>>1 2>>5; c#%entDC(Se#ect$HEect.'#d6rush5; & Becapitulare+ 4viden'ierea folosirii pensoanelor )clasa C8rus*). Ce înseamnă conte"tul de dispozitivJ Cum se folose,teJ Bolul func'iei Select bject)). Alte întrebări legate de conte"tul de dispozitiv.

Funcţiile #e#bre ale clasei C"ool>ar
Aac7 dorim s7 sc*im+7m comportarea tool+ar3ului sau forma sa de afi5are vom folosi func6iile din clasa CTool?ar' Tool+ar3ul este accesi+il din clasa C8ain1rame acolo fiind definit7 5i varia+ila mEwndTool?arde tip CTool?ar' Bn general sc*im+area comport7rii tool+ar3ului se face 2n func6ia C8ain1rame::)nCreate()'

Funcţiile #e#bru ale clasei C"ool>ar
Function CommandTo4nde-() Create() :et?utton4nfo() :et?utton(tHle() :et?uttonTe-t() :et4tem4A() :et4temIect() :etTool?arCtrl() Foad?itmap() FoadTool?ar() (et?itmap() (et?utton4nfo() .escription )+tains t*e inde- of a +utton given its 4A Creates t*e tool+ar )+tains information a+out a +utton )+tains a +uttonZs stHle )+tains a +uttonZs te-t la+el )+tains t*e 4A of a +utton given its inde)+tains an itemZs displaH rectangle given its inde)+tains a reference to t*e CTool?arCtrl o+0ect represented +H t*e CTool?ar o+0ect Foads t*e tool+arZs +utton images Foads a tool+ar resource (ets a new tool+ar +utton +itmap (ets a +uttonZs 4A stHle and image num+er

(et?uttons() (et?utton(tHle() (et?uttonTe-t() (etJeig*t() (et(izes()

(ets t*e 4As for t*e tool+ar +uttons (ets a +uttonZs stHle (ets a +uttonZs te-t la+el (ets t*e tool+arZs *eig*t (ets t*e +utton sizes

Ducrul cu bara de stare 1Status >ars2
?ara de stare const7 2n afi5area unui te-t ce descrie comanda ce urmeaz7 a fi selectat7' Ae asemenea +ara de stare con6ine starea unor taste (C,&( ND8 Foc; etc')' Comportamentul +arei de stare este 2ncapsulat 2n clasa C(tatus?ar' ) +ar7 de stare este asem7n7toare cu tool+ar3ul' (e creaz7 2n C8ain1rame::Create()'

Metodele clasei CStatus>ar
Met$od CommandTo4nde-() Create() :et4tem4A() :et4temIect() :et&ane4nfo() :et&ane(tHle() :et&aneTe-t() :et(tatus?arCtrl() (et4ndicators() (et&ane4nfo() (et&ane(tHle() (et&aneTe-t() .escription )+tains an indicatorZs inde- given its 4A Creates t*e status +ar )+tains an indicatorZs 4A given its inde)+tains an itemZs displaH rectangle given its inde)+tains information a+out an indicator )+tains an indicatorZs stHle )+tains an indicatorZs te-t )+tains a reference to t*e C(tatus?arCtrl o+0ect represented +H t*e C(tatus?ar o+0ect (ets t*e indicatorsZ 4As (ets t*e indicatorsZ 4As widt*s and stHles (ets an indicatorZs stHle (ets an indicatorZs te-t

?ara de stare con6ine mai multe p7r6i numite panes care afi5eaz7 informa6ii despre starea aplica6iei 5i a sistemului' 8etoda cea mai folosit7 pentru a personaliza +ara de stare este de ad7uga noi p7r6i' &entru a face acest lucru proced7m astfel:

8, Cre7m un 4A pentru o comand7 pentru noul pane' 5, Cre7m un string implicit pentru acest pane' 4, ,d7ug7m comanda 4A a pane3ului la ta+loul (arraH) indicatorilor +arei de stare' C, Cre7m func6ia corespunz7toare pentru acest 4A'
>-plic7m aceste lucruri 2n detaliu'

Crearea unui /. pentru o nouă co#andă
&entru a ad7uga un 4A pentru o comand7 (definirea 4A3ului) proced7m astfel: View 3K Iesource (Hm+ols 3K New (Hm+ol 5i apoi tast7m 4A3ul in +o-a Name de e-' 4AE8ON>W&,N> apoi )S 5i Close'

Crearea strin%ului i#plicit
&resupunem c7 am creat 4A3ul' &entru a defini stringul proced7m astfel: 8, select7m Iesource View (din panelul wor;space)3K 5i apoi du+lu clic pe resursa (tring Ta+le pentru a o desc*ide/ 5, alegem 4nsert New (tring pentru a desc*ide +o-a de dialog (tring &roperties'

4,

tast7m 4A3ul /.JMB*=W(A*= 2n +o-a 4A (sau 2l alegem din lista drop3down) 5i apoi tast7m te-tul (stringul) in +o-a Caption '

Adău%area /d)ului la tabloul 1arraA2 indicatorilor
81C folose5te un ta+lou de 4A3uri pentru a determina ce paneluri s7 afi5eze' ,cest ta+lou este pasat ca argument 2n func6ia mem+ru a +arei de stare (et4ndicators() care este apelat7 2n func6ia Create() din C8ain1rame'

Distin% MainFr#,cpp))"$e /ndicator ArraA
stat%c UINT %nd%cat'rsOP < { ID:S/!A"AT$"1 ID:INDICAT$":CA!S1 ID:INDICAT$":NUM1 ID:INDICAT$":SC"L1 &; CC status #%ne %nd%cat'r

&entru a ad7uga noul pane tast7m 4A3ul 2n acest vector 2n pozi6ia 2n care vrem s7 apar7 panelul nou urmat de virgul7 dac7 nu este pe ultima pozi6ie'

Distin% MainFr#,cppOVectorul indicatorilor după adău%are
stat%c UINT %nd%cat'rsOP < { ID:S/!A"AT$"1 ID:MIN/W!AN/1 ID:INDICAT$":CA!S1 ID:INDICAT$":NUM1 ID:INDICAT$":SC"L1 &; CC status #%ne %nd%cat'r CC ID adaugat

Crearea funcţiei pentru Lpdate 1CC#dL/2
81C nu actualizeaz7 (ena+le) 2n mod automat noul pane ad7gat' Tre+uie s7 cre7m o func6ie pentru actualizarea (ena+le) noului pane' Bn mod normal se folose5te ClassWizard pentru a trata mesa0ele dar ClassWizard nu face nimic pentru +ara de stare' Va tre+ui s7 ad7g7m manual intr7rile 2n *arta de mesa0e 2n fi5ierul '* 5i 2n 2n 'cpp' ,ceste modific7ri le vom face 2n afara comentariilor speciale ,1%E8(:E8,& folosite de ClassWizard'

Distin% MainFr#,$))Messa%e Map
CC Generated essage ap funct%'ns pr'tectedG CC{{A)L:MSG.CMa%n)ra e5 af7: sg %nt $nCreate.L!C"/AT/ST"UCT #pCreateStruct5; CC N$T/ D the C#assW%Jard w%## add and re 'Fe e Her funct%'ns here( CC D$ N$T /DIT what y'u see %n these H#'cBs 'f generated c'de9 CC&&A)L:MSG af7: sg F'%d $nUpdateMyNew!ane.CC dUI NpC dUI5; D/CLA"/:M/SSAG/:MA!.5

Distin% MainFr#,cpp))Messa%e Map
6/GIN:M/SSAG/:MA!.CMa%n)ra e1 C)ra eWnd5 CC{{A)L:MSG:MA!.CMa%n)ra e5 CC N$T/ D the C#assW%Jard w%## add and re 'Fe app%ng acr's here( CC D$ N$T /DIT what y'u see %n these H#'cBs 'f generated c'de 9 $N:WM:C"/AT/.5

CC&&A)L:MSG:MA! $N:U!DAT/:C$MMAND:UI.ID:MIN/W!AN/1 $nUpdateMyNew!ane5 /ND:M/SSAG/:MA!.5

Distin% CMainFra#e!!OnLpdateMA*ew(ane12
F'%d CMa%n)ra eGG$nUpdateMyNew!ane.CC dUI NpC dUI5 { pC dUID-/naH#e.5; pC dUID-SetTe7t. :paneStr%ng5; & :paneStr%ng con6ine stringul (este de tip C(tring)'

Modificarea strin%ului pentru #JpaneStrin%
(e adaug7 data mem+ru la clasa C8ain1rame: pr%FateG CStr%ng :paneStr%ng;

-rima varianta+ (e ini6ializeaz7 aceast7 varia+il7 2n constructorul clasei C8ain1rame: :paneStr%ng < 8Defau#t str%ng8; &entru a afi5a +ara de stare pentru prima dat7 se adaug7 urm7toarele linii de cod 2n C8ain1rame::)nCreate() 2nainte instruc6iunea return: CC#%entDC dc.th%s5; SIY/ s%Je < dc(GetTe7t/7tent. :paneStr%ng5; %nt %nde7 < :wndStatus6ar(C' andT'Inde7.ID:MIN/W!AN/5; :wndStatus6ar(Set!aneInf'.%nde71ID:MIN/W!AN/1 S6!S:!$!$UT1 s%Je(c75; ,cest cod seteaz7 stringul 5i m7rimea panelului' (etarea m7rimii panelului se face printr3un apel la func6ia (et&ane4nfo() care are nevoie de inde-ul panelului 4A3ul stilul de afi5are 5i m7rimea acestui panel' CommandTo4nde-() o+6ine inde-ul panelului av9nd ca parametru 4A3ul panelului' 5i :etTe-t>-tent() o+6ine m7rimea calculat7 conform fontului utilizat m7rimii caracterelor 5i lungimii 5irului mEpane(tring' A doua variantă+ ,d7ugarea unei op6iuni 2n meniu pentru modificarea con6inutului varia+ilei mEpane(tring' Ae o+icei se creaz7 o +o-7 de dialog 2n care se preia noua valoare' ,cest lucru implic7 ad7ugarea unei op6iuni de meniu 5i tratarea acesteia (scrierea codului pentru func6ie)' Ae asemenea implic7 crearea unei +o-e de dialog' (e vor e-plica 2n detaliu aceste lucruri' Cod posi+il:

Distin% CMainFra#e!!OnFileC$an%estrin%12
F'%d CMa%n)ra eGG$n)%#eChangestr%ng.5 { C!aneD#g d%a#'g.th%s5; d%a#'g( :paneStr%ng < :paneStr%ng; %nt resu#t < d%a#'g(D'M'da#.5; %f .resu#t << ID$;5 { :paneStr%ng < d%a#'g( :paneStr%ng;

& &

CC#%entDC dc.th%s5; SIY/ s%Je < dc(GetTe7t/7tent. :paneStr%ng5; %nt %nde7 < :wndStatus6ar(C' andT'Inde7.ID:MIN/W!AN/5; :wndStatus6ar(Set!aneInf'.%nde71 ID:MIN/W!AN/1 S6!S:!$!$UT1 s%Je(c75;

Ae o+servat asem7narea codului cu cel din prima variant7'

Ducrul cu :ebar
Ie+ar sunt tool+ar3uri care con6in alte controale dec9t +utoanele tool+ar' Ca e-emplificare vom ad7uga un c*ec; +o- care este reprezentat de clasa C?utton' >tape: Bn C8ain1rame ('*) ad7ug7m: puH#%cG C"e6ar :reHar; C6utt'n :checB; Bn C8ain1rame::Create() ad7ug7m la sf9r5it urm7toarele linii: %f .9 :reHar(Create.th%s5 5 { T"AC/>.8)a%#ed t' create reHarZn85; return D0; CC fa%# t' create & Controlul c*ec; +o- are nevoie de un 4A' (elect7m View3KIesource (Hm+ols3KNew 5i tast7m 4ACECJ>CS' ,ccept7m aceast7 alegere' (e adaug7 astfel o linie 2n resource'* 5i aceast7 resurs7 nu poate fi utilizat7 5i de alte controale' Ain nou 2n C8ain1rame::)nCreate() ad7ug7m urm7toarele linii pentru a crea c*ec; +o-3ul: %f .9 :checB(Create.8ChecB Here81 WS:CHILD=WS:*ISI6L/=6S:AUT$CH/C;6$L1 C"ect.>1>12>12>51 th%s1 IDC:CH/C;5 5 { T"AC/>.8)a%#ed t' create checBH'7Zn85; return D0; CC fa%# t' create & Bn final se adaug7 acest control la re+ar: :reHar(Add6ar.@ :checB1 8$n The 6ar81 NULL1 "66S:6"/A; = "66S:G"I!!/"ALWAIS5; ,dd?ar() are patru parametri: un pointer la controlul care va fi ad7ugat te-tul afi5at al7turi de control un pointer la un +itmap pentru a fi folosit pentru imaginea +ac;ground3ului pe re+ar 5i stilul re+ar3ului' ,lte stiluri sunt:

• • • • • • • • •

I??(E?I>,S puts t*e +and on a new line even if t*ereZs room for it at t*e end of an e-isting line' I??(ECJ4FA>A:> puts t*e +and against a c*ild window of t*e frame' I??(E14%>A?8& prevents moving t*e +itmap if t*e +and is resized +H t*e user' I??(E14%>A(4X> prevents t*e user from resizing t*e +and' I??(E:I4&&>I,FW,O( guarantees sizing wrin;les are present' I??(EJ4AA>N *ides t*e +and' I??(EN):I4&&>I suppresses sizing wrin;les' I??(EN)V>IT *ides t*e +and w*en t*e re+ar is vertical' I??(EV,I4,?F>J>4:JT ena+les t*e +and to +e resized +H t*e re+ar'

Bn acest moment aplica6ia func6ioneaz7 dar nu se 2nt9pl7 nimic la selec6ie sau deselec6ie c*ec; +o-' &entru ca aplica6ia s7 reac6ioneze la clic pe c*ec; +o- tre+uie s7 prindem mesa0ul 5i s73l trat7m' Cel mai simplu mod pentru a face acest lucru este s7 sc*im+7m ceea ce se deseaneaz7 2n )nAraw() din vizualizare' ,d7ug7m la clasa vizualizare tratarea mesa0ului care apare c9nd se face clic pe acest +uton' ,d7ugarea se face manual ca la +ara de stare 2n afara codului generat de ClassWizard: Bnainte de A>CF,I>E8>((,:>E8,& ad7ug7m: af7: sg F'%d $nC#%cB.5; ,d7ug7m func6ia la clasa vizualizare: F'%d C"eHar*%ewGG$nC#%cB.5 { InFa#%date.5; & ,ceasta va apela )nAraw()' Bn *arta de mesa0e ad7ug7m (tot 2n afara codului generat de ClassWizard): $N:6N:CLIC;/D.IDC:CH/C;1 $nC#%cB5 Fa 2nceputul fi5ierului ad7ug7m: +%nc#ude 8 a%n)r (h8 Bn )nAraw() ad7ug7m: CStr%ng essage; %f . ..CMa%n)ra eN5.Af7GetApp.5D- :pMa%nWnd55D- :checB(GetChecB.55 essage < 8The H'7 %s checBed8; e#se essage < 8The H'7 %s n't checBed8; pDCD-Te7t$ut.2>12>1 essage5;

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close