RcButton按钮控件,可设置渐变色和悬停图片

namespace Controls
{
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;

    public partial class RcButton
    {
        public RcButton()
        {
            InitializeComponent();
        }

        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        IContainer components = null;

        /// <summary>
        /// 填充按钮的图片控件
        /// </summary>
        PictureBox fillImage = new PictureBox();

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 渐变属性
        int _radius = 1;
        [Browsable(true), Category("按钮样式属性"), Description("圆角弧度")]
        public int Radius
        {
            get { return _radius; }
            set { _radius = value > 0 ? value : 1; }
        }

        LinearGradientMode _linearGradientMode = LinearGradientMode.Vertical;
        [Browsable(true), Category("按钮样式属性"), Description("渐变方向")]
        public LinearGradientMode LinearGradientMode
        {
            get { return _linearGradientMode; }
            set { _linearGradientMode = value; }
        }

        Color _beginColor = Color.LightGray;
        [Browsable(true), Category("按钮样式属性"), Description("渐变起始颜色")]
        public Color FadeColorStart
        {
            get { return _beginColor; }
            set { _beginColor = value; }
        }

        Color _endColor = Color.LightGray;
        [Browsable(true), Category("按钮样式属性"), Description("渐变结束颜色")]
        public Color FadeColorEnd
        {
            get { return _endColor; }
            set { _endColor = value; }
        }

        #endregion

        #region 图片属性
        bool _isImageMode = false;
        [Browsable(true), Category("按钮样式属性"), Description("启用图片模式")]
        public bool IsImageMode
        {
            get { return _isImageMode; }
            set
            {
                _isImageMode = value;
                // 去除触发条件
                this.Controls.Remove(fillImage);
                this.Paint -= event_paint;
                // 添加触发条件
                if (_isImageMode)
                {
                    this.Controls.Add(this.fillImage);
                }
                else
                {
                    this.Paint += event_paint;
                }
            }
        }

        Image _normal;
        [Browsable(true), Category("按钮样式属性"), Description("默认显示图片")]
        public Image ImageNormal
        {
            get { return _normal; }
            set
            {
                _normal = value;
                fillImage.BackgroundImage = _normal;
            }
        }

        Image _enter;
        [Browsable(true), Category("按钮样式属性"), Description("鼠标悬停图片")]
        public Image ImageEnter
        {
            get { return _enter; }
            set
            {
                _enter = value;
                fillImage.BackgroundImage = _enter;
            }
        }

        Image _click;
        [Browsable(true), Category("按钮样式属性"), Description("点击按钮图片")]
        public Image ImageClick
        {
            get { return _click; }
            set
            {
                _click = value;
                fillImage.BackgroundImage = _click;
            }
        }

        #endregion

        #region 重新调整尺寸
        Image resizeImage(Image imgToResize, Size size)
        {
            if (imgToResize == null) return null;
            //期望的宽度
            int destWidth = size.Width;
            //期望的高度
            int destHeight = size.Height;
            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage(b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            //绘制图像
            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();
            return b;
        }

        #endregion

        #region 内部事件
        /// <summary>
        /// 渲染绘制事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void event_paint(object sender, PaintEventArgs e)
        {
            // 获取参数
            var cr = e.ClipRectangle;
            var g = e.Graphics;
            // 绘制渐变
            var lgb = new LinearGradientBrush(cr, FadeColorStart, FadeColorEnd, LinearGradientMode);
            // 绘制圆角矩形
            var gp = new GraphicsPath();
            gp.AddArc(cr.X, cr.Y, Radius, Radius, 180, 90);
            gp.AddArc(cr.Width - Radius, cr.Y, Radius, Radius, 270, 90);
            gp.AddArc(cr.Width - Radius, cr.Height - Radius, Radius, Radius, 0, 90);
            gp.AddArc(cr.X, cr.Height - Radius, Radius, Radius, 90, 90);
            gp.CloseAllFigures();// 闭合连接所有图形(画直线)
            // 绘制图形
            g.Clear(Parent.BackColor);
            g.FillPath(lgb, gp);
            var point = g.MeasureString(Text, Font).ToPointF();
            var x = (Width - point.X) / 2;
            var y = (Height - point.Y) / 2;
            // 添加文字
            g.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF(x, y));
        }

        /// <summary>
        /// 点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void fillImage_ImageClick(object sender, EventArgs e)
        {
            fillImage.BackgroundImage = ImageClick;
        }

        /// <summary>
        /// 鼠标移入事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void fillImage_ImageEnter(object sender, EventArgs e)
        {
            fillImage.BackgroundImage = ImageEnter;
        }

        /// <summary>
        /// 鼠标离开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void fillImage_ImageNormal(object sender, EventArgs e)
        {
            fillImage.BackgroundImage = ImageNormal;
        }

        /// <summary>
        /// 更改尺寸时重置
        /// </summary>
        /// <param name="e"></param>
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            fillImage.Size = Size;
            _normal = resizeImage(_normal, Size);
            _enter = resizeImage(_enter, Size);
            _click = resizeImage(_click, Size);
            fillImage.BackgroundImage = ImageNormal;
        }

        #endregion

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        void InitializeComponent()
        {
            // 
            // 图片控件
            // 
            ((ISupportInitialize)(this.fillImage)).BeginInit();
            this.SuspendLayout();
            this.fillImage.Name = "fillImage";
            this.fillImage.Size = Size;
            this.fillImage.Location = Point.Empty;
            this.fillImage.SizeMode = PictureBoxSizeMode.CenterImage;
            this.fillImage.TabIndex = 0;
            this.fillImage.TabStop = false;
            // 添加事件
            this.fillImage.MouseDown += fillImage_ImageClick;
            this.fillImage.MouseUp += fillImage_ImageEnter;
            this.fillImage.MouseEnter += fillImage_ImageEnter;
            this.fillImage.MouseLeave += fillImage_ImageNormal;
            ((ISupportInitialize)(this.fillImage)).EndInit();
            this.ResumeLayout(false);
        }

        #endregion
    }
}

猜你喜欢

转载自blog.csdn.net/FireGhost57/article/details/79416584