PDA

Pogledaj cijelu verziju : [C++, WINAPI] Razni oblici prozora



Tracer
15-01-2008, 09:58
Evo malog tutorijala o oblicima formi (prozora). Može čak biti koristan i za one koji rade na različitim programskim jezicima jer se ovdje koriste WINAPI funkcije... Uglavnom, ja sam koristio Turbo C++ 2006. Besplatna inačica se može skinuti na http://www.turboexplorer.com

Prozori (forme) su obično pravokutnog oblika. Međutim, moguće ih je oblikovati po volji. Da bi to realizirali moramo kreirati prostorne regije objektima tipa HRGN. Njima je moguće definirati razne oblike prozora tako da on izgleda kao elipsa, kružnica, pravokutnik, dok regije možete i kombinirati.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
HRGN Regija = CreateEllipticRgn(0, 0, Width, Height);
SetWindowRgn(Handle, Regija, true);
DeleteObject(Regija);
}

Primjerice, prilikom izvršavanja ove funkcije vaš prozor će poprimiti oblik elipse, ili kružnice ukoliko su izrazi Width i Height jednaki.

http://img267.imageshack.us/img267/6789/a1tw5.png

Nakon kreiranja regije njen oblik se na prozoru realizira funkcijom SetWindowRgn. Zadnji argument je logičkog tipa (istina ili laž). Uvijek ga je poželjno postaviti na vrijednost true, ukoliko želite da se nova regija prozora realizira odmah nakon poziva funkcije SetWindowRgn.

Osim funkcije CreateEllipticRgn, postoje i druge poput:


WINAPI CreateEllipticRgn( IN int, IN int, IN int, IN int);
WINGDIAPI HRGN WINAPI CreateEllipticRgnIndirect( IN CONST RECT *);
WINAPI CreatePolyPolygonRgn( IN CONST POINT *, IN CONST INT *, IN int, IN int);
WINAPI CreateRectRgn( IN int, IN int, IN int, IN int);
WINGDIAPI HRGN WINAPI CreateRectRgnIndirect( IN CONST RECT *);
Zasebno, svakom pojedinom funkcijom se kreira pojedina regija, a može ih se kombinirati funkcijom CombineRgn. Npr.:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
HRGN Regija1= CreateEllipticRgn(0, 0, Width, Height);
HRGN Regija2= CreateRectRgn(0, 0, Width / 2, Height / 2);
HRGN Destinacija = CreateEllipticRgn(0, 0, 0, 0);

CombineRgn(Destinacija, Regija1, Regija2, RGN_XOR);
SetWindowRgn(Handle, Destinacija, true);
DeleteObject(Regija1);
DeleteObject(Regija2);
DeleteObject(Destinacija);
}
Funkcija CombineRgn ima četiri argumenta. To su: Odredišna regija, dvije regije koje treba kombinirati i vrijednost kojim se definira kombiniranje. To mogu biti vrijednosti RGN_XOR i RGN_AND.

http://img246.imageshack.us/img246/3402/a2rf5.png

Sada je korištena vrijednost RGN_XOR. Da smo koristili RGN_AND dobili bi sasvim obrnutu kombinaciju. Sve sada vidljivo bi bilo nevidljivo i obratno. Točnije, vidjeli bi jednu četvrtinu elipse (onu koja je sada nevidljiva).

Regije možete definirati i pomoću poligona tj. točku po točku. Npr.:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
POINT tocke[6];
tocke[0]S= Point(100, 0);
tocke[1]S= Point(300, 0);
tocke[2]S= Point(350, 75);
tocke[3]S= Point(300, 150);
tocke[4]S= Point(100, 150);
tocke[5]S= Point(50, 75);

HRGN Regija = CreatePolygonRgn(tocke, 6, ALTERNATE);
SetWindowRgn(Handle, Regija, true);
DeleteObject(Regija);
}
Poligon se definira kao prostor omeđen određenim brojem točaka. U prethodnom slučaju riječ je o poligonu koji sadrži šest točaka koje su definirane kao podaci tipa POINT. Svaka točka je spremljena u zaseban element polja tocke, koje je predano kao argument funkciji CreatePolygonRgn. Kako je riječ o predaji 1D polja funkciji predaje se i njegov broj elemenata (broj točaka).

http://img212.imageshack.us/img212/8130/a3nn3.png

Ukoliko vam smeta gornji plavi okvir lako ga uklonite tako da izrazu BorderStyle dodijelite vrijednost bsNone. Kada konačno definirate izgled prozora (forme) preostaje vam jedino popuniti ga željenim sadržajem. Moguće je da se izgled forme prilagodi izgledu neke BMP ili JP(E)G slike, a za to već možete pronaći i mnoštvo komponenti na net-u.

Eto toliko za sada ;)

coyote
03-03-2009, 13:12
Ej Tracer, ovo ti je super! :wink:
Jel znaš možda kako dobiti alpha poluprozirne rubove?

SkunK
03-03-2009, 15:21
Svaka čast kolega, samo tako naprijed ! :)