Régiók kezelésére a Region nevű osztály szolgál, nézzük miként használhatjuk fel. Egy grafika elkészítéséhez most a Form hátterét válasszuk és így a Paint eseményét használjuk fel.
protected void Form1_Paint (object sender, System.WinForms.PaintEventArgs e)
{
Graphics g = e.Graphics;
Régió létrehozásánál van lehetőségünk arra, hogy egy téglalapot megadjunk, így kezdetben a régiónk területe e téglalap területével lesz egyenlő. Mellékelt példában akkora területű régiót hozunk létre, amekkora az aktuális ablakunk mérete.
Region r = new Region(ClientRectangle);
Ezt követően egy kettős ciklust kezdünk, mely e téglalap felső területén halad végig.
for (int x=0; x<ClientRectangle.Width/40; x++)
{
for (int y=0; y<ClientRectangle.Height/100; y++)
{
A ciklusok feladata a következő: a létrehozott téglalap régióból szeretnénk kizárni területeket. Ehhez az Exclude függvényt használhatjuk, melynél most szintén téglalapokat adunk meg. Ettől kezdve az eredeti régióból kizárásra kerülnek az itt megadott téglalapok.
r.Exclude(new Rectangle(x*40, y*40, 20, 20));
}
}
A létrehozott régiót mozgathatjuk is x, y irányban. Ehhez a Translate függvényre lesz szükségünk, mely két paramétert vár, amelyben megadjuk az x és y koordináta eltolási mértékét.
r.Translate(ClientRectangle.Width/3, -ClientRectangle.Height/2);
Lehetőségünk van egy régióval kapcsolatban arra is, hogy azzal tetszőleges transzformációs műveleteket végezzünk. Ehhez két dologra lesz szükségünk: egy Matrix osztályra, melyben leírjuk a szükséges transzformációt és a Transform függvény hívására, mely elvégzi az előírt műveletet.
Most egy elforgatást valósítunk meg méghozzá a Form-on lévő trackBar1 értékétől függően. Ehhez a Matrix osztály Rotate függvényét hívjuk, paraméterként átadva az elforgatás szögét.
m.Rotate(trackBar1.Value);
Ha adott a Matrix, akkor már csak a Transform hívására van szükség. A mellékelt példán jól látható, hogy a régió eddigi összes objektuma forog, viszont amiket az elforgatás után hozunk létre, azokra már nem vonatkozik ez a transzformációs művelet.
Következő lépésként egy érdekes effektet hozunk létre. A régióból kivágunk ismét egy területet az Exclude függvénnyel, de ezt most úgy tesszük, hogy a kivágandó területet egy szöveges felirat területe fogja meghatározni. Az Exclude függvénynek nem csak téglalapot adhatunk át, hanem egy GraphicsPath osztályt is. Erről annyit elég most tudnunk, hogy tetszőleges grafikai objektumokat tárol egy egységként. Jelen esetben most egy szöveget adunk hozzá, így ennek körvonal grafikáját fogja szolgáltatni, így képes az Exclude a kívánt területet eltávolítani az aktuális régióból.
GraphicsPath gp = new GraphicsPath();
gp.AddString("Software Online", new FontFamily("Times"), (int)FontStyle.Bold, 48, new Point(10, 220), StringFormat.GenericDefault);
r.Exclude(gp);
A régió egy adott területét invertálhatjuk is a Xor függvénnyel. Az így megadott területen minden ami a régióhoz tartozott az ettől kezdve nem fog hozzátartozni és fordítva, vagyis ami eddig nem volt a régió területe az mostantól az lesz.
r.Xor(new Rectangle(200, 70, 100, 100));
Egyesíteni is lehet területeket, melyek a régió részévé válnak. Ehhez a Union függvényt kell meghívnunk, paraméterként átadva az egyesítendő területet.
r.Union(new Rectangle(300, 70, 100, 100));
Ha készen vagyunk a régió létrehozásával, akkor felhasználása több módon is történhet. Mi most azt választottuk, hogy rajzolunk egy színátmenetes területet a Form-ra úgy, hogy felhasználjuk a régióban előállt területet. Amint az a Form-on megfigyelhető, a színátmenet csak ott látszik, ahol a régió érvényes területet tartalmaz. Az a terület, melyet a régióból kizártunk, az rajzban átlátszó lesz.
A kirajzoláshoz létrehozunk egy színátmenetes ecsetet és a Graphics osztály FillRegion függvényével megjelenítjük a régiónkat.
Brush b = new LinearGradientBrush(ClientRectangle, Color.Red, Color.Yellow, 90);
g.FillRegion(b, r);