SurButton.cs 8.2 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Asa.Face
{
    /// <summary>
    /// 按钮控件
    /// </summary>
    [DefaultProperty("Text")]
    [DefaultEvent("Click")]
    public partial class SurButton : BaseCtl
    {
        private bool _down = false;
        private Bitmap _img = null;
        private Size _imgSize = new Size();
        private HorizontalAlignment _textAlign = HorizontalAlignment.Center;
        private Color _color = Color.Empty;
        private RectangleF _colorPoint = new RectangleF();
        private RectangleF _imgRect = new RectangleF();
        private RectangleF _textRect = new RectangleF();

        private const int SPACE = 6;  //图片与文字的间隔


        /// <summary>
        /// 按钮控件
        /// </summary>
        public SurButton()
        {
            InitializeComponent();
        }


        //==========事件==========
        /// <summary>
        /// 单击时发生
        /// </summary>
        [Browsable(true), Category(""), Description("单击时发生")]
        public new event MyEvent.Click Click;


        //==========属性==========
        /// <summary>
        /// 控件上显示的图像
        /// </summary>
        [Browsable(true), Category(""), Description("控件上显示的图像"), DefaultValue(null)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Bitmap Image
        {
            set
            {
                _img = value;
                if (_img == null)
                {
                    ImageSize = new Size();
                }
                else
                {
                    if (_imgSize.Width == 0 || _imgSize.Height == 0)
                        ImageSize = _img.Size;
                    else
                    {
                        CalcSize();
                        Refresh();
                    }
                }
            }
            get
            {
                return _img;
            }
        }

        /// <summary>
        /// 显示的图像的大小
        /// </summary>
        [Browsable(true), Category(""), Description("显示的图像的大小")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Size ImageSize
        {
            set
            {
                _imgSize = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _imgSize;
            }
        }

        /// <summary>
        /// 显示的文本的对齐方式
        /// </summary>
        [Browsable(true), Category(""), Description("显示的文本的对齐方式"), DefaultValue(HorizontalAlignment.Center)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public HorizontalAlignment TextAlign
        {
            set
            {
                _textAlign = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _textAlign;
            }
        }

        /// <summary>
        /// 控件内部间距
        /// </summary>
        [Browsable(true), Category(""), Description("控件内部间距")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public new Padding Padding
        {
            set
            {
                base.Padding = value;
                CalcSize();
                Refresh();
            }
            get => base.Padding;
        }

        /// <summary>
        /// 状态颜色
        /// </summary>
        [Browsable(true), Category(""), Description("状态颜色")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Color StateColor
        {
            set
            {
                _color = value;
                Refresh();
            }
            get
            {
                return _color;
            }
        }


        //==========私有==========
        /// <summary>
        /// 计算位置大小
        /// </summary>
        protected override void CalcSize()
        {
            base.CalcSize();

            Graphics g = CreateGraphics();
            SizeF sf = g.MeasureString(Text, Font);
            _imgRect = new RectangleF(0, (Height - _imgSize.Height) / 2f, _imgSize.Width, _imgSize.Height);
            _textRect = new RectangleF(0, (Height - sf.Height) / 2f, sf.Width, sf.Height);
            _colorPoint = new RectangleF(BorderWidth + 4, BorderWidth + 4, 10, 10);
            float x;

            switch (_textAlign)
            {
                case HorizontalAlignment.Left:
                    x = BorderWidth + Padding.Left;
                    if (_img != null)
                    {
                        _imgRect.X = x;
                        x += _imgSize.Width + SPACE;
                    }
                    _textRect.X = x;
                    break;
                case HorizontalAlignment.Center:
                    if (_img != null)
                    {
                        x = (Width - sf.Width - _imgSize.Width - SPACE) / 2f;
                        _imgRect.X = x;
                        x += _imgSize.Width + SPACE;
                    }
                    else
                    {
                        x = (Width - sf.Width) / 2f;
                    }
                    _textRect.X = x;
                    break;
                case HorizontalAlignment.Right:
                    x = Width - BorderWidth - Padding.Right - sf.Width;
                    _textRect.X = x;
                    if (_img != null)
                    {
                        x = x - SPACE - _imgSize.Width; 
                        _imgRect.X = x;
                    }
                    break;
            }



        }

        private void SurButton_MouseDown(object sender, MouseEventArgs e)
        {
            if (!Enabled) return;
            if (e.Button == MouseButtons.Left)
            {
                _down = true;
                Refresh();
            }
        }

        private void SurButton_MouseMove(object sender, MouseEventArgs e)
        {

        }

        private void SurButton_MouseUp(object sender, MouseEventArgs e)
        {
            if (!Enabled) return;
            if (e.Button == MouseButtons.Left)
            {
                _down = false;
                Refresh();
                Click?.Invoke(this);
            }
        }

        private void SurButton_Paint(object sender, PaintEventArgs e)
        {
            BufferedGraphicsContext current = BufferedGraphicsManager.Current;
            BufferedGraphics bg = current.Allocate(e.Graphics, e.ClipRectangle);
            Graphics g = bg.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.Clear(Common.BACK_COLOR);  //背景

            //控件边框
            if (Inside && Enabled)
            {
                if (_down)
                    g.FillRectangle(Common.BLUE_BRUSH, BorderRect);
                else
                    g.FillRectangle(Common.OVER_BRUSH, BorderRect);
                if (BorderWidth > 0)
                    g.DrawRectangle(BorderInsidePen, BorderRect);
            }
            else
            {
                if (BorderWidth > 0)
                    g.DrawRectangle(BorderOutsidePen, BorderRect);
            }

            //图标
            if (_img != null)
                g.DrawImage(_img, _imgRect, new RectangleF(0, 0, _img.Width, _img.Height), GraphicsUnit.Pixel);

            //文字
            if (Enabled)
                g.DrawString(Text, Font, Common.FORE_BRUSH, _textRect);
            else
                g.DrawString(Text, Font, Common.BORDER_BRUSH, _textRect);

            //状态点
            if (_color != Color.Empty && Enabled)
                g.FillEllipse(new SolidBrush(_color), _colorPoint);

            bg.Render();
            bg.Dispose();
        }



    }
}