Bejelentkezés

E-mail: 
Jelszó: 
| Regisztráció | Jelszó? |
 



Menü

.Net világ havilap 2004. augusztus - 6. oldal

GDI+ alapok

A  .NET  Framework  a  Graphics  Device  Interface  (GDI)  továbbfejlesztett  változatára  (GDI+)  építve  számos  osztályt  kínál  a  2D  grafikák  elkészítéséhez,  képek  feldolgozásához.  Az  új  -  jelenleg  még  készülő  -  Windows  verzióban  (Longhorn)  a  grafikai  lehetőségek  jelentősen  kibővülnek  majd.  Az  új  megjelenítési  réteg  (Avalon)  számos  újdonságot  hoz  majd  e  téren,  mint  például  a  3D  grafika.  Mostani  cikkünkben  a  .NET  Framework  jelenlegi  képességeit  vesszük  szemügyre  és  megvizsgáljuk  a  System.Drawing  névtérben  található  Graphics  osztályt,  mely  minden  grafika  készítés  alappillére.A  Graphics  osztályban  megtalálunk  minden  olyan  alapvető  metódust,  mellyel  a  legáltalánosabb  grafikai  feladatok  elvégezhetők,  mint  például  a  különféle  objektumok  rajzolása  (ellipszis,  téglalap,  görbék,  vonalak,  szövegek,  stb.).  Ezen  osztály  kapcsolatot  teremt  a  rajz  terület  (pl.:  Form)  és  a  grafikát  kirajzoló  kód  között.  Leghagyományosabb  eset  a  Form  Paint  eseményének  a  felhasználása,  ahol  paraméterként  kapunk  egy  használatra  kész  Graphics  osztályt,  mellyel  képesek  vagyunk  a  Form  területére  rajzolni.  A  Paint  esemény  akkor  kerül  meghívásra,  ha  a  Form  területét  valamilyen  ok  miatt  újra  kell  rajzolni.  Ennél  az  eseménynél  helyezhetjük  el  azt  a  kódot,  mely  felhasználva  a  Graphics  osztályt,  létrehozza  a  kívánt  rajzot  a  Form-on.  A  grafikák  létrehozására  persze  más  mód  is  létezik.  Rajzolhatunk  közvetlenül  is  a  Form-ra.  Ehhez  létre  tudunk  hozni  Graphics  osztályt  programunk  bármely  pontján.  Nagy  szerepe  van  a  grafikák  kezelésének  egyedi  kontrolok  készítésekor.  Ilyen  esetekben  a  kontrolok  kinézetéről,  azok  vizuális  megjelenéséről  magunknak  kell  gondoskodni,  felhasználva  mindazt,  amit  a  GDI+  nyújt.  Nyomtatási  feladatok  esetén,  a  papíron  megjelenő  információkat  is  épp  úgy  kell  rajzolnunk,  mintha  csak  képernyőre  tennénk  ugyanazt.A  GDI+  lehetőségei  messze  felülmúla  elődjét  a  GDI-t,  ezért  érdemes  alaposan  megismerkedni  vele.  Akik  csak  most  kezdenek  foglalkozni  a  grafikák  kezelésével,  azok  számára  kiváló  alapot  nyújt  e  cikk,  ahol  sorra  vesszük,  hogy  mit  is  tud  a  Graphics  osztály...

