Sunteți pe pagina 1din 8

26.

Ferestre child. Butoanele i input focus. // .

Butoanele de tip Push, check-box-urile, radio butoanele recepioneaz input


focus-ul atunci cnd sut acionate cu mouse-ul. Windows semnaleaz faptul c
fereastra descendent l-a recepionat nconjurnd-o printr-un dreptunghi ntrerupt.
Atunci cnd fereastra descendent recepioneaz input focus-ul, fereastra printe l
pierde. Astfel putem spune c acionarea oricrui buton de la tastatur se va
rsfrnge asupra ferestrei descendent. Totui, acestea rspund doar la acionarea
butonului SPACE.
Atunci cnd SO schimb input focus-ul de la o fereastr la alta (de la printe la
descendent, de exemplu), acesta trimite mesaje WM_KILLFOCUS i WM_SETFOCUS.
Mai nti acesta trimite mesaj WM_KILLFOCUS ferestrei care pierde inputfocus-ul. Parametrul wParam conine variabila handle a ferestrei care trebuie
s primeasc input focus-ul.
Dup aceasta SO trimite mesaj WM_SETFOCUS ferestrei, care trebuie s-l
primeasc, iar wParam conine variabila handle a ferestrei care a pierdut
input focus-ul.
Fereastra parinte poate preveni fereastra descendent de a recepiona input focus-ul,
tratnd mesajul WM_KILLFOCUS. Astfel, dac fereastra printe pierde input focus-ul,
ea l poate restabili apelnd SetFocus(), indicnd ca parametru variabila handle a
ferestrei printe.
27.

Ferestre child. Butoane visibile i accesibile. // .


Pentru a putea fi acionate de la mouse sau tastatur, ferestrele descendent


trebuie s fie vizibile i activate. Vizibilitatea ferestrei se indic prin flagul
WS_VISIBLE n timpul apelrii funciei CreateWindow(), alturi de flagul WS_CHILD i
stilul butonului. Fr flagul WS_VISIBLE, fereastra descendent nu va fi afiat pn
cnd nu va fi apelat suplimentar funcia ShowWindow(), unul dintre parametri fiind
variabila handle a ferestrei descendent.
Oricare fereastr descendent este n mod implicit activat. Pentru a deactiva oricare
fereastr descendent, trebuie apelat funcia EnableWindow(hWndChild, FALSE),
unde hWndChild este variabila handle a ferestrei descendent. O fereastr
descdendent deactivat are textul colorat n gri i nu poate fi acionat. Parametrul
TRUE n funcia de mai sus reactiveaz fereastra n caz de necesitate.
Verificarea vizibilitii sau faptului dac este vreo fereastr activat se face cu
ajutorul funciilor IsWindowVisiblei IsWindowEnabled
28. Ferestre child. Check box. // .
Check box-ul sau caseta de validare este o caset ptrat, care poate fi bifat i
care afieaz un text n rnd cu aceast caset. Acioneaz ca un comutator,
permiind utilizatorului s aleag careva opiuni. Identificatorii, care permit crearea
check-box-urilor: BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE, BS_AUTO3STATE.
n cazul check-box-urilor simple, pentru a le comuta, trebuie trimis mesajul
BM_SETCHECK, atunci cnd se proceseaz mesajul WM_COMMAND. Fr acest
mesaj, caseta de validare nu poate fi comutat prin intermediul mouse-ului sau a
tastaturii. Atunci cnd este ales BS_AUTOCHECKBOX, acesta se valideaz automat
cnd este acionat prin intermediul mouse-ului. BS_3STATE i BS_AUTO3STATE indic
casete de validare care permit alegerea opiunilor intermediare, pe lng cele
standard: ON sau OFF. n practic, aceasta nseamn c pe lng bifa tradiional,
caseta poate fi colorat n culoare sur, determinnd astfel a 3-a opiune.
Casetele de validare sunt aliniate la stnga dreptunghiului zonei client i plasate n
poziia specificat n timpul apelului funciei CreateWindow(). nlimea minim a
casetei de validare este nlimea unui caracter, iar lungimea lungimea textului
afiat +2.

29.

Ferestre child. Clasa barelor de derulare.

// .

Pentru a utiliza barele de derulare n zona client, trebuie create ferestre


