180 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
 | 
						|
namespace DevComponents.WinForms.Drawing
 | 
						|
{
 | 
						|
    public class GradientFill : Fill
 | 
						|
    {
 | 
						|
        #region Constructor
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the GradientFill class.
 | 
						|
        /// </summary>
 | 
						|
        public GradientFill()
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the GradientFill class.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="color1"></param>
 | 
						|
        /// <param name="color2"></param>
 | 
						|
        public GradientFill(Color color1, Color color2)
 | 
						|
        {
 | 
						|
            _Color1 = color1;
 | 
						|
            _Color2 = color2;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the GradientFill class.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="color1"></param>
 | 
						|
        /// <param name="color2"></param>
 | 
						|
        /// <param name="angle"></param>
 | 
						|
        public GradientFill(Color color1, Color color2, float angle)
 | 
						|
        {
 | 
						|
            _Color1 = color1;
 | 
						|
            _Color2 = color2;
 | 
						|
            _Angle = angle;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the GradientFill class.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="interpolationColors"></param>
 | 
						|
        public GradientFill(ColorStop[] interpolationColors)
 | 
						|
        {
 | 
						|
            _InterpolationColors.AddRange(interpolationColors);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the GradientFill class.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="interpolationColors"></param>
 | 
						|
        public GradientFill(ColorStop[] interpolationColors, int angle)
 | 
						|
        {
 | 
						|
            _InterpolationColors.AddRange(interpolationColors);
 | 
						|
            _Angle = angle;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Creates the brush for fill.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="bounds">Bounds for the brush</param>
 | 
						|
        /// <returns>Returns brush or null if brush cannot be created for given bounds or colors are not set. It is responsibility of caller to Dispose the brush.</returns>
 | 
						|
        public override Brush CreateBrush(Rectangle bounds)
 | 
						|
        {
 | 
						|
            if (_Color1.IsEmpty && _Color2.IsEmpty && _InterpolationColors.Count == 0 || bounds.Width < 1 || bounds.Height < 1) return null;
 | 
						|
 | 
						|
            LinearGradientBrush brush=new LinearGradientBrush(bounds, _Color1, _Color2, _Angle);
 | 
						|
            if (_InterpolationColors.Count == 0)
 | 
						|
                return brush;
 | 
						|
            brush.InterpolationColors = _InterpolationColors.GetColorBlend();
 | 
						|
 | 
						|
            return brush;
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _Color1 = Color.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the starting gradient fill color.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicates the fill color.")]
 | 
						|
        public Color Color1
 | 
						|
        {
 | 
						|
            get { return _Color1; }
 | 
						|
            set { _Color1 = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if property should be serialized</returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeColor1()
 | 
						|
        {
 | 
						|
            return !_Color1.IsEmpty;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetColor1()
 | 
						|
        {
 | 
						|
            Color1 = Color.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        private Color _Color2 = Color.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the end gradient fill color.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Indicates the fill color.")]
 | 
						|
        public Color Color2
 | 
						|
        {
 | 
						|
            get { return _Color2; }
 | 
						|
            set { _Color2 = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>true if property should be serialized</returns>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeColor2()
 | 
						|
        {
 | 
						|
            return !_Color2.IsEmpty;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetColor2()
 | 
						|
        {
 | 
						|
            Color2 = Color.Empty;
 | 
						|
        }
 | 
						|
 | 
						|
        private ColorBlendCollection _InterpolationColors = new ColorBlendCollection();
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the collection that defines the multicolor gradient background.
 | 
						|
        /// </summary>
 | 
						|
        /// <remarks>
 | 
						|
        /// Setting this property creates a multicolor gradient with one color at each position along the gradient line. Setting this property nullifies all previous color, position, and falloff settings for this gradient fill.
 | 
						|
        /// </remarks>
 | 
						|
        [Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Description("Collection that defines the multicolor gradient background.")]
 | 
						|
        public ColorBlendCollection InterpolationColors
 | 
						|
        {
 | 
						|
            get { return _InterpolationColors; }
 | 
						|
        }
 | 
						|
 | 
						|
        private float _Angle = 90;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the gradient fill angle. Default value is 90.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(90), Description("Indicates gradient fill angle.")]
 | 
						|
        public float Angle
 | 
						|
        {
 | 
						|
            get { return _Angle; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _Angle = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Creates a pen based on fill parameters.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="width">Width of the pen to create</param>
 | 
						|
        /// <returns>new instance of pen or null if pen cannot be created.</returns>
 | 
						|
        public override Pen CreatePen(int width)
 | 
						|
        {
 | 
						|
            if (!_Color1.IsEmpty)
 | 
						|
                return new Pen(_Color1, width);
 | 
						|
            if (!_Color2.IsEmpty)
 | 
						|
                return new Pen(_Color2, width);
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
    }
 | 
						|
}
 |