FlatRadio.cs 4.8 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.Theme
{
    public partial class FlatRadio : FlatBase
    {
        private bool _check;
        private RectangleF _switchRect = new RectangleF();
        private PointF _switchPoint = new PointF();
        private RectangleF _textRect = new RectangleF();

        private const int radius = 9;             //半径
        private const int diameter = radius * 2;  //直径

        public FlatRadio()
        {
            InitializeComponent();
        }

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

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

        [Browsable(true), Category(""), Description("单选按钮是否已选中"), DefaultValue(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool Checked
        {
            set
            {
                _check = value;
                CalcSize();
                Refresh();
                if (_check) SetGroup();
            }
            get
            {
                return _check;
            }
        }

        [Browsable(true), Category(""), Description("相同的内容为一组,同一组的单选按钮只能选中一个。"), DefaultValue("")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string Group { set; get; }




        protected override void CalcSize()
        {
            _switchRect = new RectangleF(6, (Height - diameter) / 2f, diameter, diameter);
            SizeF sf = CreateGraphics().MeasureString(Text, Font);
            _textRect = new RectangleF(_switchRect.X + _switchRect.Width + 6, (Height - sf.Height) / 2f, sf.Width, sf.Height);

            if (Checked)
            {
                _switchPoint.X = _switchRect.X + radius;
                _switchPoint.Y = _switchRect.Y + radius;
            }

        }

        private void SetGroup()
        {
            if (Parent == null) return;
            foreach (System.Windows.Forms.Control ctl in Parent.Controls)
            {
                if (ctl is FlatRadio)
                {
                    FlatRadio rdo = (FlatRadio)ctl;
                    if (rdo == this) continue;
                    if (rdo.Group == Group)
                    {
                        if (rdo.Checked)
                        {
                            rdo.Checked = false;
                            break;
                        }
                    }
                }
            }
        }





        private void FlatRadio_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
            e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

            e.Graphics.Clear(Common.BACK_COLOR);

            if (Inside)
            {
                e.Graphics.DrawEllipse(Common.BLUE_PEN, _switchRect);
            }
            else
            {
                e.Graphics.DrawEllipse(Common.FORE_PEN, _switchRect);
            }
            if (Checked)
            {
                int r = diameter - 8;
                e.Graphics.FillEllipse(Common.BLUE_BRUSH, _switchPoint.X - r / 2f, _switchPoint.Y - r / 2f, r, r);
            }

            string s;
            string[] arr = Text.Split(',');
            if (arr.Length == 2)
            {
                if (Checked)
                    s = arr[1];
                else
                    s = arr[0];
            }
            else
            {
                s = Text;
            }
            e.Graphics.DrawString(s, Font, Common.FORE_BRUSH, _textRect);
        }


        private void FlatRadio_MouseDown(object sender, MouseEventArgs e)
        {
            Checked = true;
            CalcSize();
            Refresh();
        }

        private void FlatRadio_MouseUp(object sender, MouseEventArgs e)
        {

        }
    }
}