descendent pe baza clasei barelor de derulare. Controalele de tip scroll bar pot fi
create prin utilizarea identificatorului SBS_VERT sau SBS_HORZ. n comparaie cu
butoanele obinuite, ferestrele de tip scroll bar nu trimit mesaje WM_COMMAND, ci
WM_HSCROLL sau WM_VSCROLL. Diferena ntre barele de derulare a ferestrei i
ferestrele descendent de tip bare de derulare este n parametrii lParam: pentru
barele de derulare a ferestrei printe el va fi 0, iar pentru cele descendent
variabila handle a ferestrei descendent. Parametrul wParam este utilizat la fel
pentru barele ferestrei printe, ct i pentru ferestrele descendent.
Barele de derulare a ferestrei printe sunt de dimensiuni fixe. n cazul ferestrelor
descendent acestea pot fi modificate n timpul apelului funciei CreateWindow(), n
cmpurile destinate indicrii dimensiunilor ferestrei.
Ferestre child. Clasa de redactare. // .
Clasa de editare este utilizat pentru a crea o fereastr descendent pentru
editare a textului. Aceasta este un dreptunghi, n care poate fi introdus oricare text,
pentru a putea fi manipulat ulterior. Pentru a crea o astfel de fereastr descendent,
este necesar de a utiliza numele clasei edit, atunci cnd se apeleaz funcia
CreateWindow(). Pentru a seta anumite caracteristici ale textului introdus n caseta
de editare, pot fi folosii indicatori: ES_LEFT, ES_AUTOHSCROLL, ES_LOWERCASE,
etc.
30.

31.

Ferestre child. Clasa static. // .

Pentru a crea ferestre descendent statice, este necesar de a indica numele


clasei static, la crearea ferestrei prin apel la CreateWindow(). Aceste ferestre nu
primesc comenzi de la tastatur sau mouse i nu trimit mesaje WM_COMMAND.
Atunci cnd este mutat mouse-ul deasupra unei ferestre statice, sau se execut un
click pe aceasta, fereastra descendent primete un mesaj WM_NCHITTEST i
returneaz valoarea HTTRANSPARENT. Astfel SO trimite acelai mesaj ferestrei de
sub fereastra descendent, care de obicei este fereastra printe. Aceasta trimite
mesajul funciei DefWindowProc, rezultnd astfel un mesaj de mouse corespunztor
zonei client.
Practic, ferestrele descendent create pe baza clasei statice sunt dreptunghiuri
asemntoare cu dreptunghiul zonei client, care prin intermediul indicatorilor pot fi
colorate diferit (SS_BLACKRECT) i pot conine text aliniat n mod diferit (SS_LEFT).
32.

Ferestre child. Coduri de ntiinare.

// .

Ferestrele descendent pot comunica cu ferestrele printe n ambele sensuri.


Ferestrele descendent genereaz mesaje WM_COMMAND, care le transmite ferestrei
printe. lParam conine variabila handle a ferestrei descendent, LOWORD (wParam)
conine identificatorul ferestrei descendent, HIWORD (wParam) conine codul de
ntiinare transmis ferestrei printe. Exemplu de cod de ntiinare: BN_CLICKED
(valoarea 0), BN_PUSHED (valoarea 2), etc.
33.

Ferestre child. Colorarea barelor de derulare i a textului static.


// .

Colorarea barelor de derulare se face prin tratarea mesajelor


WM_CTLCOLORSCROLLBAR. Ca rspuns la acest mesaj, fereastra printe poate
utiliza contextul de dispoztitv pentru a seta culoarea barei. De fapt tratarea acestui
mesaj returneaz variabila handle a pensulei utilizate pentru desenarea barei de
derulare.
n cazul textului static este tratat mesajul WM_CTLCOLORSTATIC, ulterior
apelndu-se funciile SetBkColor() - pentru fundal sau SetTextColor() pentru text.

34.

Ferestre child. Colorarea fondului.

// .

(*traducere din englez Petzold BackGround Color)

n mod implicit, ferestrele descendent sunt desenate utiliznd pensula de culoare


gri, pentru c butoanele au fost create pentru a fi utilizate n casetele de dialog, a
cror fundal este de aceast culoare. Setarea culorii de fundal a ferestrei printe se
face n timpul setrii parametrilor clasei ferestrei: wndclass.hbrBackground=(HBRUSH)
GetStockObject(WHITE_BRUSH).

Pentru a adapta culoarea ferestrei descendent la culoarea fundalului ferestrei


printe vom fi nevoii ori s schimbm modalitatea de desenare a fundalului
ferestrei printe, ori s schimbm culoarea ferestrei descendent. O modalitate de a
nelege cum aceasta se face este nelegerea culorilor de sistem (ntrebarea 35)

