C# - Tetszőleges számú színátmenet objektum terület kitöltéshez

forráskód letöltése
Grafikai objektumainkat úgy is kitölthetjük egy háttérrel, hogy ott tetszőleges számban megadott szín között végzünk el színátmenet képzést. Mellékelt példában erre keresünk megoldást.
Nézzük mi is szükséges egy ilyen grafika megvalósításához. A kirajzolást a Form Paint eseményénél végezzük el.
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {     
      Font font = new Font("Times", 36);
      string s = "Animare Software";
Létrehozunk egy tömböt, melyben eltároljuk azokat a színeket, melyek között szeretnénk elvégezni a színátmenetet.
      Color[] col = {Color.Purple, Color.Yellow, Color.Aqua};
Szükségünk lesz még egy tömbre: itt számokat kell eltárolnunk. Egy-egy szám az adott szín pozícióját fogja meghatározni százalékos értékben. Az első szín a Purple, ehhez itt a nulla érték tartozik. Ez azt jelenti, hogy a Purple szín az átmenet legszélén helyezkedik el.
A második szín a Yellow. Ehhez egy olyan számot társítunk, melyet a trackBar1 komponensből veszünk és osztunk százzal. Mivel a trackBar1 0 és 100 között mozoghat, így ezt százzal osztva 0 és 1 közötti számot fogunk kapni. Tehát a trackBar1 mozgatásával a Yellow szín aktuális pozícióját tudjuk majd mozgatni.
Végül a harmadik szín az Aqua, melyhez 1 tartozik, vagyis ez a szín az átmenet másik végén fog elhelyezkedni.
      float[] pos = {0f, (float)trackBar1.Value/100, 1f};
A színátmenet képzéséhez egy ColorBlend osztályra van szükségünk. Ennek Colors property-jében kell megadnunk a színeket tároló tömbünket, valamint a Positions property-ben a színek pozícióját tároló tömböt.
      ColorBlend blend = new ColorBlend();
      blend.Colors = col;
      blend.Positions = pos;
A grafikai objektumaink kitöltéséhez egy ecsetre lesz szükségünk.
      LinearGradientBrush brush = new LinearGradientBrush(new Point(20, 0), new Point(400, 0), Color.Green, Color.Red);
Az ecsetnél az InterpolationColors property-nél tudjuk átadni a ColorBlend osztályunkat.
      brush.InterpolationColors = blend;
Ezek után már tetszőleges objektumot rajzolhatunk, ha az imént létrehozott ecsetet használjuk, akkor a színátmenet garantált.
      e.Graphics.DrawString(s, font, new SolidBrush(Color.Black), new Rectangle(22, 22, 400, 80), StringFormat.GenericDefault);
      e.Graphics.DrawString(s, font, brush, new Rectangle(20, 20, 400, 80), StringFormat.GenericDefault);
      e.Graphics.FillRectangle(brush, 20, 10, 360, 6);
      e.Graphics.FillRectangle(brush, 20, 80, 360, 6);
    }