FlatSwitch.cs 7.4 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;

namespace Asa.Theme
{
    [DefaultProperty("Text")]
    [DefaultEvent("Click")]
    /// <summary>
    /// 开关控件
    /// </summary>
    public partial class FlatSwitch : FlatBase
    {
        //private string _text;
        private int _border;
        private bool _leftRight = true;
        private bool _over;

        private RectangleF _rect;
        private RectangleF _leftRect;
        private RectangleF _rightRect;
        private RectangleF _leftStrRect;
        private RectangleF _rightStrRect;
        private string _leftStr;
        private string _rightStr;

        public new event Event.ButtonClick Click;

        /// <summary>
        /// 开关控件
        /// </summary>
        public FlatSwitch()
        {
            InitializeComponent();
            base.Text = "";
            _border = 2;
            CalcSize();
            Refresh();
        }

        /// <summary>
        /// 显示的文本
        /// </summary>
        [Browsable(true), Category(""), Description("显示的文本"), DefaultValue("")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            get => base.Text;
            set
            {
                base.Text = value;
                CalcSize();
                Refresh();
            }
        }

        /// <summary>
        /// 显示的文本的字体
        /// </summary>
        [Browsable(true), Category(""), Description("显示的文本的字体")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override Font Font
        {
            set
            {
                base.Font = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return base.Font;
            }
        }

        /// <summary>
        /// 控件是否显示边框
        /// </summary>
        [Browsable(true), Category(""), Description("控件边框宽度"), DefaultValue(2)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int BorderWidth
        {
            set
            {
                _border = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _border;
            }
        }

        /// <summary>
        /// 计算大小
        /// </summary>
        protected override void CalcSize()
        {
            _rect = new RectangleF(_border / 2f, _border / 2f, Width - _border, Height - _border);
            float w = (Width - _border - _border) / 2f;
            _leftRect = new RectangleF(_border, _border, w, Height - _border - _border);
            _rightRect = new RectangleF(_border + w, _border, w, Height - _border - _border);

            SizeF s1, s2;
            Graphics g = CreateGraphics();
            string[] tt = Text.Split(',');
            if (tt.Length == 2)
            {
                _leftStr = tt[0];
                _rightStr = tt[1];
                //s1 = TextRenderer.MeasureText(_leftStr, Font);
                //s2 = TextRenderer.MeasureText(_rightStr, Font);

                s1 = g.MeasureString(_leftStr, Font);
                s2 = g.MeasureString(_rightStr, Font);
            }
            else
            {
                _leftStr = _rightStr = Text;
                //s1 = s2 = TextRenderer.MeasureText(Text, Font);
                s1 = s2 = g.MeasureString(Text, Font);
            }
            _leftStrRect = new RectangleF(_leftRect.X + (_leftRect.Width - s1.Width) / 2f, _leftRect.Y + (_leftRect.Height - s1.Height) / 2f, s1.Width, s1.Height);
            _rightStrRect = new RectangleF(_rightRect.X + (_rightRect.Width - s2.Width) / 2f, _rightRect.Y + (_rightRect.Height - s2.Height) / 2f, s2.Width, s2.Height);

        }






        private void FlatSwitch_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Common.BACK_COLOR);
            if (Inside)
            {
                e.Graphics.DrawRectangle(new Pen(Common.BLUE_COLOR, _border), _rect.X, _rect.Y, _rect.Width, _rect.Height);
                if (_leftRight)
                {
                    e.Graphics.FillRectangle(Common.BLUE_BRUSH, _leftRect);
                    if (_over)
                        e.Graphics.FillRectangle(Common.OVER_BRUSH, _rightRect);
                    else
                        e.Graphics.FillRectangle(Common.BACK_BRUSH, _rightRect);
                }
                else
                {
                    e.Graphics.FillRectangle(Common.BLUE_BRUSH, _rightRect);
                    if (_over)
                        e.Graphics.FillRectangle(Common.OVER_BRUSH, _leftRect);
                    else
                        e.Graphics.FillRectangle(Common.BACK_BRUSH, _leftRect);
                }

                e.Graphics.DrawString(_leftStr, Font, Common.FORE_BRUSH, _leftStrRect);
                e.Graphics.DrawString(_rightStr, Font, Common.FORE_BRUSH, _rightStrRect);
            }
            else
            {
                e.Graphics.DrawRectangle(new Pen(Common.BORDER_COLOR, _border), _rect.X, _rect.Y, _rect.Width, _rect.Height);
                if(_leftRight)
                {
                    e.Graphics.DrawString(_leftStr, Font, Common.BLUE_BRUSH, _leftStrRect);
                    e.Graphics.DrawString(_rightStr, Font, Common.FORE_BRUSH, _rightStrRect);
                }
                else
                {
                    e.Graphics.DrawString(_leftStr, Font, Common.FORE_BRUSH, _leftStrRect);
                    e.Graphics.DrawString(_rightStr, Font, Common.BLUE_BRUSH, _rightStrRect);
                }
            }


        }

        private void FlatSwitch_MouseUp(object sender, MouseEventArgs e)
        {

        }

        private void FlatSwitch_MouseMove(object sender, MouseEventArgs e)
        {
            bool b;
            if (_leftRight)
                b = _rightRect.Contains(e.Location);
            else
                b = _leftRect.Contains(e.Location);
            if (b != _over)
            {
                _over = b;
                Refresh();
            }
        }

        private void FlatSwitch_MouseEnter(object sender, EventArgs e)
        {

        }

        private void FlatSwitch_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (_leftRight)
                {
                    if(_over)
                    {
                        _leftRight = false;
                        _over = false;
                        Refresh();
                        Click?.Invoke(this, false);
                    }
                }
                else
                {
                    if (_over)
                    {
                        _leftRight = true;
                        _over = false;
                        Refresh();
                        Click?.Invoke(this, true);
                    }
                }
            }
        }

        private void FlatSwitch_Resize(object sender, EventArgs e)
        {
            CalcSize();
            Refresh();
        }

        private void FlatSwitch_Load(object sender, EventArgs e)
        {
            BackColor = Common.BACK_COLOR;
        }
    }
}