(Petzold Coloring the Background - ** cred c proful asta a avut n vedere)

n programul cu bare de derulare, care schimb culoarea fundalului ferestrei printe,


culoarea de fundal este setat n felul urmtor: wndclass.hbrBackground=
CreateSolidBrush(0)

Atunci cnd este mutat bara de derulare, programul trebuie s creeze o nou
pensul i s transmit variabila handle a pensulei structurii clasei de fereastr.
Accesarea acestei variabile handle se face prin apel la funcia GetClassWord., iar
setarea prin SetClassWord.
Atunci cnd oricare dintre bare i schimb poziia, se terge pensula folosit i se
creeaz una nou prin apel la funcia:
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],
color[2]))))

Cnd este necesar recolorarea fundalului se apeleaz InvalidateRect(), ceea ce


determin plasarea n coad a unui mesaj WM_PAINT. Astfel nct acesta este un
mesaj de prioritate joas, el nu va fi procesat att timp ct se porceseaz mesajele
provenite de la barele de derulare. Putem corecta acest lucru prin apel implicit al
funciei UpdateWindow(hWnd). Totui UpdateWindow() poate frna interpretarea
tastelor mouse-ului i a tastaturii. Putem deci transmite tratarea mesajelor
WM_PAINT funciei DefWindowProc(), ceea ce nseamn ca programul nostru va
trata doar un BeginPaint() i EndPaint() atunci cnd i va fi trimis un mesaj
WM_PAINT.
35.
Ferestre child. Culori de sistem. // .
SO Windows utilizeaz 29 de culori pentru a desena diferite componente artate la
ecran. Aceste 29 de culori pot fi accesate prin GetSysColor() i modificate prin
SetSysColor(). Identificatorii definii n fiierele header specific culorile de sistem.
**Setarea culorii de sistem prin SetSysColor() se face doar pentru sesiunea de
Windows curent.
Culorile de sistem (unele) pot fi modificate i din Control Panel. Culorile selectate
sunt stocate n registru pentru WinNT i n fiierul WIN.INI pentru Win98. Att n
registru, ct i n fiierul WIN.INI, cuvintele cheie pentru culorile de sistem sunt
diferite de identificatorii utilizai la apelurile funciilor GetSysColor() sau
SetSysColor().
Exemplu: Identificatorul GetSysColor() sau SetSysColor() COLOR_SCROLLBAR
Identificatorul din registru sau WIN.INI
Scrollbar
Culoarea standard RGB
C0C0C0
Este utilizat pentru setarea culorii barelor de derulare.
** Progresul SO Windows a determinat utilizarea elementelor grafice mai sofisticate,
incluznd diferite elemente 3D, ceea ce a determinat mrirea numrului culorilor de
sistem. Astfel, pentru versiunile mai recente de Windows, identificatorii culorilor pot
s nu mai fie att de explicii:
COLOR_SCROLLBAR seteaz culoarea barelor de derulare.

36.

Ferestre child. Interfaa tastaturii. // .

Barele de derulare pot procesa acionrile butoanelor de la tastatur. Astfel


acionarea butoanelor Home, End, Page Up, Page Down genereaz diferite valori
pentru parametrul wParam, n cazul mesajelor legate de barele de derulare:
SB_TOP, SB_BOTTOM, SB_PAGEUP, SB_PAGEDOWN respectiv.
Pentru a transmite input focus-ul barei de derulare atunci cnd este acionat cu
mouse-ul, trebuie inclus identificatorul WS_TABSTOP atunci cnd se creaz fereastra
descendent prin CreateWindow().
Ulterior trebuie tratat mesajul WM_SETFOCUS, apelndu-se funcia SetFocus
(hwndScroll[idFocus]), unde hWndScroll este variabila handle a ferestrei descendent,
iar idFocus o variabil global.
Atribuirea input focus-ului barei de derulare determin utilizarea interfeei
complete a tastaturii de ctre bara de derulare. Oricum, aceasta va ignora o bun
parte din butoane, axndu-se doar pe cele, care determin poziia cursorului.
37.

Ferestre child. Introducerea unei proceduri de fereastr noi.


// .

