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