Documente Academic
Documente Profesional
Documente Cultură
Uniti logice
MM_TEXT
MM_LOMETRIC
MM_HIMETRIC
MM_LOENGLISH
MM_HIENGLISH
MM_TWIPS
MM_ISOTROPIC
MM_ANISOTROPIC
Pixel
0,1 mm
0,01mm
0,01 mei
0,001 inci
1/1440 inci
Arbitrar (x = y)
Arbitrar (x != y)
Spre dreapta
Spre dreapta
Spre dreapta
Spre dreapta
Spre dreapta
Spre dreapta
Selectabil
Selectabil
n jos
n sus
n sus
n sus
nsus
n sus
Selectabil
Selectabil
funciei, GetTextMetrics returneaz limea i nlimea caracterelor, n sutimi de inci. Atunci cnd
apelai funcia GetTextMetrics ca s obinei nlimea i limea caracterelor, modul de mapare
trebuie s fie acelai cu cel pe care l vei folosi atunci cnd afiai textul pe baza acestor dimensiuni
Sistemele de coordonate ale dispozitivului
Atunci cnd folosim ntregul ecran, spunem c lucrm n coordonate ecran". Colul din stnga-sus
este punctul de coordonate (0, 0). Coordonatele ecran sunt folosite n mesajul WM_MOVE (pentru alte
ferestre dect ferestrele descendent) i n urmtoarele funcii Windows: CreateWinriow i
MoveWindow (ambele pentru alte ferestre dect ferestrele descendent), GetMessagePos,
GetCursorPos, SetCursorPos, GetWindowRect, WindowFromPoint i SetBrushOrgEx.
Coordonatele de fereastr" se refer la ntreaga fereastr a ecranului, inclusiv bara de titlu, meniu,
barele de derulare i chenarul ferestrei. Pentru o fereastr normal, punctul (0, 0) este colul din
stnga-sus al chenarului de redimensionare. Coordonatele de fereastr sunt folosite mai rar n
Windows, dar dac obinei un context de dispozitiv cu ajutorul funciei GetWindowDC, atunci
coordonatele logice specificate la apelarea funciilor GDI vor fi mapate la coordonatele ferestrei.
Al treilea sistem de coordonate de dispozitiv -folosete coordonatele zonei client". Punctul (0,0)
este colul din stnga-sus al zonei client. Dac obinei un context de dispozitiv cu ajutorul funciei
GetDC sau al funciei BeginPaint, atunci coordonatele logice specificate Ia apelarea funciilor GDI vor fi
mapate la coordonatele zonei client.
Putei s transformai coordonatele zonei client n coordonatele ecranului i invers folosind funciile
ClientToScreen i ScreenToClient. De asemenea, putei obinei poziia i dimensiunea ntregii
ferestre n coordonate ecran folosind funcia GetWindowRect.
Vizorul i fereastra
Modurile de mapare definite n Windows stabilesc modul n care sunt mapate coordonatele logice
specificate n funciile GDI la coordonatele de dispozitiv, pe baza faptului c sistemul de coordonate de
dispozitiv folosit depinde de funcia folosit pentru obinerea contextului de dispozitiv. se spune c
modul de mapare definete maparea coordonatelor de fereastr" (window) -coordonate logice - la
coordonatele vizorului (viewport) - coordonate de dispozitiv.
n alte limbaje pentru interfeele grafice, termenul viewport se refer la o regiune de decupare
(clipping region). Termenul window definete, n general, zona pe care o ocup un program pe ecran.
n timpul discuiilor de fa va trebui s renunm la vechile definiii ale acestor termeni.
Pentru vizor se folosesc coordonatele de dispozitiv (pixeli). De cele mai multe ori, vizorul coincide
cu zona client a ferestrei, dar poate s nsemne i coordonatele ntregii ferestre sau coordonatele
ntregului ecran, dac ai obinut contextul de dispozitiv prin apelarea funciilor GetWindowDC sau
CreateDC. Punctul de coordonate (0, 0) este colul din stnga-sus al zonei client (sau al ferestrei, ori al
ecranului). Valorile coordonatei x cresc ctre dreapta, iar valorile coordonatei y cresc n jos.
Pentru fereastr se utilizeaz coordonatele logice, care pot fi,exprimate n pixeli, milimetri, inci sau
orice alt unitate de msur dorii. Coordonatele logice ale ferestrei sunt specificate la apelarea
funciilor GDI.
Pentru toate modurile de mapare, Windows transform coordonatele ferestrei (coordonate logice)
n coordonate ale vizorului.
Windows poate s transforme i coordonatele vizorului (coordonate de dispozitiv) n coordonate ale
ferestrei (coordonate logice.
Windows include dou funcii care v permit s convertii punctele de dispozitiv n puncte logice i
invers. Funcia urmtoare convertete punctele de dispozitiv n puncte logice:
DPtoLP (hdc, pPoints, iNumber) ;
Variabila pPoints este o matrice de structuri POINT, iar iNumber este numrul de puncte ce
urmeaz s fie convertite. Vei vedea c aceast funcie este foarte util pentru convertirea
dimensiunii zonei client obinute prin apelarea funciei GetClientRect (care returneaz valorile n
uniti de dispozitiv) n coordonate logice:
GetClientRect (hwnd, &rect);
DPtoLP (hdc, (PPoint) &rect, 2);
Funcia urmtoare convertete punctele logice n puncte de dispozitiv:
LPtoDP (hdc, pPoints, iNumber) ;
Folosirea modului de mapare MM_TEXT
(0,
(0,
(1,
(1,
0)
0)
1)
1)
Poate fi modificat
Poate fi modificat
Nu poate fi modificat
Nu poate fi modificat
Raportul din extensia ferestrei i extensia vizorului este 1, aa c nu este necesar nici o operaie
de scalare pentru transformarea coordonatelor logice n coordonate de dispozitiv.
Acest mod de mapare se numete mapare de tip text", nu fiindc este cea mai potrivit pentru
text, ci datorit orientrii axelor. n general, citim textul de la stnga spre dreapta i de sus n jos, iar
n modul de mapare MM_TEXT, valorile cresc n acelai sens:
Valorile logice ale axei x sunt cuprinse n intervalul de la -cxClient/2 la +cxClient/2 iar valorile
logice ale axei y sunt cuprinse n intervalul de la -cyClient/2 la +cyClient/2. Colul din dreapta-jos al
zonei client are coordonatele (cxClient/2, cyClient/2). Dac vrei s afiai text ncepnd din colul din
stnga-sus al zonei client, care are coordonatele de dispozitiv (0, 0), trebuie s folosii coordonate
logice negative:
TextOut (hdc, -cxClient/2, -cyClient/2, "Hello", 5) ;
variabila handle returnat de funcia GetDC v permite s desenai n toat zona client a ferestrei. n
plus, funciile GetDC i ReleaseDC nu valideaz eventualele regiuni invalide ale zonei client.
Un program Windows poate s obin i o variabil handle a unui context de dispozitiv care se
aplic ntregii ferestre, nu numai zonei client a ferestrei:
hdc = GetWindowDC (hwnd);
[alte linii de program]
ReleaseDC (hwnd, hdc);
Contextul de dispozitiv include, n afar de zona client, bara de titlu a ferestrei, barele de derulare
i chenarul.
O funcie mai general pentru obinerea variabilei handle a unui context de dispozitiv este
CreateDC:
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
[alte linii de program]
DeleteDC (hdc);
De exemplu, putei s obinei variabila handle a contextului de dispozitiv pentru tot spaiul de
afiare, cu urmtorul apel:
hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
Uneori avei nevoie de unele informaii despre un context de dispozitiv fr s desenai nimic. n
aceast situaie putei s obinei o variabila handle a contextului de informaii (information context")
folosind funcia CreateIC. Parametrii sunt aceiai ca i pentru funcia CreateDC:
hdclnfo = CreatelC ("DISPLAY", NULL, NULL, NULL);
[alte linii de program]
DeleteDC (hdclnfo);
Atunci cnd lucrai cu imagini bitmap, poate fi uneori util obinerea unui context de dispozitiv n
memorie":
hdcMem = CreateCompatibleDC (hdc);
[alte linii de program]
DeleteDC (hdcHem)
Acesta este un concept destul de abstract.
Putei s creai un metafiier prin obinerea unui context de dispozitiv pentru metafiiere:
hdcMeta = CreateMetaFile (pszFilename);
[alte linii de program] hmf = CloseMetaFile (hdcMeta);
Obinerea informaiilor despre contextul de dispozitiv
GetDeviceCaps (get device capabilities"):
iValue = GetDeviceCaps (hdc, iIndex) ;
Parametrul iIndex este unul dintre cei 28 de identificatori definii n fiierele antet din Windows. De
exemplu, dac iIndex are valoarea HORZRES funcia GetDeviceCaps returneaz limea dispozitivului
n pixeli; VERTRES returneaz nlimea dispozitivului n pixeli.
Valoarea 40 x cxChar reprezint limea nsumat a coloanelor doi i trei. Dup apelarea funciei
TextOut este apelat din nou funcia SetTextAlign, pentru a readuce la normal modul de aliniere a
textului.
HWND
hwnd ;
UINT
message ;
WPARAM wParam ;
LPARAM lParam ;
DWORD time ;
POINT
pt ;
}
MSG ,
Tipul de date POINT este tot o structur, definit astfel:
typedef struct tagPOINT
{
LONG x ;
LONG y ;
}
POINT ;
Funcia GetMessage apelat la nceputul ciclului de mesaje preia un mesaj din coada de ateptare:
GetMessage (&msg, NULL, 0, 0)
Acest apel transmite sistemului de operare un pointer, numit msg, la o structur de tip MSG. Al
doilea, al treilea i al patrulea parametru au valoarea NULL sau 0, ceea ce indic faptul c programul
vrea s preia toate mesajele, pentru toate ferestrele create de program. Windows completeaz
cmpurile structurii de mesaje cu urmtorul mesaj din coada de ateptare. Cmpurile acestei structuri
sunt:
hwnd - variabila handle a ferestrei creia i este destinat mesajul. n programul HELLOWIN, aceasta
este aceeai cu valoarea hwnd returnat de funcia CreateWindow, deoarece aceasta este singura
fereastr a programului.
message - identificatorul mesajului. Acesta este un numr folosit pentru identificarea mesajului.
Pentru fiecare mesaj n fiierele antet din Windows este definit un identificator care ncepe cu
prefixul WM_ (window message"). De exemplu, dac poziionai indicatorul mouse-ului n zona
client a programului HELLOWIN i apsai butonul din stnga, Windows va insera n coada de
ateptare un mesaj pentru care cmpul message conine identificatorul WM_LBUTTONDOWN, adic
valoarea 0x0201.
wParam - un parametru pe 32 de bii a crui valoare depinde de mesajul trimis.
lParam - un alt parametru pe 32 de bii dependent de mesaj.
time - momentul inserrii mesajului n coada de mesaje.
pt - coordonatele poziiei mouse-ului n momentul inserrii mesajului n coada de mesaje.
Instruciunea:
TranslateMessage (&msg) ;
retransmite structura msg sistemului de operare, pentru convertirea unor mesaje de la tastatur.
Instruciunea:
DispatchMessage (&msg) ;
ca i funcia TranslateMessage, retransmite structura msg sistemului de operare. Windows trimite apoi
mesajul ctre procedura de fereastr corespunztoare, n vederea prelucrrii - cu alte cuvinte,
Windows apeleaz procedura de fereastr. n programul HELLOWIN, procedura de fereastr este
WndProc. Dup ce prelucreaz mesajul, funcia WndProc pred controlul sistemului de operare, care
nc elaboreaz rspunsul la apelul DispatchMessage. Atunci cnd Windows returneaz controlul
programului HELLOWIN, dup executarea apelului DispatchMessage, ciclul de tratare a mesajelor
continu cu urmtorul apel al funciei GetMessage.
Funcia DispatchMessage transmite mesajul procedurii de fereastr corespunztoare. ntre cele dou
funcii este apelat funcia TranslateMessage, care transform mesajele generate de acionarea
tastelor n mesaje caracter. Dac mesajul este WM_KEYDOWN sau WM_SYSKEYDOWN i dac tasta
apsat, n funcie de starea tastelor de modificare, genereaz un caracter, atunci funcia
TranslateMessage insereaz un mesaj caracter n coada de ateptare.
secund. Unele programe scrise pentru MS DOS intercepteaz aceast ntrerupere pentru
implementarea unor ceasuri sau a unor cronometre.
Programele Windows nu fac acest lucru. ntreruperile hardware sunt tratate chiar de sistemul de
operare, aa c aplicaiile nu mai trebuie s fac acest lucru. Pentru fiecare program care creeaz
un cronometru, Windows trateaz ntreruperile de ceas decrementnd contorul transmis prin apelarea
funciei SetTimer. Atunci cnd aceast valoare ajunge la 0, Windows plaseaz n coada de ateptare
a aplicaiei un mesaj WM_TIMER i atribuie contorului valoarea original.
Deoarece programele Windows preiau mesajele WM_TIMER din coada de ateptare nu trebuie s v
facei probleme privind ntreruperea unei operaii de prelucrare prin sosirea unui mesaj WM_TIMER.
Din acest punct de vedere, cronometrul se aseamn cu tastatura i cu mouse-ul: driverul trateaz
evenimentele asincrone generate de ceasul hardware, iar Windows transform aceste evenimente n
mesaje structurate i serializate.
Cronometrul Windows are aceeai rezoluie de 54,925 milisecunde ca i ceasul hardware al
calculatorului, pe care de fapt se bazeaz. Acest lucru are dou implicaii importante:
O aplicaie Windows nu poate s primeasc mesaje WM_TIMER cu o rat mai mare de 18,2
ori/secund dac folosete un singur cronometru.
mai sus invalideaz ntreaga zon client i terge fondul acesteia. Dac ultimul parametru are
valoarea FALSE, fondul nu este ters i desenul va fi fcut peste ceea ce exist deja.
n Windows exist diferite moduri de mapare care controleaz transformarea coordonatelor logice
transmise funciilor GDI n coordonate fizice ale pixelilor afiai pe ecran. Modul de mapare este definit
n contextul de dispozitiv. Modul de mapare prestabilit este MM_TEXT (folosind identificatorul definit n
fiierele antet Windows). n modul de mapare MM_TEXT, unitile logice sunt aceleai cu unitile
fizice, adic pixelii; ele se raporteaz la colul din stnga-sus al zonei client, iar valorile coordonatei y
cresc pe msur ce cobori n zona client a ferestrei (vezi Figura 3.2). Sistemul de coordonate
MM_TEXT este acelai cu sistemul de coordonate folosit de Windows pentru definirea dreptunghiului
invalid din structura PAINTSTRUCT.
Contextul de dispozitiv definete i o regiune de decupare (clipping region). Aa cum ai vzut,
regiunea prestabilit de decupare este ntreaga zon client, pentru o variabil handle a contextului de
dispozitiv obinut prin apelarea funciei GetDC, sau numai regiunea invalid, pentru o variabil
handle a contextului de dispozitiv obinut prin apelarea funciei BeginPaint. Windows nu afieaz
partea care se afl n afara regiunii de decupare i care aparine irului de caractere, ci numai
poriunile care sunt cuprinse n regiunea de decupare. Scrierea n afara zonei client a unei ferestre
este o operaiune dificil, aa c nu v speriai - nu este posibil s facei acest lucru din greeal.
Fontul sistem
Tot n contextul de dispozitiv este definit i fontul pe care sistemul de operare Windows l folosete
pentru scrierea textului n zona client. Fontul prestabilit este numit font sistem" sau (folosind
identificatorul definit n fiierele antet Windows) SYSTEM_FONT. Fontul sistem este fontul pe care
Windows l folosete pentru textul din barele de titlu, barele de meniu i casetele de dialog.
La nceputurile sistemului de operare Windows, fontul sistem era un font cu dimensiune fix, ceea
ce nseamn c toate caracterele aveau aceeai lime, ca la mainile de scris. ncepnd cu versiunea
Windows 3.0 i continund pan la Windows 95, fontul sistem este un font cu dimensiune variabil,
ceea ce nseamn c fiecare caracter are o alt dimensiune. De exemplu, W" este mai lat dect i".
Este foarte clar c un text scris cu un font avnd dimensiune variabil este mai uor de citit dect un
font cu dimensiune fix.
Fontul sistem este un font de tip rastru", ceea ce nseamn c fiecare caracter este definit ca un
bloc de pixeli. Fontul sistem trebuie proiectat astfel nct pe ecran s ncap cel puin 25 de linii cu
cte 80 de caractere. Aceasta este singura garanie privind compatibilitatea ntre dimensiunea
ecranului i dimensiunea fontului.
Internaionalizarea programului
Windows asigur suportul pentru internaionalizarea programelor. Fiierul WIN .INI - creat n timpul
instalrii sistemului de operare - conine o seciune cu titlul [intl]. n aceast seciune sunt incluse
informaii legate de formatul datei, al orei, al monedei naionale i al numerelor. Putei s afiai data
n unul dintre urmtoarele trei formate: lun-zi-an, an-lun-zi sau zi-lun-an. Separatorul dintre cele
trei numere poate fi caracterul slash, liniua de desprire, punctul sau orice alt caracter dorii.
Putei s afiai ora n formatul pe 12 sau pe 24 de ore; de obicei, pentru separarea orelor,
minutelor sau a secundelor este folosit caracterul dou puncte.
Funcia Setlnternational din programul DIGCLOCK obine informaii de formatare din fiierul WIN.INI
folosind funciile GetProfilelnt (pentru numere ntregi) i GetProfileString (pentru iruri de caractere).
La apelarea acestor funcii trebuie s fie incluse valori prestabilite, pentru cazurile n care Windows
nu poate gsi valorile cutate n fiierul WIN.INI. Funcia Setlnternational stocheaz valorile obinute
n variabile globale care au ca nume irurile de caractere folosite n fiierul WIN.INI pentru
identificarea valorilor respective. Funcia WndPaint folosete valorile obinute din fiierul WIN.INI
pentru formatarea datei i a orei afiate, apoi apeleaz funcia DrawText pentru centrarea celor
dou linii de text n fereastr.
Aa cum este de ateptat, de fiecare dat cnd procedura de fereastr primete un mesaj
WM_TIMER, programul DIGCLOCK invalideaz fereastra pentru generarea unui mesaj WM_PAINT. Dar
funcia WndProc invalideaz fereastra i atunci cnd primete un mesaj WM_WININICHANGE. Orice
program care modific fiierul WIN.INI trimite mesaje WM_WININICHANGE tuturor aplicaiilor Windows
active.
Atunci cnd primete un mesaj WM_TIMER, programul DIGCLOCK invalideaz fereastra astfel:
InvalidateRect (hwnd, NULL, FALSE) ;
Valoarea TRUE folosit pentru ultimul parametru al funciei InvalidateRect determin tergerea
fondului ferestrei nainte de redesenare. Dac acest parametru are valoarea FALSE, Windows
deseneaz peste fondul existent. Am folosit valoarea FALSE n timpul prelucrrii mesajului
WMTIMER pentru reducerea efectului de licrire a imaginii afiate.
La recepionarea unui mesaj WM_TIMER, cea mai mare modificare a lungimii este de dou caractere
- de exemplu, atunci cnd data se schimb de la 12/31 /96 la 1 /1 /97 - aa c irul de caractere
formatat folosit pentru afiare de funcia WndPaint are la fiecare capt dou spaii suplimentare,
acoperitoare pentru aceast modificare n lungime i pentru diferenele datorate folosirii unui font
proporional. Am putea s includem n programul DIGCLOCK i logica de prelucrare a mesajelor WM
TIMECHANGE, care informeaz aplicaiile privind modificarea datei sau a orei sistemului. Deoarece
informaiile deinute de programul DIGCLOCK sunt actualizate la fiecare secund prin mesaje
WM_TIMER, acest lucru nu este necesar. Prelucrarea mesajelor WM_TIMECHANGE ar avea sens pentru
un ceas actualizat la fiecare minut.
Spaiile libere pstrate n imaginea bitmap n jurul mingii terg imaginea anterioar a mingii atunci
cnd mingea este mutat. Pentru redesenarea mingii ntr-o alt poziie este nevoie doar de apelarea
funciei BitBlt folosind codul ROP2RCCOPY:
BitBlt (hdc, xCenter - xTotal / 2, yCenter - yTotal / 2, xTotai, yTotal, hdcMem, 0,
0, SRCCOPY) ;
Programul BOUNCE ilustreaz cea mai simpl cale de deplasare a unei imagini pe ecran, dar
acest mod de abordare nu este satisfctor n toate situaiile. Dac v intereseaz animaiile, v-ar fi
de folos examinarea celorlalte coduri ROP (cum ar fi SRCINVERT) care efectueaz operaii SAU
EXCLUSIV ntre surs i destinaie. Alte tehnici de animaie implic folosirea paletei Windows (i a
funciei AnimatePalette) precum i a funciei CreateDIBSection.
Prima metod
Prima metod (i cea mai simpl) determin sistemul de operare s trimit mesajele WM_TIMER
ctre procedura de fereastr normal a aplicaiei. Apelul funciei SetTimer arat astfel:
SetTimer (hwnd, 1, iMsecInterval, NULL);
Primul parametru este o variabil handle pentru fereastra a crei procedur de fereastr va
primi mesajele WM_TIMER. Al doilea parametru este identificatorul cronometrului, care trebuie s
fie o valoare diferit de zero i care n acest exemplu este n mod arbitrar 1. Al treilea parametru
este o valoare ntreag fr semn pe 32 de bii, care specific intervalul de timp n milisecunde.
Dac acest parametru are valoarea 60000, programul va primi un mesaj WM_TIMER la fiecare minut.
Putei s oprii generarea mesajelor WM_TIMER n orice moment, chiar i n timpul prelucrrii unui
mesaj WM_TIMER, apelnd funcia:
KillTimer (hwnd, 1);
Al doilea parametru al funciei KillTimer este acelai identificator cu cel folosit la apelarea funciei
SetTimer. naintea terminrii programului, ca rspuns la mesajul WM_DESTROY, este recomandat
s distrugei toate cronometrele active din program.
Atunci cnd procedura de fereastr primete un mesaj WM_TIMER, parametrul wParam conine
identificatorul cronometrului (care n acest caz este 1) iar parametrul lParam este 0. Dac avei
nevoie de mai multe cronometre, folosii un identificator unic pentru fiecare. Valoarea parametrului
wParam va diferenia mesajele WM_TIMER trimise ferestrei. Pentru ca programul s fie mai uor de
citit, putei s folosii instruciuni define pentru definirea identificatorilor fiecrui cronometru:
Dac vrei s schimbai intervalul de timp al unui cronometru existent, oprii cronometrul i apelai
din nou funcia SetTimer:
KillTimer (hwnd, 1);
SetTimer (hwnd, 1, iMsecInterval, NULL);
Atunci cnd folosii o funcie cu apel invers pentru prelucrarea mesajelor WM_TIMER, al
patrulea parametru al funciei SetTimer trebuie s conin adresa funciei cu apel invers, ca n
exemplul urmtor:
SetTimer (hwnd, iTimerlD, iHsednterval, (TIMERPROC) TimerProc) ;
O variabil handle este pur i simplu un numr (de obicei pe 32 de bii) care face trimitere la un
obiect. Un program obine aproape ntotdeauna o variabil apelnd o funcie Windows. Programul
folosete apoi variabila handle obinut pentru trimiterea la obiect n alte funcii. Valoarea real a
variabilei handle nu este important pentru program, dar modulul Windows care o furnizeaz
programului tie cum s l manipuleze pentru trimiterea la obiect.
Punctul de intrare ntr-un program Windows este o funcie numit WinMain. Funcia WinMain este
ntotdeauna definit astfel:
int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int
iCmdShow)
Aceast funcie folosete secvena de apelare WINAPI i la terminare returneaz sistemului de
operare o valoare ntreag. Numele funciei trebuie s fie WinMain. Aceast funcie are patru
parametri:
Parametrul hlnstance este numit variabil handle a instanei" (instance handle"). Acesta este un
numr care identific n mod unic toate programele rulate n Windows. Utilizatorul poate rula simultan
mai multe copii ale aceluiai program. Aceste copii se numesc instane" i fiecare are o valoare
diferit pentru parametrul hlnstance.
hPrevInstance (previous instance" - instana anterioar) este un parametru nvechit. n versiunile
Windows anterioare acest parametru coninea variabila handle a celei mai recente instane nc activ
a aceluiai program. Dac nu erau ncrcate alte instane ale programului, hPrevInstance avea
valoarea 0 sau NULL.
Parametrul szCmdLine este un pointer la un ir de caractere terminat cu zero care conine
eventualii parametri transmii programului n linia de comand.
Parametrul iCmdShow este un numr care indic modul iniial de afiare a ferestrei n Windows. n
majoritatea cazurilor, iCmdShow are valoarea 1 sau 7. Mai sugestivi sunt identificatorii
SW_SHOWNORMAL (definit n Windows ca 1) i SW_SHOWMINNOACTIVE (definit cu valoarea 7).
Prefixul SW vine de la show window" (afiare fereastr). Acest parametru specific dac fereastra
programului este afiat normal sau dac este afiat iniial doar ca o pictogram.
nregistrarea clasei de fereastr
O fereastr este ntotdeauna creat pe baza unei clase de fereastr. Aceasta identific procedura
de fereastr care prelucreaz toate mesajele trimise ctre fereastr.
Pe baza aceleiai clase pot fi create mai multe ferestre. De exemplu, toate butoanele din Windows
sunt create pe baza unei singure clase de fereastr. Aceasta definete procedura de fereastr i alte
caracteristici ale ferestrei create pe baza clasei respective. Atunci cnd creai o fereastr, definii i
atributele suplimentare ale acesteia, care sunt unice pentru fereastra respectiv.
nainte de a crea fereastra programului trebuie s nregistrai o clas de fereastr, apelnd funcia
RegisterClassEx.
Funcia RegisterClassEx accept un singur parametru: un pointer la o structur de tipul
WNDCLASSEX. Structura WNDCLASSEX este definit n fiierele antet din Windows astfel:
typedef
struct tagWNDCLASSEX
{
UINT
cbSize ;
UINT
style ;
WNDPROC
lpfnWndProc ;
int
cbClsExtra ;
int
cbWnExtra ;
HINSTANCE hinstance ;
HICON
hicon ;
HCURSOR
hCursor ;
HBRUSH
hbrBackground ;
LPCSTR
lpszMenuName ;
LPCSTR
lpszClassName ;
HICON
hIconSm ;
}
WNDCLASSEX ;
n funcia WinMain trebuie s definii o structur de tipul WNDCLASSEX, cum ar fi:
WNDCLASSEX wndclass ;
Apoi definii cele 12 cmpuri ale structurii i apelai funcia RegisterClassEx:
RegisterClassEx (&wndclass) ;
Cele mai importante cmpuri ale structurii sunt al treilea i penultimul. Penultimul cmp conine
numele clasei de fereastr. Al treilea cmp (lpfnWndProc) este adresa procedurii de fereastr folosit
pentru toate ferestrele create pe baza acestei clase. Celelalte cmpuri descriu caracteristicile tuturor
ferestrelor create pe baza acestei clase.
cbSize reprezint dimensiunea structurii.
wndclass.style = CS_HREDRAW | CS_VREDRAW ; combin doi identificatori pentru stilul de clas".
Acestea sunt constante pe 32 de bii n care un singur bit are valoarea 1. Cei doi
identificatori pentru stilul clasei indic faptul c toate ferestrele create pe baza
acestei clase sunt redesenate complet, ori de cte ori se modific dimensiunea pe
orizontal (CS_HREDRAW) sau cea pe vertical (CS_VREDRAW) a ferestrei
wndclass.lpfnWndProc = WndProc ; Aceast instruciune stabilete ca procedur de fereastr
funcia WndProc. Aceast procedur va prelucra toate mesajele trimise ctre
toate ferestrele create pe baza acestei clase de fereastr. Aa cum am artat
mai sus, prefixul lpfn nseamn, n notaia ungar, pointer de tip long la o
funcie".
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ; rezerv un spaiu suplimentar n structura clasei i n structura
ferestrei, pstrat n interiorul
sistemului de Windows. Un program
poate s utilizeze spaiul suplimentar n scopuri proprii.
wndclass.hInstance = hinstance ; variabila handle a instanei
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; definesc o pictogram pentru ferestrele
create pe baza acestei clase. Pictograma este o mic imagine de tip bitmap care apare n bara de
taskuri a sistemului de operare i n bara de titlu a ferestrei. Pentru obinerea unei variabile handle a
unei pictograme predefinite apelai funcia LoadIcon cu primul parametru avnd valoarea NULL. Nu ne
intereseaz valoarea real a acestei variabile, ci doar o stocm n cmpurile hIcon i hIconSm.
wndclass.hCursor = LoadCursor (NULL, IDC_ ARROW) ; Funcia LoadCursor ncarc un cursor
predefinit pentru mouse, numit IDC_ARROW, i returneaz o variabil handle a acestui cursor. Atunci
cnd este deplasat deasupra zonei client a ferestrei create pe baza acestei clase, indicatorul mouseului este afiat sub forma unei sgei.
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); precizeaz culoarea
fondului zonei client a ferestrelor create pe baza acestei clase. Prefixul hbr al numelui hbrBackground
vine de la handle to a brush".
Funcia GetStockObject returneaz o variabil handle a unei pensule albe.
wndclass.lpszMenuName = NULL ; meniul ferestrei
wndclass.IpszClassName = szAppName ;
Se nregistreaz clasa de ferestre prin apelarea funciei RegisterClassEx. Singurul parametru al
funciei este un pointer ctre structura WNDCLASSEX:
RegisterClassEx (&wndclass) ;
Crearea ferestrei
Clasa de fereastr definete caracteristicile generale ale unei ferestre, permind astfel folosirea
aceleiai clase pentru crearea mai multor ferestre.
hwnd =CreateWindow (szAppName,
"The Hello Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USE DEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hlnstance,
NULL) ;
//
//
//
//
//
//
//
//
//
//
//
Fereastra creat de acest program este o fereastr normal suprapus, cu o bar de titlu; n partea
stng a barei de titlu se afl caseta cu meniul sistem; n partea dreapt se afl butoanele de mrire,
de micorare i de nchidere; fereastra are un chenar ngroat, care permite redimensionarea. Acesta
este stilul standard al ferestre lor, numit WS_OVERLAPPEDWINDOW; n funcia CreateWindow i
corespunde comentariul stilul ferestrei". Titlul ferestrei" este textul afiat n bara de titlu.
Parametrii notai cu poziia iniial pe axa x" i poziia iniial pe axa y" specific poziia iniial a
colului din stnga-sus al ferestrei, relativ la colul din stnga-sus al ecranului. Prin folosirea
identificatorului CW_USEDEFAULT pentru aceti para metri indicm sistemului de operare s
foloseasc valorile prestabilite pentru o fereastr suprapus. Parametrii dimensiunea iniial pe axa
x" i dimensiunea iniial pe axa y" specific dimensiunile iniiale ale ferestrei. Identificatorul
CW_USEDEFAULT indic sistemului de operare s foloseasc valorile prestabilite.
Parametrul indicat ca variabil handle a ferestrei printe" are valoarea NULL, deoarece aceast
fereastr nu are nici o fereastr printe. Atunci cnd ntre dou ferestre exist o relaie printedescendent, fereastra descendent este afiat ntotdeauna pe suprafaa ferestrei printe. Parametrul
indicat ca variabil handle a meniului" are tot valoarea NULL, deoarece fereastra nu are meniu.
Parametrul indicat ca variabil handle a instanei programului" are ca valoare variabila handle
transmis programului ca parametru la apelarea funciei WinMain. n sfrit, parametrul de creare"
are valoarea NULL.
Funcia Create Window returneaz o variabil handle a ferestrei create. Aceasta este salvat n
variabila hwnd, definit ca fiind de tipul HWND (variabil handle a unei ferestre). Orice fereastr din
Windows are o variabil handle. Programul folosete variabila handle pentru indicarea ferestrei. Dac
un program creeaz mai multe ferestre, fiecare are o variabil handle diferit.
AFIAREA FERESTREI
Dup executarea funciei CreateWindow, fereastra a fost creat de Windows, dar nc nu este
afiat pe ecran. Pentru aceasta mai sunt necesare nc dou apeluri de funcii. Primul este:
ShowWindow (hwnd, iCmdShow) ;
Primul parametru este o variabil handle a ferestrei create de funcia CreateWindow. Al doilea
parametru este variabila iCmdShow, transmis funciei WinMain. Dac iCmdShow este
SW_SHOWNORMAL (egal cu 1), fereastra este afiat normal. Dac iCmdShow este
SW_SHOWMINNOACTIVE (egal cu 7), atunci fereastra nu este afiat, dar numele i pictograma
acesteia apar pe bara de taskuri.
Apelul:
UpdateWindow (hwnd) ;
determin redesenarea zonei client. Acest lucru se face prin trimiterea ctre procedura de
fereastr a unui mesaj WM_PAINT.
propietile Width i Height ale unui formular, acesta se va redimensiona automat, aceast
redimensionare fiind tratat n evenimentele Resize sau in SizeChanged. Chiar dac propietatea
Size a formularului indic dimensiunea ferestrei, formularul nu este n totalitate responsabil pentru
desenarea ntregului coninut al su. Partea care este desenat de formular mai este denumit i
Client Area. Marginile, titlul i scrollbar-ul sunt desenate de Windows. MaxinumSize i
MinimumSize sunt utilizate pentru a restriciona dimensiunile unui formular. ControlBox
precizeaz dac fereastra conine sau nu un icon, butonul de nchidere al ferestrei i meniul System
(Restore,Move,Size,Maximize,Minimize,Close). HelpButton-precizeaz dac butonul va aprea sau
nu lng butonul de nchidere al formularului (doar dac MaximizeBox=false, MinimizeBox=false).
Dac utilizatorul apas acest buton i apoi apas oriunde pe formular va aprea evenimentul
HelpRequested (F1). Icon reprezint un obiect de tip *.ico folosit ca icon pentru formular.
MaximizeBox i MinimizeBox precizeaz dac fereastra are sau nu butonul Maximize i respectiv
Minimize Opacity indic procentul de opacitate ShowInTaskbar precizeaz dac fereastra apare in
TaskBar atunci cnd formularul este minimizat. SizeGripStyle specific tipul pentru Size Grip
(Auto, Show, Hide). Size grip (n colul din dreapta jos) indic faptul c aceast fereastr poate fi
redimensionat. TopMost precizeaz dac fereastra este afisat n faa tuturor celorlalte ferestre.
TransparencyKey identific o culoare care va deveni transparent pe form. Definirea unei funcii de
tratare a unui eveniment asociat controlului se realizeaz prin selectarea grupului Events din ferestra
Properties a controlului respectiv i alegerea evenimentului dorit. Dac nu scriem nici un nume pentru
funcia de tratare, ci efectum dublu clic n csua respectiv, se genereaz automat un nume pentru
aceast funcie, innd cont de numele controlului i de numele evenimentului (de exemplu
button1_Click). Dac n Designer efectum dublu clic pe un control, se va genera automat o funcie
de tratare pentru evenimentul implicit asociat controlului (pentru un buton evenimentul implicit este
Clic, pentru TextBox este TextChanged, pentru un formular Load etc.). Printre evenimentele cele mai
des utilizate, se numr :
Load apare cnd formularul este pentru prima data ncrcat n memorie.
FormClosed apare cnd formularul este nchis.
FormClosing apare cnd formularul se va inchide ca rezultat al aciunii utilizatorului asupra
butonului Close (Dac se seteaz CancelEventArgs.Cancel =True atunci se va opri
nchidereaformularului).
Activated apare pentru formularul activ.
Deactivate apare atunci cnd utilizatorul va da clic pe alt formular al aplicatiei.
Controale
Unitatea de baz a unei interfee Windows o reprezint un control. Acesta poate fi gzduit de un
container ce poate fi un formular sau un alt control. Un control este o instan a unei clase derivate
din System.Windows.Forms i este reponsabil cu desenarea unei pri din container. Visual
Studio .NET vine cu o serie de controale standard, disponibile n Toolbox. Aceste controale pot fi
grupate astfel: Controale form. Controlul form este un container. Scopul su este de a gzdui alte
controale. Folosind proprietile, metodele i evenimentele unui formular, putem personaliza
programul nostru. n tabelul de mai jos vei gsi o list cu controalele cel mai des folosite i cu
descrierea lor. Exemple de folosire a acestor controale vor urma dup explicarea proprietilor comune
al controalelor i formularelor.
Button Sunt folosite pentru a executa o secven de instruciuni n momentul activrii lor de ctre
utilizator
calendar MonthCalendar Afieaz implicit un mic calendar al lunii curente. Acesta poate fi derulat i
nainte i napoi la celelalte luni calendaristice.
caset de validare CheckBox Ofer utilizatorului opiunile : da/nu sau include/exclude
etichet Label Sunt folosite pentru afiarea etichetelor de text, i a pentru a eticheta controalele.
caset cu list ListBox Afieaz o list de articole din care utilizatorul poate alege.
imagine PictureBox Este folosit pentru adugarea imaginilor sau a altor resurse de tip bitmap.
pointer Pointer Este utilizat pentru selectarea, mutarea sau redimensionarea unui control.
buton radio RadioButton Este folosit pentru ca utilizatorul s selecteze un singur element dint-un
grup de selecii.
caset de text TextBox Este utilizat pentru afiarea textului generat de o aplicaie sau pentru a primi
datele introduse de la tastatur de ctre utilizator.
Proprietile ForeColor i BackColor. Prima proprietate enunat seteaz culoare textului din
formular, iar cea de a doua seteaz culoarea formularului. Toate acestea le putei modifica dup
preferine din fereastra Properties.
Proprietatea AutoSize folosit la controalele Label i Picture, decide dac un control este
redimensionat automat, pentru a-i cuprinde ntreg coninutul.
Proprietatea Enabled determin dac un control este sau nu activat ntr-un formular.
Proprietatea Visible seteaz vizibilitatea controlului.
Proprietatea Width and Height permite setarea nlimii i a limii controlului.
Metode i evenimente
Un eveniment este un mesaj trimis de un obiect atunci cnd are loc o anumit aciune. Aceast
actiune poate fi: interaciunea cu utilizatorul (mouse click) sau interaciunea cu alte entiti de
program. Un eveniment (event) poate fi apsarea unui buton, o selecie de meniu, trecerea unui
anumit interval de timp, pe scurt, orice ce se intampl n sistem i trebuie s primeasc un raspuns
din partea programului. Evenimentele sunt proprieti ale clasei care le public. Cuvantul-cheie event
contoleaz cum sunt accesate aceste proprieti.
Metodele Show() i Close(). Evenimentul Click
Metoda Dispose()
Metodele Clear() i Add()
Metoda ShowDialog()
83.Obiecte grafice. Validarea informaiilor de la utilizator. MessageBox. Interfa definit
de ctre utilizator.
Spaiul System.Drawing conine tipuri care permit realizarea unor desene 2D i au rol deosebit n
proiectarea interfeelor grafice.
Un obiect de tip Point este reprezentat prin coordonatele unui punct ntr-un spaiul bidimensional
Putem construi un obiect de tip Point pentru a redimensiona un alt obiect.
Structura Color conine date, tipuri i metode utile n lucrul cu culori. Fiind un tip valoare (struct) i
nu o clas, aceasta conine date i metode, ns nu permite instaniere, constructori, destructor,
motenire.
nainte ca informaiile de la utilizator s fie preluate i transmise ctre alte clase, este necesar s fie
validate. Acest aspect este important, pentru a preveni posibilele erori. Astfel, dac utilizatorul
introduce o valoare real (float) cnd aplicaia ateapt un ntreg (int), este posibil ca aceasta s se
comporte neprevzut abia cteva secunde mai trziu, i dup multe apeluri de metode, fiind foarte
greu de identificat cauza primar a problemei.
Datele pot fi validate pe msur ce sunt introduse, asociind o prelucrare unuia dintre handlerele
asociate evenimentelor la nivel de control (Leave, Textchanged, MouseUp etc.)
n unele situaii (de exemplu atunci cnd valorile introduse trebuie s se afle ntr-o anumit relaie
ntre ele), validarea se face la sfritul introducerii tuturor datelor la nivelul unui buton final sau la
nchiderea ferestrei de date.
MessageBox este o clas din spaiul de nume System.Windows.Forms, derivat din clasa
Object Show este o metod static din clasa MessageBox n momentul n care se apas butonul
OK, fereastra cu acest mesaj se nchide, metoda Show cednd controlul.
Metoda Show are mai multe forme n clasa MessageBox, fiind supradefinit. Apelul acestei funcii
se va face n funcie de parametri. S considerm acum apelul funciei Show cu doi parametri: al
doilea parametru se va referi la textul care apare pe bara de titlu n fereastr de mesaje:
Sunt multe aplicaii n care, poate, dorim s ne realizm o interfa proprie, ca form, n locul celei
dreptunghiulare propus de Visual C#.
n primul rnd trebuie s ne desenm propria fereastr de viitoare aplicaii. Pentru aceasta vom folosi,
de exemplu, aplicaia Paint.
Desenm o figur geometric care va constitui viitoarea noastr fereastr. Presupunem c dorim ca
fereastra s aib forma de oval. Colorm ovalul cu o culoare dorit, iar pentru fundal alegem orice
culoare, reinnd codul ei RGB Salvm desenul cu extensia gif: oval.gif S trecem acum la Visual C#.
Alegem: File | New Project | Windows Forms Application, iar ca nume InterfataUtilizator Aduc
controlul PictureBox. Din PictureBox Task aleg imaginea care s apar: oval.jpg iar la Size Mode
aleg StretchImage astfel nct imaginea s fie toat n PictureBox Deformez PictureBox-ul astfel
nct ovalul desenat s ocupe o suprafa care s corespund esteticii programatorului