Presupunem c avem situaia: avem mai multe bare de derulare n zona client i
este necesitatea de a transmite input focus-ul de la una la alta prin intermediul
tastei Tab. Dificultatea o reprezint faptul c o bar de derulare deja deine input
focus-ul i ignor apsarea Tab-ului.
Pentru a rezolva aceast problem trebuie introdus o nou procedur de
fereastr pentru fereastra descendent, care va trata anumite mesaje, de care avem
nevoie i va transmite controlul procedurii de fereastr implicite. Setarea unei noi
proceduri de fereastr se face prin apel la funcia SetWindowLong().
Astfel, pentru fiecare dintre barele de derulare prezente se apeleaz aceast
funcie:
OldScroll[i]=(WNDPROC)SetWindowLong(hwndScroll[i],GWL_WNDPROC,(LONG)ScrollProc))

n rezultat, ScrollProc va recepiona toate mesajele, pe care SO le trimite barelor


de derulare n cadrul programului.
38.

Ferestre child. Mesajul WM_CTLCOLORBTN.

// .

WM_CTLCOLORBTN

Astfel nct este posibil de a seta culoarea zonei client i a textului afiat, astfel nct
culoarea acestora s coincid cu culoarea butoanelor i a ferestrelor descendent.
Apare ntrebarea: este posibil de a adapta culoarea butoanelor la culorile pe care le
preferm? Teoretic da, practic nu, pentru c unica posibilitate de a o face este
funcia SetSysColor(). ns aceast funcie determin schimbarea tuturor culorilor n
sistem ceea ce le-ar schimba n toate aplicaiile, care ruleaz curent n Windows.
O alt modalitate (teoretic) mai bun este tratarea mesajelor WM_CTLCOLORBTN.
Acest mesaj este trimis de ctre fereastra descendent atunci cnd aceasta i
deseneaz zona client. Aici este cazul de a schimba culorile, pe care fereastra
descendent le folosete pentru a colora fundalul: SetBkColor() sau pentru a scrie un
text: SetTextColor().
Problema care apare este faptul c doar butoanele de tip Push sau cele desenate de
utilizator trimit astfel de mesaj ferestrei printe i doar butoanele owner-draw
(desenate de utilizator) rspund la procesarea acestui mesaj de ctre fereastra
printe, ceea ce, de fapt, este inutil pentru c n final anume fereastra printe este
responsabil de desenarea butoanelor.
Ferestre child. Radio buttons. // .
Radio buton este o fereastr descendent, care, n grup, permit alegerea unor
opiuni, care se exclud reciproc. Arat ca o caset de validare, numai c n loc de
caset este un cercule alb, care, n caz c este validat, este marcat de un cercule
negru mai mic.
39.

Indicatorii utilizai pentru crearea unui buton radio: BS_RADIOBUTTON,


BS_AUTORADIOBUTTON.
Diferena ntre acetia este faptul c pentru primul trebuie controlat manual
marcarea lui, adic pentru a permite validarea acestuia trebuie apelat funcia
SendMessage() cu parametrul BM_SETCHECK i wParam egal cu 1: SendMessage
(hwndButton,BM_SETCHECK,1,0)

Auto-radio-butonul se valideaz automat la acionarea lui prin intermediul unui


dispozitiv de intrare (mouse, tastatur).
Stingerea butoanelor radio, adic interzicerea validrii lor se face prin apel la funcia
SendMessage(hwndButton,BM_SETCHECK,0,0), unde wParam este egal cu 0.
**Diferena substanial ntre o caset de validare i buton radio este faptul c un
buton radio nu poate fi invalidat prin apsare repetat. El este asemntor cu
butoanele cu ajutorul crora se alege frecvena radio prestabilit din automobile:
doar un buton poate fi acionat ntr-un moment de timp.
40.

Ferestre child. Stilurile clasa de redactare.

// .

Implicit o fereastr descendent de editare are doar o singur linie. ES_MULTILINE


transform fereastra de editare ntr-una cu mai multe linii. ES_AUTOVSCROLL
automat deruleaz pe vertical textul scris, iar ES_AUTOHSCROLL pe orizontal.
Pentru adugarea barelor de derulare n fereastra de editare, trebuie folosii
indicatorii barelor de derulare standard WS_HSCROLL, WS_VSCROLL.
Atunci cnd este ales un text, el nceteaz s fie evideniat cnd fereastra de editare
pierde input-focus-ul. Pentru a preveni acest fapt trebuie folosit indicatorul
ES_NOHIDESEL. Toi aceti indicatori determin stilul ferestrei de editare.
41.

Ferestre child. Utilizarea ferestrelor de redactare de control.

// .