PéldaprogramA  mellékelt  példaprogram  használata  igen  egyszerű,  egy  ListBox-ba  felsoroltunk  néhány  Graphics  osztálybeli  függvényt,  lehetőséget.  A  ListBox-ra  kattintva  lefuttatjuk  az  adott  funkciót,  mely  a  Form  területére  rajzol,  így  rögtön  láthatóvá  is  válik  annak  hatása.ListBox  SelectedIndexChanged  eseményA  ListBox-ra  történő  kattintáskor  jön  létre  a  SelectedIndexChanged  esemény.  Ez  lesz  az  a  pont,  ahol  aktivizálnunk  kell  a  kiválasztott  elemhez  tartozó  funkciót.  Ezt  most  egy  apró  trükkel  egyszerűsítjük:  futási  időben,  név  alapján  hívjuk  meg  a  kiválasztott  elemhez  tartozó  függvényt.        private  void  listBox1_SelectedIndexChanged(            object  sender,  System.EventArgs  e)        {A  meghívandó  függvény  nevét  a  function  nevű  változóba  állítjuk  össze,  mely  a  Function  szóból  és  a  ListBox  kiválasztott  elemének  sorszámából  áll.            string  function  =  "Function"  +                  listBox1.SelectedIndex.ToString();A  Form-ról  lekérjük  annak  típusát  a  GetType  függvénnyel,  majd  a  kapott  objektum  InvokeMember  függvényét  használva  képesek  vagyunk  a  fenti  sztringbe  megadott  függvényt  lefuttatni.            this.GetType().InvokeMember(function,                  BindingFlags.Default  |                  BindingFlags.InvokeMethod,                  null,  this,  new  object  []  {});          }Function0  DrawStringElső  példánk  a  szövegek  kiírása  lesz.  Elég  gyakori  feladat,  hogy  különböző  helyeken,  különböző  szöveget  írjunk  ki.  A  kiírásnak  sokféle  módja  létezik,  most  vegyük  a  legegyszerűbb  esetet.        public  void  Function0()        {Mivel  most  közvetlenül  rajzolunk  a  Form  területére  és  nem  a  Paint  eseménykor,  ezért  a  következőkre  kell  figyelni:  egy  esetlegesen  már  kirajzolt  grafika  zavaró  lehet  az  aktuális  rajzolásunknál  ezért  azt  "letöröljük".  Ehhez  meghívjuk  az  Invalidate  függvényt,  mely  érvénytelenítni  a  Form  területét.  Ez  idővel  a  Paint  esemény  lefutását  és  a  teljes  Form  területének  újrarajzolását  jelenti.  Hogy  ez  a  művelet  mindenképpen  megtörténjen,  mielőtt  még  bármit  is  rajzolnánk,  meghívjuk  az  Update  függvényt  is.  Ez  utóbbi  gondoskodik  arról,  hogy  a  Form  érvénytelen  része  újrarajzolódjon.  Amíg  ez  nem  történik  meg,  addig  nem  is  folytatódik  az  Update  után  a  programunk  futása,  míg  az  Invalidate  hívása  után  azonnal  tovább  fut.            Invalidate();            Update();Most,  hogy  üres  a  Form  területe,  már  nekiállhatunk  a  rajzolásnak.  Ehhez  szükségünk  van  a  már  említett  Graphics  osztályra.  A  Control  osztály  tartalmaz  egy  CreateGraphics  nevű  függvényt,  mely  létrehoz  egy  új  Graphics  osztályt,  amely  az  adott  kontrolra  képes  rajzolni.  Mivel  a  Form  is  a  Control-ból  származik,  így  most  használhatjuk  ezt  a  Graphics  létrehozásához.            Graphics  g  =  CreateGraphics();Ha  szöveget  szeretnénk  megjeleníteni,  akkor  biztos  szükségünk  lesz  egy  betűtípusra.  Ezt  az  objektumot  a  Font  osztály  tárolja.  Konstruktorában  megadható,  hogy  mely  betűtípust  kívánjuk  használni  és  azt  milyen  méretben.              Font  font  =  new  Font("Verdana",  8);A  szöveg  kiírásához  egy  ecsetre  is  szükségünk  van.  Ez  az  ecset  objektum  írja  le,  hogy  milyen  színű  legyen  a  kiírt  szöveg.  Egyszínű  ecset  létrehozásához  a  SolidBrush  osztály  használható.  Ennek  konstruktorában  kell  megadnunk  a  kívánt  színt.            SolidBrush  brush  =  new                  SolidBrush(Color.Black);      Most  már  minden  adott  ahhoz,  hogy  megjelenítsünk  egy  tetszőleges  feliratot  a  Form  területén.  Ehhez  a  Graphics  osztály  DrawString  függvényét  alkalmazzuk,  mely  többféle  változatban  is  létezik.  A  most  használt  változatnál  az  első  paraméterben  kell  megadnunk  a  kiírandó  szöveget,  a  másodikban  az  ehhez  használatos  betűtípust,  míg  a  harmadikban  az  ecsetet.  A  negyedik,  ötödik  paraméter  lesz  a  kiírandó  szöveg  X,  Y  pozíciója  pixelben,  végül  pedig  egy  StringFormat  osztályt  kell  megadnunk.  Ez  utóbbi  néhány  speciális  beállítást  tartalmazhat  szükség  esetén.  Ha  nincs  szükségünk  semmi  speciális  műveletre,  akkor  megadhatunk  egy  alapértelmezett  StringFormat  osztály  példányát.  Ezt  maga  a  StringFormat  osztály  szolgáltatja  is  számunkra  a  GenericDefault  property-jén  keresztül.            g.DrawString(DateTime.Now.ToString(),  font,                  brush,  10,  180,                  StringFormat.GenericDefault);    Nézzünk  most  egy  példát  egy  speciális  esetre,  mondjuk  a  szöveg  függőleges  kiírására.  Ezt  az  opciót  a          StringFormat  osztály  FormatFlags  property-jébe  kell  megadnunk,  melynek  értéke  a  StringFormatFlags  felsorolt  típus  elemei  közül  kerülhet  ki  és  ami  most  DirectionVertical  kell  hogy  legyen.  Ha  az  így  létrehozott  StringFormat  osztályt  adjuk  meg,  akkor  a  kiírt  szöveg  függőleges  helyzetbe  forgatva  jelenik  meg.  A  StringFormat  osztályról  további  részletek  a  "Sztringek  formázása,  igazítása"  című  cikkben  olvashatók.            StringFormat  sf  =  new  StringFormat();            sf.FormatFlags  =                  StringFormatFlags.DirectionVertical;            g.DrawString(DateTime.Now.ToString(),  font,                  brush,  10,  200,  sf);        }Function1  DrawRectangleTéglalapok  rajzolásához  két  függvény  és  azoknak  is  többféle  változatuk  áll  rendelkezésre.  A  Graphics  osztály  DrawRectangle  függvényével  kirajzolhatunk  egy  tetszőleges  méretű  téglalapot  tetszőleges  színnel,  míg  a  DrawRectangles  függvényt  használva  egy  lépésben  több  téglalapot  is  rajzolhatunk.        public  void  Function1()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  téglalap  színét  egy  toll  határozza  meg,  melyet  a  Pen  osztály  képvisel.  A  toll  színét  a  Pen  konstruktorában  kell  megadni,  de  ezt  később  a  Color  property-n  keresztül  meg  is  változtathatjuk.            Pen  pen  =  new  Pen(Color.Red);A  téglalap  kirajzolásakor  az  imént  létrehozott  tollat  kell  első  paraméterként  átadni,  majd  az  X,  Y  koordinátákat,  mely  a  téglalap  bal  felső  sarkának  helyét  jelölik.  A  harmadik,  negyedik  paraméter  a  téglalap  szélességét  és  magasságát  határozza  meg.            g.DrawRectangle(pen,  10,  180,  200,  200);Több  téglalap  együttes  rajzolásához  létre  kell  hoznunk  egy  tömböt,  melynek  minden  típusa  Rectangle,  melyek  leírnak  egy-egy  téglalapot.            pen.Color  =  Color.Blue;            Rectangle[]  rect  =  new  Rectangle[10];            rect[0]  =  new  Rectangle(20,  190,  180,  180);A  több  téglalapot  most  egy  ciklussal  hozzuk  létre,  kiindulva  az  elsőből  és  csökkentve  annak  méretét.            for  (int  i=1;  i<rect.Length;  i++)            {                rect[i]  =  Rectangle.Inflate(rect[i  -  1],                        -10,  -10);            }A  kirajzoláshoz  a  DrawRectangles  függvényt  használjuk,  melynek  elegendő  egy  tollat  és  az  imént  létrehozott  téglalapokat  leíró  tömböt  átadni.            g.DrawRectangles(pen,  rect);                    }Function2  DrawPolygonSokszög  kirajzolását  végzi  a  DrawPolygon  függvény.  Működéséhez  X,  Y  koordináta  párokat  kell  megadnunk  egy  tömbben,  amelyeket  a  függvény  egy-egy  egyenes  vonallal  összeköt.  A  sokszög  mindig  egy  zárt  objektum  lesz.  Erről  a  DrawPolygon  függvény  gondoskodik  úgy,  hogy  a  kezdőpontot  automatikusan  összeköti  a  végponttal.        public  void  Function2()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  használathoz  egy  tollat  kell  létrehoznunk  a  Pen  osztály  személyében.            Pen  pen  =  new  Pen(Color.Green);Egy  ciklussal  feltöltünk  egy  Point  struktúrákat  tartalmazó  tömböt.  E  tömb  tartalmazza  az  X,  Y  koordinátákat,  melyeket  most  véletlenszerűen  választunk  ki.            Point[]  points  =                  new  Point[5];            Random  r  =                  new  Random();            for  (int  i=0;  i<points.Length;  i++)            {                points[i]  =  new  Point(                    r.Next(300),                      r.Next(300)  +  180);            }Ha  adott  a  toll  és  a  koordináta  tömb,  akkor  máris  elvégezhető  a  kirajzolás.            g.DrawPolygon(pen,  points);        }Function3  DrawPieKörcikk  rajzolásának  feladatát  a  DrawPie  függvényre  bízhatjuk.        public  void  Function3()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  használathoz  egy  tollra  lesz  csupán  szükségünk,  mely  körcikk  körvonalát  adja.            Pen  pen  =  new  Pen(Color.Green);A  DrawPie  függvény  első  paraméterében  ezt  a  tollat  kell  megadnunk,  míg  a  másodikban  és  harmadikban  az  X,  Y  koordinátákat.  E  koordináták  a  bal  felső  sarkát  adják  annak  az  ellipszist  befoglaló  téglalapnak,  melyből  körcikk  származik.  A  negyedik,  ötödik  paraméter  a  befoglaló  téglalap  szélessége,  magassága  lesz.  Az  utolsó  előtti  paraméter  a  körcikk  kezdő  szögét  adja  meg,  míg  a  következő  azt  a  szög  értéket,  mely  a  kezdőszöghöz  adva  meghatározza  a  körcikk  befejező  szögét.            g.DrawPie(pen,  10,  180,  200,  200,  10,  60);        }  Function4  DrawLineEgy  egyenes  vonal  húzására  szolgál  a  DrawLine  függvény.        public  void  Function4()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();Használatához  egy  tollra  lesz  szükségünk,  melyet  a  DrawLine  első  paraméterében  adunk  meg.  A  második,  harmadik  paraméter  a  vonal  kezdőpontjának  X,  Y,  míg  a  negyedik,  ötödik  paraméter  a  végpontjának  X,  Y  koordinátája  lesz.            Pen  pen  =  new  Pen(Color.Blue);            g.DrawLine(pen,  10,  180,  10,  380);Lehetőségünk  van  több  vonal  egymás  utáni  kirajzolására  is.  Ekkor  a  koordinátákat  egy  tömbben  kell  megadnunk.  Minden  vonal  végpontja  egyúttal  a  következő  kezdőpontja  is  lesz.  A  koordináta  pontok  halmazát  most  is  egy  ciklusra  bízzuk,  mely  véletlenszerűen  választott  értékkel  tölti  fel  azt.            Point[]  points  =  new  Point[5];            Random  r  =  new  Random();            pen.Color  =  Color.Red;            for  (int  i=0;  i<points.Length;  i++)            {                points[i]  =  new  Point(r.Next(300),                      r.Next(300)  +  180);            }A  kirajzoláshoz  a  DrawLines  függvényt  használhatjuk  fel.  Első  paraméterként  a  kirajzoláshoz  használatos  tollat,  míg  másodikként  a  koordinátákat  tároló  tömböt  kell  átadnunk.            g.DrawLines(pen,  points);        }Function5  DrawImageKülönféle  típusú  képek  kirajzolásához  a  DrawImage  függvény  nyújt  segítséget.          public  void  Function5()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  függvény  első  paraméterében  a  kirajzolandó  képet  kell  megadnunk.  Ehhez  egy  Image  osztályból  származó  osztály  példányát  kell  megadnunk.  Ilyen  például  a  Bitmap  osztály,  mellyel  betölthetünk  egy-egy  képet  és  a  létrejött  osztályt  átadva  a  DrawImage  függvénynek  meg  is  jeleníthetjük  azt.  A  Bitmap  osztállyal  nem  csak  BMP  típusú  képeket  kezelhetünk,  mint  ahogyan  azt  a  neve  sugallná,  hanem  GIF,  JPG,  TIF  formátumokat  is.A  DrawImage  második,  harmadik  paraméterében  a  kirajzolandó  kép  bal  felső  sarkának  X,  Y  koordinátáját  kell  megadnunk.            g.DrawImage(new  Bitmap("1.gif"),  10,  180);            g.DrawImage(new  Bitmap("2.gif"),  140,  180);            g.DrawImage(new  Bitmap("3.gif"),  270,  180);            g.DrawImage(new  Bitmap("4.gif"),  30,  280);            g.DrawImage(new  Bitmap("5.gif"),  160,  280);            g.DrawImage(new  Bitmap("6.gif"),  290,  280);            g.DrawImage(new  Bitmap("7.gif"),  50,  380);            g.DrawImage(new  Bitmap("8.gif"),  180,  380);            g.DrawImage(new  Bitmap("9.gif"),  310,  380);            g.DrawImage(new  Bitmap("10.gif"),  70,  480);                }Function6  DrawIconICO  állományokban  rejtőző  ikonokat  tudunk  megjeleníteni  a  DrawIcon  függvényt  felhasználva.        public  void  Function6()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();Ehhez  első  paraméterként  egy  Icon  osztály  példányát  kell  átadnunk,  melybe  előzőleg  betöltöttünk  egy  tetszőleges  ikont.  A  második,  harmadik  paraméter  az  ikon  bal  felső  sarkának  X,  Y  koordinátája  lesz.            g.DrawIcon(                new  Icon("favicon.ico"),  10,  180);        }Function7  DrawEllipseTetszőleges  ellipszist,  vagy  kört  rajzolhatunk  a  DrawEllipse  függvénnyel.        public  void  Function7()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  használathoz  szükségünk  lesz  egy  tollra,  melyet  az  első  paraméterként  kell  átadnunk.  A  második,  harmadik  paraméter  az  ellipszist  befoglaló  képzeletbeli  téglalap  bal  felső  X,  Y  koordinátája  lesz,  míg  a  negyedik,  ötödik  paraméter  e  téglalap  szélessége,  magassága.            Pen  pen  =  new  Pen(Color.Blue);            g.DrawEllipse(pen,  10,  180,  100,  50);        }Function8  DrawCurveA  görbe  rajzolás  egyik  lehetséges  módszere  a  DrawCurve  függvény  használata.  A  függvény  egy  tollat  vár  Pen  osztály  típusban,  mellyel  a  görbe  körvonala  lesz  rajzolva,  valamint  egy  Point  struktúrákat  tartalmazó  tömböt,  melyben  a  görbe  kezdő  és  végpontja,  valamint  töréspontjai  vannak  leírva  X,  Y  koordinátákkal.  A  görbe  a  töréspontjainál  automatikusan  lesz  lekerekítve.        public  void  Function8()  {            Invalidate();    Update();            Graphics  g  =  CreateGraphics();            Pen  pen  =  new  Pen(Color.Red);            Point[]  points  =  new  Point[3];            points[0]  =  new  Point(10,  180);            points[1]  =  new  Point(100,  280);            points[2]  =  new  Point(10,  350);            g.DrawCurve(pen,  points);A  DrawClosedCurve  függvény  használatával  a  kirajzolt  görbe  automatikusan  le  is  lesz  zárva  olya  módon,  hogy  végpontja  összekötésre  kerül  a  kezdőpontjával.            pen.Color  =  Color.Green;            points[0]  =  new  Point(150,  180);            points[1]  =  new  Point(240,  280);            points[2]  =  new  Point(150,  350);            g.DrawClosedCurve(pen,  points);        }Function9  DrawBezierBezier  görbe  rajzolására  alkalmas  a  DrawBezier  függvény.  Itt  a  görbe  pontjait  szintén  Point  struktúrában  adhatjuk  meg.  Minden  görbe  egy  kezdő  és  egy  végpontból  valamint  két  segédpontból  áll,  melyek  meghatározzák  a  görbe  ívét.  A  Bezier  görbe  használatával  részletesen  lapunk  "Bezier  görbe  szerkesztő  program"  című  cikke  foglalkozik.        public  void  Function9()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();            Pen  pen  =  new  Pen(Color.Red);            g.DrawBezier(pen,  new  Point(10,  180),  new                  Point(100,  170),  new  Point(50,  380),  new                  Point(200,  400));        }Function10  DrawArcKörív  kirajzolására  a  DrawArc  függvény  használható.  Első  paraméterében  a  rajzoláshoz  használandó  tollat  adhatjuk  meg  Pen  osztály  formájában.  Második  és  harmadik  paramétere  a  körívet  befoglaló  téglalap  bal  felső  X,  Y  koordinátája  lesz.  Negyedik,  ötödik  paraméter  e  téglalap  szélessége  és  magassága  lesz,  míg  a  hatodik  paraméter  a  körív  kezdő  szögét  adja  és  az  utolsó  paraméter  azt  a  szög  értéket,  mely  a  kezdőszöghöz  adva  meghatározza  a  körív  befejező  szögét.        public  void  Function10()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();            Pen  pen  =  new  Pen(Color.Red);            g.DrawArc(pen,  10,  180,  200,  200,  10,  60);        }Function11  FillRectangleMinden  olyan  Draw...  szóval  kezdődő  függvénynek  van  egy  Fill...  szóval  kezdődő  párja  is,  mely  zárt  alakzatot  rajzol  ki.  Minden  zárt  alakzat  ugyanis  kifesthető.  Ilyen  a  téglalap  is,  melyhez  a  FillRectangle  függvény  segítségével  egy  téglalap  alakú  területet  festhetünk  ki.  A  Draw...  kezdetű  függvényeknél  mindig  Pen  osztályt  kellett  megadni  a  körvonal  rajzolásához.  A  Fill...  kezdetű  függvények  esetén  egy  Brush  osztályból  származó  ecsetet  kell  átadni,  mely  az  adott  terület  kitöltését  végzi  el.        public  void  Function11()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  FillRectangle  első  paramétere  most  egy  egyszínű  ecset  lesz,  melyet  a  SolidBrush  osztály  képvisel.  Második,  harmadik  paramétere  a  téglalap  bal  felső  X,  Y  koordinátája,  míg  az  utolsó  kettő  a  szélessége,  magassága  lesz.            SolidBrush  brush  =  new                  SolidBrush(Color.Red);            g.FillRectangle(brush,  10,  180,  200,  200);Lehetőségünk  van  egyszerre  több  téglalap  kirajzolására  is  a  FillRectangles  függvényt  használva.  Ehhez  egy  tömböt  kell  létrehoznunk,  melynek  minden  eleme  Rectangle  típusú.  Ezekben  kell  megadni  a  kirajzolandó  téglalapok  koordinátáit  és  méreteit.            brush.Color  =  Color.Blue;            Rectangle[]  rect  =  new  Rectangle[10];            rect[0]  =  new  Rectangle(190,  180,  20,  20);            for  (int  i=1;  i<rect.Length;  i++)            {                rect[i]  =  rect[i  -  1];                rect[i].Offset(-20,  20);            }            g.FillRectangles(brush,  rect);                    }  Function12  FillPolygonA  DrawPolygon  párja  lesz  a  FillPolygon,  mely  képes  egy  tetszőleges  sokszöget  kifestve  megjeleníteni.  A  függvény  használatához  a  szokásos  ecset  megadásán  kívül  egy  Point  struktúrákat  tartalmazó  tömbre  lesz  szükségünk,  mely  a  sokszög  egyes  töréspontjainak  X,  Y  koordinátáit  tartalmazza.        public  void  Function12()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();            SolidBrush  brush  =  new                  SolidBrush(Color.Red);            Point[]  points  =  new  Point[5];            Random  r  =  new  Random();            for  (int  i=0;  i<points.Length;  i++)            {                points[i]  =  new  Point(r.Next(300),                      r.Next(300)  +  180);            }            g.FillPolygon(brush,  points);        }Function13  FillPieA  DrawPie  függvényhez  hasonlóan  a  FillPie  is  körcikkeket  rajzol,  de  azok  területét  egy  adott  ecsettel  ki  is  tölti.  A  függvény  paraméterezése  egyezik  a  DrawPie  függvénnyel,  csupán  első  paramétere  különbözik,  ahol  is  egy  ecsetet  kell  megadnunk.        public  void  Function13()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();            SolidBrush  brush  =  new                  SolidBrush(Color.White);            Random  r  =  new  Random();            int  angle  =  0;            int  offset;E  példában  több  körcikket  rajzolunk  ki  egymás  után  úgy,  hogy  egy  teljes  kör  látható  legyen,  mely  különböző  színű  körcikkekből  áll.  A  while  ciklus  tehát  addig  megy,  amíg  egy  kör  el  nem  készül,  vagyis  360  fokig.  A  körcikk  méretét  az  offset  változóban  adott  szög  mértéke  adja,  melyet  véletlenszerű  értékként  adunk  meg,  akár  csak  a  körcikk  színét.            while  (angle  <  360)            {                offset  =  r.Next(45)  +  30;                if  (angle  +  offset  >  360)                {                    offset  =  360  -  angle;                }                brush.Color  =  Color.FromArgb(r.Next(100)                      +  150,  r.Next(100)  +  150,  r.Next(100)                      +  150);                g.FillPie(brush,  10,  180,  300,  300,                      angle,  offset);                angle  +=  offset;            }        }Function14  FillEllipseA  DrawEllipse  függvényhez  hasonlóan  a  FillEllipse  függvény  is  egy  ellipszist  rajzol  csak  most  kitöltött  háttérrel.  Első  paraméterként  egy  ecsetet,  míg  a  második,  harmadik  paraméterbe  az  ellipszist  befoglaló  téglalap  bal  felső  sarkának  X,  Y  koordinátáját  kell  megadnunk.  Negyedik,  ötötdik  paraméterben  a  befoglaló  téglalap  szélessége,  magassága  adható  meg.            public  void  Function14()            {                Invalidate();                Update();                Graphics  g  =  CreateGraphics();                SolidBrush  brush  =  new                      SolidBrush(Color.Yellow);                g.FillEllipse(brush,  10,  180,  100,  50);            }Function15  FillClosedCurveZárt  görbét  rajzol  a  DrawClosedCurve  függvény,  melynek  párja  a  FillClosedCurve,  mely  nem  csak  kirajzolja,  hanem  ki  is  festi  az  alakzat  hátterét.  Paraméterezése  ennek  a  függvénynek  is  megegyezik  a  Draw...  kezdetű  változatával,  csupán  első  paraméterében  van  eltérés,  ahol  egy  ecsetet  kell  megadni.        public  void  Function15()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();            SolidBrush  brush  =  new                  SolidBrush(Color.Gray);            Point[]  points  =  new  Point[3];            points[0]  =  new  Point(10,  180);            points[1]  =  new  Point(100,  280);            points[2]  =  new  Point(10,  350);            g.FillClosedCurve(brush,  points);        }  Function16  PathRendelkezik  a  Graphics  osztály  két  olyan  függvénnyel,  mely  paraméterként  GraphicsPath  osztály  példányát  várja.  Ezek  a  DrawPath  és  FillPath  függvények.  A  GraphicsPath  egy  olyan  speciális  osztály,  mely  képes  több  grafikai  objektum  tárolására.  A  Graphics  osztály  DrawPath  és  FillPath  függvénye  a  GraphicsPath  osztályban  tárolt  grafikát  képes  kirajzolni,  illetve  kifestve  megjeleníteni.        public  void  Function16()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();A  GraphicsPath  létrehozása  után  az  AddString  függvényének  használatával  hozzáadunk  egy  szöveget  e  tárolóhoz.            GraphicsPath  gp  =  new  GraphicsPath();            String  s  =  ".Net  világ";                SizeF  size  =  g.MeasureString(s,  new                  Font("Times  New  Roman",  80,                  FontStyle.Bold));            FontFamily  ff  =  new  FontFamily("Verdana");                        gp.AddString(s,  ff,  (int)FontStyle.Bold,                  80,  new  Point(0,  180),                  StringFormat.GenericDefault);Meghívva  a  Graphics  osztály  FillPath  és  DrawPath  függvényeit,  megjeleníthetjük  ezt  a  szöveget  tetszőleges  háttérrel  és  kerettel.              LinearGradientBrush  lgb  =  new                  LinearGradientBrush(new  Rectangle(0,  0,                  (int)size.Width,  (int)size.Height),                  Color.Blue,  Color.Red,                  LinearGradientMode.Horizontal);            Pen  p  =  new  Pen(lgb,  2);                          g.FillPath(new  SolidBrush(Color.SkyBlue),                  gp);            g.DrawPath(p,  gp);              }A  GraphicsPath  osztály  részletes  bemutatója  a  "GraphicsPath  használata"  című  cikkben  olvasható.  Function17  RegionRégiók  kezelésére  hivatott  a  Region  osztály.  Egy  régió  különféle  grafikai  objektumokból  felépíthető  terület.  E  területet  különféle  logikai  műveletek  útján  hozhatjuk  létre.  A  terület  ezek  után  önálló  objektumként  kezelhető,  például  kifesthetjük  a  területét.        public  void  Function17()  {            Invalidate();  Update();            Graphics  g  =  CreateGraphics();            Random  ra  =  new  Random();            GraphicsPath  gp  =  new  GraphicsPath();            int  x,  y;    Region  r  =  new  Region();          Egy  ciklus  segítségével  több  ellipszist  is  hozzáadunk  egy  GraphicsPath  osztályhoz  tárolás  céljából.            for  (int  i=0;  i<10;  i++)  {                x  =  ra.Next(200)  +  10;                y  =  ra.Next(200)  +  180;                gp.AddEllipse(x,  y,  x+ra.Next(200),                      y+ra.Next(200));            }    Az  így  tárolt  ellipszisekkel  egy  XOR  logikai  műveletet  végzünk  a  már  létrehozott  régióval.  A  XOR  művelet  lényege,  hogy  ahol  eddig  volt  a  régióban  terület  ott  most  nem  lesz  és  fordítva.              r.Xor(gp);Létrehozunk  egy  téglalapot  is  és  ezzel,  illetve  a  régió  aktuális  területével  is  XOR  műveletet  végzünk.            Rectangle  re  =  new  Rectangle(10,  180,  400,  400);          r.Xor(re);Az  így  létrejött  régiót  egy  színátmenetes  ecsetet  felhasználva  megjelenítünk  a  Graphics  osztály  FillRegion  függvényével.  A  létrejött  képen  jól  megfigyelhető,  hogy  milyen  módon  hatottak  egymásra  a  létrehozott  ellipszisek,  valamint,  hogy  miként  volt  hatással  erre  a  négyzet.  Látható  az  is,  hogy  ahol  a  régióból  kivettünk  területeket,  azokra  az  ecset  nem  volt  hatással,  vagyis  ezekre  a  területekre  nem  tudtunk  festeni,  így  megmaradt  a  Form  eredeti  színe  és  pontosan  ez  a  régió  kezelés  lényege,  hogy  képesek  legyünk  a  rajzolásból  bizonyos  területeket  kihagyni,  míg  a  többit  kezelni,  függetlenül  attól,  hogy  milyen  mérettel  és  alakzattal  rendelkezik  egyáltalán  a  megjelenítendő  grafikánk.            Brush  b  =  new  LinearGradientBrush(                ClientRectangle,  Color.Yellow,                  Color.Violet,  ra.Next(360));            g.FillRegion(b,  r);                        }A  Region  osztály  további  lehetőségeit  részletesen  a  "Régiók  kezelése"  című  cikk  tárgyalja.Function18  Az  előbbi  régiókezeléshez  témaköréhez  kapcsolódik  még  a  Graphics  osztály  ExcludeClip  függvénye  is,  mely  egy  Region  osztályt  vár  paraméterként.  Ha  itt  megadunk  egy  régiót,  akkor  minden  az  adott  Graphics  osztállyal  történő  rajzolás  csak  a  régió  által  engedélyezett  területre  történhet.  Ha  e  régión  kívüli  területre  rajzolunk,  az  egyszerűen  nem  jelenik  meg.        public  void  Function18()        {            Invalidate();            Update();            Graphics  g  =  CreateGraphics();Ezt  ki  is  próbáljuk  úgy,  hogy  létrehozunk  egy  teljes  területű  régiót,  melynek  közepéről  eltávolítunk  egy  nagy  A  betű  által  elfoglalt  területet.  Ehhez  létrehozunk  egy  üres  régiót  a  MakeEmty  függvény  hívásával,  majd  hozzáadunk  egy  GraphicsPath-ban  tárolt  grafikát,  mely  most  egy  A  betű  lesz.  A  létrejött  régiót  átadjuk  a  Graphics  osztály  ExcludeClip  függvényének.            Region  r  =  new  Region();                      GraphicsPath  gp  =  new  GraphicsPath();            FontFamily  ff  =  new  FontFamily("Verdana");                        gp.AddString("A",  ff,  (int)FontStyle.Bold,                  360,  new  Point(0,  180),                  StringFormat.GenericDefault);            r.MakeEmpty();            r.Union(gp);            g.ExcludeClip(r);Ezek  után  már  bármit  rajzolhatunk  a  Form-ra,  az  A  betű  által  meghatározott  területen  nem  jelenik  meg  semmilyen  grafika.            g.DrawImage(new  Bitmap("1.gif"),  10,  180);            g.DrawImage(new  Bitmap("2.gif"),  140,  180);            g.DrawImage(new  Bitmap("3.gif"),  270,  180);            g.DrawImage(new  Bitmap("4.gif"),  30,  280);            g.DrawImage(new  Bitmap("5.gif"),  160,  280);            g.DrawImage(new  Bitmap("6.gif"),  290,  280);            g.DrawImage(new  Bitmap("7.gif"),  50,  380);            g.DrawImage(new  Bitmap("8.gif"),  180,  380);            g.DrawImage(new  Bitmap("9.gif"),  310,  380);            g.DrawImage(new  Bitmap("10.gif"),  70,  480);              }Prethus  Gábor