Prikazujem rezultate 1 do 3 od 3

Tema: [C++, WINAPI] Razni oblici prozora

  1. #1

    [C++, WINAPI]SRazni oblici prozora

    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.

    Code:
    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.



    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:

    Code:
    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.:

    Code:
    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.



    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.:

    Code:
    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).



    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
    AMD Athlon 64, 6000+ X2
    4 GB Ram 800 MHZ
    8800 GT, 1GB

    http://www.programiranje.big-forum.net

  2. #2

    Re: [C++, WINAPI]SRazni oblici prozora

    Ej Tracer, ovo ti je super!
    Jel znaš možda kako dobiti alpha poluprozirne rubove?

  3. #3
    Senior Member My way or the highway
    Datum registracije
    Dec 2006
    Lokacija
    Behind the blue eyes
    Postova
    7.757

    Re: [C++, WINAPI]SRazni oblici prozora

    Svaka čast kolega, samo tako naprijed !

Slične teme

  1. svi oblici kofeina
    By v4MP1r3 in forum Alt-F4
    Odgovora: 95
    Posljednji post: 19-09-2008, 19:32
  2. Razni forumi
    By Wolfwrath in forum Alt-F4
    Odgovora: 69
    Posljednji post: 13-02-2007, 19:35

Pravila postanja

  • Ne možeš stvarati nove teme
  • Ne možeš odgovarati na postove
  • Ne možeš slati privitke
  • Ne možeš mijenjati svoje postove
  •