Atunci cnd se utilizeaz mai multe ferestre de editare, este necesar de a utiliza
principiul windows subclassing pentru a semnala trecerea de la o fereastr de
editare la alta, adic de a crea o procedur de fereastr specific pentru fiecare
fereastr de editare. O alt modalitate este interceptarea butoanelor Tab sau ShiftTab.
Exist diverse mesaje pentru interacionarea cu textul introdus n caseta de
editare. Toate aceste mesaje sunt trimise prin intermediul funciei SendMessage(),
utiliznd indicatorul necesar WM_COPY, WM_CUT, etc.
Se poate obine nceputul irului i sfritul acestuia ( SendMessage(hwndEdit,
EM_GETSEL,(WPARAM)&iStart,(LPARAM)&iEnd)), poate fi nlocuit textul cu un alt ir
(SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString)) sau obinut numrul de
linii (iCount=SendMessage(hwndEdit,EM_GETLINECOUNT,0,0);).
87.STRUCTURA UNEI APLICAII ORIENTAT PE OBIECTE N C#. Clas de baz i clase
derivate.
n C#, funcionalitatea unei clase poate fi extins aplicnd motenirea. Clasa derivat poate
moteni atributele clasei de baz, metodele acesteia. De asemenea pot fi suprascrise
proprietile sau metodele, la necesitate. Motenirea se definete prin operatorul : . Nu este
permis motenirea de la mai mult de o clas de baz.

public class Parent

//clasa de baz

{
string parentString;
public Parent()

//constructorul clasei de baz

{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)

//metoda clasei de baz

{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()

//metoda clasei de baz

{
Console.WriteLine("I'm a Parent Class.");
}
}

public class Child : Parent

//clasa derivat

{
public Child() : base("From Derived")

//base este utilizat pentru a accesa metodele


clasei de baz din clasa derivat

{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();

//base acceseaz metoda print din clasa parent

Console.WriteLine("I'm a Child Class.");


}
public static void Main()

{
Child child = new Child();

//se iniializeaz un obiect de tip Child

child.print();

//se vor afia 2 iruri > unul prin


base.print, altul prin writeline()

((Parent)child).print();

//se acceseaz metoda print din clasa de baz

}
}

88.STRUCTURA UNEI APLICAII ORIENTAT PE OBIECTE N C#. Constructori.


Suprancrcarea constructorilor i definirea constructorilor n clasele
derivate. Destructor. Metode.
Cteva noiuni legate de constructorii unei clase:
Constructorul este o funcie care face parte din corpul unei clase. Corpul constructorului este
format
din instruciuni care se execut la crearea unui nou obiect al clasei respective (sau la
crearea clasei,
n cazul constructorilor cu modificatorul static).
pot exista mai muli constructori care se pot diferenia prin lista lor de parametri
constructorii nu pot fi motenii
dac o clas nu are definit niciun constructor, se va asigna automat constructorul fr
parametri al clasei de baz (clasa object, dac nu este precizat clasa de baz)
Instanierea presupune declararea unei variabile de tipul clasei respective i
iniializarea acesteia prin apelul constructorului clasei (unul dintre ei, dac sunt definii mai
muli) precedat de operatorul
new.
public class Copil
{
protected string nume; //data accesibila numai in interiorul
//clasei si a claselor derivate
public Copil ( ) //constructorul fara parametrii ai clasei
{nume = Console.ReadLine( );}
public Copil (string s) //constructor cu parametru
{nume = s;}
}
class Fetita: Copil
{
public Fetita (string s): base(s) //base semnifica faptul ca
{ //se face apel la
nume = "Fetita "+ nume; //constructorul
//din clasa de baza
}}
...
Copil c1 = new Copil ( ); //numele copilului se citeste de la
//tastatura
Copil c2 = new Copil ("Gigel"); //numele lui c2 va fi Gigel
Fetita f1 = new Fetita ( );
Fetita f2 = new Fetita ("Maria");
Destructor:
Corpul destructorului este format din instruciuni care se execut la distrugerea unui obiect
al clasei respective. Pentru orice clas poate fi definit un singur constructor. Destructorii nu
pot fi motenii. n mod normal, destructorul nu este apelat n mod explicit, deoarece
procesul de distrugere a unui obiect este invocat i gestionat automat de Garbage Collector

89. CLASE I FUNCII GENERICE. DERIVAREA CLASELOR (MOTENIRE). Principiile


motenirii. Accesibilitatea membrilor motenii.
90. Metode. Interfee n C#.

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