Formularze o niestandardowych kształtach      Strona 1 z 1
w oparciu o materiały ze stron The Bits

       Wstęp

      Funkcja dająca możliwość tworzenia formularzy (okienek) o nieco innych kształtach niż prostokątne, jest zapewne jedną z mniej znanych funkcji Windows. Może brzmi to dość tajemniczo, ale w praktyce jest bardzo proste. Użyteczność takiego formularza pozostawia trochę do życzenia, jednak zawsze może on być kosmetycznym dodatkiem w postaci okienka powitalnego (tzw. splash screen), lub okienka typu "O programie..."
Poniżej znajduje się przykład okienka w kształcie litery W podobny do tego, który za chwilę utworzymy.

Okno w kształcie W

      Implementacja

Musimy zacząć od zdefiniowania tablicy ze współrzędnymi punktów wszystkich rogów formularza (może ich być tyle, ile chcesz). Następnie, aby otrzymać uchwyt do obszaru ekranu który właśnie zdefiniowaliśmy, użyjemy funkcji windows API o nazwie CreatePollygonRgn. Potem musimy ustawić współrzędne tego obszaru dla okna, które ma przyjąć taki kształt - wykorzystamy tutaj funkcję SetWindowRgn. Wszystkie te czynności mogą być wpisane już w konstruktorze formularza. Po skończeniu pracy z formularzem, musimy zlikwidować wcześniej utworzony obszar - najlepiej zrobić to w destruktorze.

      Kod źródłowy

Wybierz File|New Application i wpisz poniższy kod odpowiednio do konstruktora i destruktora formularza (albo analogicznie: do funkcji obsługujących zdarzenia OnCreate i OnDestroy). Zmienna prRegion jest typu HRGN i powinna znaleźć się w sekcji private deklaracji klasy (plik nagłówkowy). Kompletny i gotowy do kompilacji kod, możesz ściągnąć klikając tutaj.
 

__fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)
{

    TPoint lPoints[12];

 // Definicja wspolrzednych punktow dla ksztaltu litery W
 lPoints[0] = Point(0  , 0   );
 lPoints[1] = Point(50 , 0   );
 lPoints[2] = Point(180, 200 );
 lPoints[3] = Point(218, 100 );
 lPoints[4] = Point(256, 200 );
 lPoints[5] = Point(385, 0   );
 lPoints[6] = Point(435, 0   );
 lPoints[7] = Point(256, 300 );
 lPoints[8] = Point(218, 200 );
 lPoints[9] = Point(180, 300 );


    // Tu tworzysz obszar ograniczony twoimi punktami

    prRegion = CreatePolygonRgn(lPoints,// wskaznik
                                        // do zdefiniowanych punktow

                               10,//  liczba punktow

                               ALTERNATE);// tryb wypelnienia okna



    //(* Tu ustawiasz wczesniej zdefiniowany obszar,
                   // jako obszar okna *)

    SetWindowRgn(Handle,// uchwyt twojego okna

                 prRegion,// uchwyt zdefiniowanego obszaru

            True);// czy wyrysowac okno po ustawieniu obszaru? (TAK)
}

//------------------------------------------------------------------

__fastcall TForm1::~TForm1()  // destruktor formularza

{
    DeleteObject(prRegion);   // tu likwidujesz zdefiniowany obszar
}
      Wniosek

Jak widzisz, wykonanie tego pozornie trudnego zadania, wymagało użycia zaledwie dwóch funkcji. Najtrudniejszą częścią całego zagadnienia jest pierwsze znalezienie odpowiednich współrzędnych punktów dla danego kształtu, a potem można już eksperymentować do woli. Miłej zabawy!

Uwaga: Autorzy oraz The Bits, nie ponoszą odpowiedzialności za ewentualne szkody wynikłe z postępowania według zasad tego samouczka.
Tłumaczenie:  Maciek Durman