C# - Kontrolok körvonalának meghatározása

forráskód letöltése
Bármilyen kontrol esetén, mely a Control osztályból származik, lehetőségünk van arra, hogy befolyásoljuk annak kinézetét. Tehetjük ezt oly módon, hogy egy téglalap alakú nyomógombból kör alakút faragunk. Tulajdonképpen bármilyen alak, forma megoldható: határt csak a fantáziánk szabhat.
Mivel a Form is a Control-ból származik, így programunk ablaka esetén sem kell ragaszkodnunk a már megszokott téglalaphoz.
A megoldást a Control osztály Region property-je szolgáltatja. Itt olvasható ki az aktuális régió, mely megadja a kontrol alakját és ez lesz az a hely, ahol megadhatunk egy tetszőleges, új régiót, melyet ezután az adott kontrol kénytelen elfogadni, hiszen ezzel megszabjuk annak látható területét. Nincs tehát más dolgunk, mint egy-egy új régiót előállítani és e property-nek átadni.
Példánk első részében egy PictureBox-ban tárolt téglalap alakú képet változtatunk kör alakúra. A kontrol, illetve a kép körön kívül eső része nem fog látszani, így bármilyen képet is töltsünk be a PictureBox-ba, az automatikusan kör alakban jelenik meg.
Ehhez persze szükségünk van egy olyan régióra, mely kör alakú területet ad. Ezt létrehozhatjuk egy GraphicsPath osztály segítségével.
     private void button1_Click(object sender, System.EventArgs e)
    {
      GraphicsPath path = new GraphicsPath();
Ehhez hozzáadunk egy ellipszist, melynek befoglaló mérete egyezik a kép, vagyis a PictureBox méretével.
      path.AddEllipse(pictureBox1.ClientRectangle);      
A régiót a GraphicsPath felhasználásával hozzuk létre.
      Region r = new Region(path);      
Végül hozzárendeljük az új régiót a PictureBox kontrol Region property-jéhez.
      pictureBox1.Region = r;
    }
Példánk második felében a programban megjelenő Form-ot is átszabjuk egy kicsit. Itt a Form alsó részén kivágunk egy téglalapot úgy, hogy benne egy felirat látható maradjon. A Form területéből kivágott rész szó szerint nem tartozik a Form-hoz. Ha ezen az átlátszó területen kattintunk, az olyan mintha a Form-unk mögött lévő alkalmazás ablakán kattintottunk volna. Ezt ki is próbálhatjuk, az eredmény az lesz, hogy a háttérben lévő alkalmazás válik aktívvá, hiszen a területére kattintottunk.
A megvalósítást most is a GraphicsPath létrehozásával kezdjük.
    private void button2_Click(object sender, System.EventArgs e)
    {
      GraphicsPath path = new GraphicsPath();       
Melyhez most egy szöveget adunk hozzá az AddString függvény hívásával.
      path.AddString("SoftwareOnline", new FontFamily("Verdana"), 1, 50, new Point(10, 260), StringFormat.GenericDefault);
Készítünk a következő lépésben egy olyan régiót, mely teljesen lefedi a Form-ot.
      Region r = new Region(new Rectangle(0, 0, Width, Height));
A Xor műveletet használva, az aktuális régióhoz hozzáadhatunk úgy egy új területet, hogy a hozzáadandó részt megfordítjuk eközben: vagyis ahol eddig a régió területe volt, ott mostantól nem lesz és fordítva.
Hozzáadjuk most tehát a szöveget, melynek eredményeképpen egy olyan régiót kapunk, amely egyezik a Form területével, de hiányzik belőle a szöveg által elfoglalt terület. Vagyis ha most használnánk fel a régiót, akkor a Form átlátszó lenne a szöveg területén.
      r.Xor(path);
Ismét a Xor-t használva még egy téglalapot is hozzáadunk a régióhoz. Ez a téglalap lefedi a szöveget. Mivel a Xor-t használjuk ennek az lesz az eredménye, hogy a téglalap által lefedett területen a régió/nem régió kérdés megfordul. Ennek eredménye az lesz, hogy a szöveg területe ismét a régió része lesz, viszont a Form azon része kiesik belőle melyet a téglalap lefed.
      r.Xor(new Rectangle(10, 260, Width-20, 75));
Végső lépésként a Form Region property-jéhez rendeljük a létrehozott új régiót.
      this.Region = r;
    }