A megvalósítandó feladat tehát a következő: adott néhány véletlenszerű pozíciójú és méretű ellipszis, melyeket XOR művelettel egymásra helyezünk. Vagyis az egymást átfedő területek minden esetben invertálódnak, így hol részei lesznek az egész rajznak, hol nem. Ezzel a módszerrel már elegendő mértékben bonyolult lesz a grafikai objektum, hogy számítással nehéz legyen meghatározni, hogy egy adott pont a grafikai objektum területén belül van, vagy kívül. A régió előállításához létrehozunk egy InitRegion nevű függvényt.
private void InitRegion()
{
Random ra = new Random();
Mivel több grafikai objektum együtteséből létrejövő képre van szükségünk, ezért célszerű a GraphicsPath osztályt használnunk, így egyszerűen összefűzhetjük az egyes ellipsziseinket.
GraphicsPath gp = new GraphicsPath();
int x, y;
Adott egy r változónk, mely egy Region típusú osztályt képvisel. Első lépésként ezt kiürítjük a MakeEmpty függvény hívásával.
Ezután egy ciklust kezdeményezünk az egyes ellipszisek megrajzolásához.
for (int i=0; i<10; i++)
{
x=ra.Next(ClientSize.Width/2);
y=ra.Next(ClientSize.Height/2);
A GraphicsPath-hoz az AddEllipse függvénnyel adjuk hozzá az egyes ellipsziseket.
gp.AddEllipse(x, y, x+ra.Next(ClientSize.Width/2), y+ra.Next(ClientSize.Height/2));
Az így előállt képet pedig az aktuális régióhoz adjuk az Xor művelettel.
Végül készítünk egy téglalapot, mely a Form aktuális méreténél 50 pixellel kisebb.
Rectangle re = new Rectangle(50, 50, ClientSize.Width-100, ClientSize.Height-100);
Ezt a területet pedig kivágjuk a Region Complement függvényével, így egy olyan képet nyerünk majd a Form-on, mely körben egy 50 pixeles margót tartalmaz a Form széléhez képest.
r.Complement(re);
r.Xor(re);
}
A grafikai objektum kirajzolását a Form Paint eseményénél végezzük el. Itt egy lineáris színátmenetes ecsetet készítünk és ezzel fogjuk a már létrehozott régiót kirajzolni a Form hátterére.
protected void Form1_Paint (object sender, System.WinForms.PaintEventArgs e)
{
g = e.Graphics;
Brush b = new LinearGradientBrush(ClientRectangle, Color.Blue, Color.Lime, 45);
g.FillRegion(b, r);
}
A feladat ettől kezdve már igen egyszerű: amikor mozog a Form területén az egér, akkor jön létre a MouseMove esemény. Ezt felhasználva megtudjuk, hogy merre jár az egér. A felmerülő kérdésre, hogy az egér aktuálisan a grafikai objektumunk területén belül vagy kívül van-e, a Region osztály IsVisible függvénye fogja a választ megadni. Ennek többféle változata is létezik. Az egyikben két egész számot kell megadni, mely a kérdéses pont koordinátái lesznek. Visszatérési értékként, ha igazat ad a függvény, akkor a megadott pont a régión belül található, ellenkező esetben azon kívül.
protected void Form1_MouseMove (object sender, System.WinForms.MouseEventArgs e)
{
if (r.IsVisible(e.X, e.Y, g))
{
label1.Text = "Bent";
}
else
{
label1.Text = "Kint";
}
}
Az IsVisible függvény még jó néhány változattal rendelkezik. Ezek mindegyike azonos funkciót lát el, csupán a paraméterlistájukból ered a különbözőség. Így például találunk olyan IsVisible függvényt, mellyel nem csak egy pontot vizsgálhatunk, hanem akár egy téglalapot is. Ekkor paraméterként egy Rect típust kell átadnunk. Ha ez benne lesz a régióban, akkor a visszatérési érték ismét igaz, különben hamis lesz.