2D Graphics C#

/*
User Interfaces in C#: Windows Forms and Custom Controls
by Matthew MacDonald
Publisher: Apress
ISBN: 1590590457
*/
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace GradientLabelHost
{
    /// 
    /// Summary description for GradientLabelHost.
    /// 

    public class GradientLabelHost : System.Windows.Forms.Form
    {
        private GradientLabel gradientLabel1;
        /// 
        /// Required designer variable.
        /// 

        private System.ComponentModel.Container components = null;
        public GradientLabelHost()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
        /// 
        /// Clean up any resources being used.
        /// 

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 

        private void InitializeComponent()
        {
            this.gradientLabel1 = new GradientLabel();
            this.SuspendLayout();
            // 
            // gradientLabel1
            // 
            this.gradientLabel1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.gradientLabel1.Font = new System.Drawing.Font("Tahoma", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
            this.gradientLabel1.ForeColor = System.Drawing.Color.White;
            this.gradientLabel1.GradientFill.ColorA = System.Drawing.SystemColors.Info;
            this.gradientLabel1.GradientFill.ColorB = System.Drawing.Color.DarkViolet;
            this.gradientLabel1.GradientFill.GradientFillStyle = System.Drawing.Drawing2D.LinearGradientMode.BackwardDiagonal;
            this.gradientLabel1.Name = "gradientLabel1";
            this.gradientLabel1.Size = new System.Drawing.Size(596, 118);
            this.gradientLabel1.TabIndex = 0;
            this.gradientLabel1.Text = "Gradient Label Test";
            // 
            // GradientLabelHost
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(596, 118);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.gradientLabel1});
            this.Name = "GradientLabelHost";
            this.Text = "GradientLabelHost";
            this.ResumeLayout(false);
        }
        #endregion
        /// 
        /// The main entry point for the application.
        /// 

        [STAThread]
        static void Main() 
        {
            Application.Run(new GradientLabelHost());
        }
    }
    /// 
    /// Summary description for GradientLabel.
    /// 

    public class GradientLabel : System.Windows.Forms.UserControl
    {
        ///  
        /// Required designer variable.
        /// 

        private System.ComponentModel.Container components = null;
        public GradientLabel()
        {
            // This call is required by the Windows.Forms Form Designer.
            InitializeComponent();
            // TODO: Add any initialization after the InitForm call
        }
        ///  
        /// Clean up any resources being used.
        /// 

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Component Designer generated code
        ///  
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// 

        private void InitializeComponent()
        {
            // 
            // GradientLabel
            // 
            this.Name = "GradientLabel";
            this.Size = new System.Drawing.Size(372, 128);
            this.Load += new System.EventHandler(this.GradientLabel_Load);
            gradient.GradientChanged += new EventHandler(GradientChanged);
        }
        #endregion
        private string text;
        private GradientFill gradient = new GradientFill();
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public GradientFill GradientFill
        {
            get
            {
                return gradient;
            }
            set
            {
                gradient = value;
                gradient.GradientChanged += new EventHandler(GradientChanged);
                this.Invalidate();
            }
        }
        private void GradientLabel_Load(object sender, System.EventArgs e)
        {
            this.ResizeRedraw=true;
        }
        [Browsable(true),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
        public override string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
                this.Invalidate();
            }
        }
        protected override void OnPaintBackground(
            System.Windows.Forms.PaintEventArgs e)
        {
            LinearGradientBrush brush = new LinearGradientBrush(e.ClipRectangle, gradient.ColorA,
                                     gradient.ColorB, gradient.GradientFillStyle);
            // Draw the gradient background.
            e.Graphics.FillRectangle(brush, e.ClipRectangle);
        }
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);
            // Draw the label text.
            e.Graphics.DrawString(text, this.Font, new SolidBrush(this.ForeColor), 0, 0);
        }
        private void GradientChanged(object sender, EventArgs e)
        {
            this.Invalidate();
        }
    }
    [TypeConverter(typeof(ExpandableObjectConverter)), 
    Editor(typeof(GradientFillEditor), typeof(UITypeEditor))]
    public class GradientFill
    {
        private Color colorA = Color.LightBlue;
        private Color colorB = Color.Purple;
        private LinearGradientMode gradientStyle= LinearGradientMode.ForwardDiagonal;
    
        public event EventHandler GradientChanged;
        public Color ColorA
        {
            get
            {
                return colorA;
            }
            set
            {
                colorA = value;
                OnGradientChanged(new EventArgs());
            }
        }
        public Color ColorB
        {
            get
            {
                return colorB;
            }
            set
            {
                colorB = value;
                OnGradientChanged(new EventArgs());
            }
        }
        [System.ComponentModel.RefreshProperties(RefreshProperties.Repaint)]
        public LinearGradientMode GradientFillStyle
        {
            get
            {
                return gradientStyle;
            }
            set
            {
                gradientStyle = value;
                OnGradientChanged(new EventArgs());
            }
        }
        private void OnGradientChanged(EventArgs e)
        {
            if (GradientChanged != null)
            {
                GradientChanged(this, e);
            }
        }
    }
    public class GradientFillEditor : UITypeEditor
    {
        public override bool GetPaintValueSupported(
            System.ComponentModel.ITypeDescriptorContext context)
        {
            return true;
        }
        public override void PaintValue(
            System.Drawing.Design.PaintValueEventArgs e)
        {
            GradientFill fill = (GradientFill)e.Value;
            LinearGradientBrush brush = new LinearGradientBrush(e.Bounds,
                fill.ColorA, fill.ColorB, fill.GradientFillStyle);
            // Paint the thumbnail.
            e.Graphics.FillRectangle(brush, e.Bounds);
        }
    }
}