[ Pobierz całość w formacie PDF ]
.Poniewa¿ jako prostok¹t ograniczaj¹cy wykorzystaliœmy obszar samegoformularza, d³ugoœci osi elipsy bêd¹ równe odpowiednio pocz¹tkowej szerokoœci iwysokoœci formularza.CombineRgn()Funkcja CombineRgn(), umo¿liwiaj¹ca z³o¿enie kilku uprzednio zdefiniowanychobszarów, jest narzêdziem niezwykle u¿ytecznym.Pozwala ona tworzyæ okna onieregularnym kszta³cie, coraz czêœciej spotykane w nowoczesnych programach.Wraz z funkcjami CreateEllipticRgn(), CreateRoundRect() i CreatePolygonRgn()funkcja CombineRgn() pozwala definiowaæ obszary o najbardziej wymyœlnychkszta³tach.Deklaracja funkcji CombineRgn() ma nastêpuj¹c¹ postaæ:int CombineRgn(HRGN hrgnDest, // uchwyt obszaru wynikowegoHRGN hrgnSrc1, // uchwyt pierwszego obszaru Ÿród³owegoHRGN hrgnSrc2, // uchwyt drugiego obszaru Ÿród³owegoint fnCombineMode // sposób ³¹czenia obszarów);Parametr hrgnDest jest uchwytem obszaru powsta³ego w wyniku z³o¿enia obszarówŸród³owych identyfikowanych uchwytami hrgnSrc1 i hrgnSrc2.Warto pamiêtaæ, ¿ehrgnDest musi okreœlaæ ju¿ istniej¹cy (wczeœniej utworzony) obszar.Sposób po³¹czenia obszarów okreœlony jest parametrem fnCombineMode.Mo¿e onprzyj¹æ jedn¹ z wartoœci przedstawionych w tabeli 14.26.Tabela 14.26.Dopuszczalne wartoœci parametru fnCombineModeSta³aZnaczenieRGN_ANDUtworzenie obszaru równego czêœci wspólnej obszarów Ÿród³owychRGN_COPYUtworzenie kopii obszaru danego parametrem hrgnSrc1RGN_DIFFUtworzenie obszaru równego tej czêœci obszaru hrgnSrc1, która nie nale¿y dohrgnSrc2RGN_ORUtworzenie obszaru równego sumie obszarów Ÿród³owychRGN_XORUtworzenie obszaru zawieraj¹cego wy³¹cznie punkty nale¿¹ce do obszaru hrgnSrc1albo hrgnSrc2 (ale nie obu obszarów)Wartoœæ zwracana przez funkcjê okreœla rodzaj utworzonego obszaru.Mo¿liwewartoœci zwracane przedstawiono w tabeli 14.27.Tabela 14.27.Wartoœci zwracane przez funkcjê CombineRgn()Wartoœæ zwracanaZnaczenieNULLREGIONUtworzono obszar pusty.SIMPLEREGIONUtworzono obszar prosty (pojedynczy prostok¹t).COMPLEXREGIONUtworzono obszar z³o¿ony (bardziej skomplikowany ni¿ prostok¹t).ERRORNie utworzono obszaru wynikowego – wyst¹pi³ b³¹d wykonania.Obszary przetwarzane przez funkcjê CombineRgn() nie musz¹ byæ ró¿ne.Jeœli jakoparametry wywo³ania przeka¿emy uchwyty Region1, Region1 i Region2, wynikoperacji zostanie umieszczony w pierwszym obszarze Ÿród³owym, co jest jaknajbardziej poprawne.Decyduj¹c siê na u¿ycie oddzielnego obszaru docelowego,nale¿y natomiast pamiêtaæ o jego utworzeniu przed wywo³aniem funkcji (samozadeklarowanie zmiennej typu HRGN nie wystarczy).Poni¿ej przedstawiono przyk³ad wykorzystania funkcji CombineRgn(), którypowinien dostatecznie wyjaœniæ zasady jej u¿ycia i rozwiaæ wszelkiew¹tpliwoœci.HRGN Region1, Region2;Region1 = CreateRectRgn(0, 0, 100, 100);Region2 = CreateRectRgn(50, 50, 150, 150);CombineRgn(Region1, Region1, Region2, RGN_XOR);SetWindowRgn(Handle, Region1, TRUE);Wykorzystanie powy¿szego kodu dla przyk³adowego formularza spowodujewyœwietlenie okna w postaci dwóch „przecinaj¹cych siê” prostok¹tów z pustymobszarem przeciêcia.Taka postaæ obszaru wynika z u¿ycia sta³ej RGN_XOR, któranakazuje utworzenie obszaru wynikowego, zawieraj¹cego wy³¹cznie punkty nale¿¹cedo jednego z obszarów Ÿród³owych, ale bez ich czêœci wspólnej.U¿ycie sta³ejRGN_OR spowodowa³oby powstanie obszaru z³o¿onego z obu obszarów Ÿród³owych³¹cznie z ich czêœci¹ wspóln¹.Zauwa¿my, ¿e obszar Region1 zosta³ tu u¿yty zarówno jako pierwszy obszarŸród³owy, jak i obszar wynikowy.W efekcie pierwotna postaæ Region1 zostaniezast¹piona z³o¿eniem Region1 i Region2.Taki sposób u¿ycia parametrów zwalnianas od koniecznoœci tworzenia dodatkowego obszaru przed wywo³aniem funkcji(zak³adamy, ¿e pierwszy obszar Ÿród³owy nie bêdzie nam póŸniej potrzebny –przyp.t³um.).To jeszcze nie wszystko.Kolejn¹ bardzo interesuj¹c¹ funkcj¹ do manipulacjiobszarami jest CreatePolygonRgn(), wspomniana ju¿ nieco wy¿ej.Oto jejdeklaracja:HRGN CreatePolygonRgn(CONST POINT *lppt, // wskaŸnik do tablicy wierzcho³kówint cPoints, // liczba wierzcho³kówint fnPolyFillMode // sposób wype³nienia);Parametr lppt wskazuje tablicê struktur typu POINT, okreœlaj¹cych wspó³rzêdnekolejnych wierzcho³ków wielok¹ta definiuj¹cego obszar.Zak³ada siê przy tym, ¿ewielok¹t jest domkniêty (tj.pierwszy i ostatni wierzcho³ek s¹ automatycznie³¹czone), a poszczególne wierzcho³ki nie mog¹ siê pokrywaæ.Parametr cPointsokreœla liczbê wierzcho³ków, zaœ wartoœæ fnPolyFillMode decyduje o sposobiewype³nienia wnêtrza tworzonego wielok¹ta i mo¿e przyj¹æ jedn¹ z wartoœciopisanych w tabeli 14.28.Tabela 14.28.Wartoœci parametru fnPolyFillModeSta³aZnaczenieALTERNATEWype³nianie w trybie naprzemiennym (wype³niane s¹ obszary pomiêdzy parzystymi anieparzystymi bokami wielok¹ta)WINDINGWype³nianie wszystkich obszarów zamkniêtychWspó³rzêdne poszczególnych wierzcho³ków definiowane s¹ w postaci struktur typuPOINT (mo¿na tu u¿yæ zarówno zdefiniowanej w API struktury POINT, jak idostêpnego w C++Builderze typu TPoint).Kreœlenie wielok¹ta sprowadza siê do³¹czenia kolejnych punktów odcinkami.Struktura typu POINT zawiera dwa pola, okreœlaj¹ce wspó³rzêdne x i ypojedynczego punktu.Aby utworzyæ wielok¹t, wystarczy zadeklarowaæ tablicêtakich struktur i wype³niæ je odpowiednimi wartoœciami.Pora na przyk³ad.Przedstawiony poni¿ej kod pokazuje sposób u¿ycia funkcjiCreatePolygonRgn() do utworzenia czegoœ w rodzaju znaku „Stop” – niecokoœlawego, ale na potrzeby szkoleniowe chyba wystarczaj¹cego.Przy okazji wartozwróciæ uwagê na inn¹ u¿yteczn¹ funkcjê Win32 – GetClientRect().Okreœla onawspó³rzêdne prostok¹ta definiuj¹cego wewnêtrzny obszar okna (ang.client area)i zwraca je w postaci struktury typu RECT, zawieraj¹cej wspó³rzêdne lewegogórnego i prawego dolnego wierzcho³ka prostok¹ta.Zarówno GetClientRect(), jaki typ strukturalny RECT s¹ standardowo udostêpniane poprzez bibliotekê VCL.Uruchom IDE i utwórz now¹ aplikacjê.Zmieñ kolor t³a formularza g³Ã³wnego na czerwony (clRed); wstaw do formularzaprzycisk i zmieñ jego tekst na Stop.Uzupe³nij kod funkcji OnClick() przycisku zgodnie z poni¿szym wydrukiem [7 Wprzyk³adzie u¿yto przycisku typu BitBtn, jednak mo¿na równie¿ wykorzystaæzwyk³y przycisk typu TButton.Nale¿y te¿ pamiêtaæ o odpowiednim ustawieniuprzycisku, by po „obciêciu” obszaru formularza by³ on nadal widoczny – przyp.t³um.]:void __fastcall TForm1::BitBtn1Click(TObject *Sender){Close();}W pliku Ÿród³owym formularza g³Ã³wnego wpisz nastêpuj¹cy kod:__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){RECT R;R = GetClientRect();POINT p[8];p[0].x =87; p[0].y =0;p[1].x =25; p[1].y =59;p[2].x =24; p[2].y =123;p[3].x =79; p[3].y =176;p[4].x =171; p[4].y =173;p[5].x =207; p[5].y =123;p[6].x =208; p[6].y =59;p[7].x =156; p[7].y =0;HRGN MyRegion;MyRegion = CreatePolygonRgn(p, 8, ALTERNATE);SetWindowRgn(Handle, MyRegion, true);}Tytu³em demonstracji w powy¿szej funkcji utworzyliœmy strukturê R typu RECT, anastêpnie umieœciliœmy w niej wspó³rzêdne wewnêtrznego obszaru okna, wywo³uj¹cfunkcjê GetClientRect().Zadeklarowana poni¿ej tablica p sk³ada siê ze strukturtypu POINT, zawieraj¹cych wspó³rzêdne kolejnych wierzcho³ków naszego „znaku”.Wielok¹t ograniczaj¹cy pole znaku zostanie utworzony przez po³¹czenieposzczególnych wierzcho³ków [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • coubeatki.htw.pl