C# - Tetszőleges ecset használata körvonal (Pen) rajzolásakor

forráskód letöltése
Az ecsetet általában arra szokás használni, hogy valamilyen grafikai objektum hátterének kitöltését meghatározzuk. Az ecset lehet sokféle: egyszínű, színátmenetes, bitmap-et tartalmazó, stb. A GDI+-ban azonban lehetőségünk van arra is, hogy ecsetet ne csak a háttér kitöltésére használjuk fel, hanem az objektumok körvonalának megadásakor is. Így például könnyen készíthetünk olyan grafikát, melynek körvonala mondjuk színátmenetes vonalból áll.
A megoldás lényege abból áll, hogy a Pen objektumnál, mely a grafika körvonalát határozza meg, adott egy Brush nevű property. E property-hez tetszőleges ecset rendelhető, bármilyen típusú is legyen (SolidBrush, LinearGradientBrush, stb.). Ettől kezdve az így létrehozott ceruza (Pen), már nem a Color property-ben megadott színnel rajzol, hanem a Brush property-ben megadott ecsetet használja a körvonal elkészítésekor.
Mellékelt példában egy olyan feliratot készítünk, melynek körvonala színátmenetes. Ehhez arra lesz szükségünk, hogy megszerezzük a szöveg körvonalának leírását, melyhez egy GraphicsPath nevű osztályt használhatunk.
      Graphics g = e.Graphics;
      GraphicsPath gp = new GraphicsPath();
Szükségünk lesz továbbá a kirajzolandó sztring szélességére és magasságára a színátmenethez.
      String s = "Software Online";  
      SizeF size = g.MeasureString(s, new Font("Times New Roman", 80));
A GrahpicsPath osztály példányához hozzáadjuk a sztringet, mint új grafikát az AddString függvénnyel.
      FontFamily ff = new FontFamily("Times New Roman");      
      gp.AddString(s, ff, 1, 80, new Point(0, 0), StringFormat.GenericDefault);
Most már jöhet a kirajzolás előkészítése: létrehozunk egy LinearGradientBrush osztályt, melyben leírjuk a szükséges színátmenetet. Itt használjuk fel a már lekérdezett sztring szélességét és magasságát. A színátmenet létrehozásához megadható egy szög, mely azt írja le, hogy a két szín közötti átmenet milyen irányban legyen kirajzolva. Ennek mértékét az angle nevű változóból vesszük, melyet egy Timer komponens állandóan növel. Ezzel azt érjük el, hogy a színátmenet folyamatosan „mozog”.
      LinearGradientBrush lgb = new LinearGradientBrush(new Rectangle(0, 0, (int)size.Width, (int)size.Height), Color.Yellow, Color.Red, angle, true);
Most már jöhet a Pen létrehozása, melynek konstruktorában megadjuk a felhasználandó ecsetet és a körvonal vastagságát. Végül pedig kirajzoljuk a sztringet és készen is vagyunk.
      Pen p = new Pen(lgb, 2);       
      g.FillPath(new SolidBrush(Color.Gray), gp);
      g.DrawPath(p, gp);