1. 程式人生 > >RcButton按鈕控制元件,可設定漸變色和懸停圖片

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
    }
}