Winform RadioButton美化改变选中样式

本文介绍了一种自定义RadioButton的方法,通过重写系统控件实现特定UI样式,并提供了改变选中状态颜色等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[前言]
因项目需求,UI要求的RadioButton样式与系统自带样式有较大区别如下图:
UI样式UI样式
上图是UI要求样式,下图为系统自带样式
系统自带样式


[解决方案]
方案:为节省开发时间,特改写系统RadioButton,留有部分功能接口属性方便本项目使用
代码:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace JaRadioButton.Controls
{
    public partial class JaRadioButton : RadioButton
    {
        bool isMouseMove = false;
        public JaRadioButton()
        {
            InitializeComponent();
            this.MouseMove += JaRadioButton_MouseMove;
            this.MouseLeave += JaRadioButton_MouseLeave;
        }

        private void JaRadioButton_MouseLeave(object sender, EventArgs e)
        {
            isMouseMove = false;
            this.Invalidate();
        }

        private void JaRadioButton_MouseMove(object sender, MouseEventArgs e)
        {
            isMouseMove=true;
            this.Invalidate();
        }

        private Color selectRadioForeColor= Color.FromArgb(0X33, 0X70, 0XCC);
        [Description("选中后选择框颜色"),Category("自定义")]
        public Color SelectRadioForeColor 
        { 
            get  { return selectRadioForeColor; }
            set
            {
                selectRadioForeColor = value;
                this.Invalidate();
            }
        }

        private Color selectTextForeColor = Color.FromArgb(0X33, 0X70, 0XCC);
        [Description("选中后文本颜色,可根据ChangeTextForeColor属性来决定是否改变"), Category("自定义")]
        public Color SelectTextForeColor
        {
            get { return selectTextForeColor; }
            set
            {
                selectTextForeColor = value;
                this.Invalidate();
            }
        }
        private bool changeTextForeColor=false;
        [Description("是否改变选中后文本颜色,默认为false"), Category("自定义")]
        public bool ChangeTextForeColor
        {
            get { return changeTextForeColor; }
            set
            {
                changeTextForeColor = value;
                this.Invalidate();
            }
        }

        private void JaRadioButton_Paint(object sender, PaintEventArgs e)
        {
            RadioButton rButton = (RadioButton)sender;
            Graphics g = e.Graphics;
            g.Clear(this.BackColor);
            //double px = ((this.Font.Size * 3) / 4) + 0.4f;//字体pt换成像素px
            int px =this.Height;//字体pt换成像素px
            Rectangle radioButtonrect = new Rectangle(1, 1, 12, 12);

            if (px > 14)
            {
                radioButtonrect = new Rectangle(1, (px - 12) / 2, 12, 12);
            }
            g.SmoothingMode = SmoothingMode.AntiAlias;
            if (rButton.Checked)
            {
                radioButtonrect.Inflate(1, 1);
                g.FillEllipse(new SolidBrush(selectRadioForeColor), radioButtonrect);
                radioButtonrect.Inflate(-4, -4);
                g.FillEllipse(new SolidBrush(this.BackColor), radioButtonrect);
                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;
                sf.LineAlignment = StringAlignment.Center;
                Rectangle rectangleText = new Rectangle(8, 0, this.Width, this.Height);

                if (changeTextForeColor)//改变文字颜色
                {
                    g.DrawString(Text, this.Font, new SolidBrush(selectTextForeColor), rectangleText, sf);
                }
                else
                {
                    g.DrawString(Text, this.Font, new SolidBrush(ForeColor), rectangleText, sf);
                }
            }
            else
            {
                if (isMouseMove)//鼠标移入
                {
                    using (Pen pen = new Pen(Color.FromArgb(0X33, 0X70, 0XCC)))
                    {
                        g.DrawEllipse(pen, radioButtonrect);
                    }
                }
                else
                {
                    using (Pen pen = new Pen(Color.FromArgb(0X96, 0X97, 0X99)))
                    {
                        g.DrawEllipse(pen, radioButtonrect);
                    }
                }
                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;
                sf.LineAlignment = StringAlignment.Center;
                Rectangle rectangleText = new Rectangle(8, 0, this.Width, this.Height);
                g.DrawString(Text, this.Font, new SolidBrush(ForeColor), rectangleText, sf);//字体
            }
            //g.Dispose();
        }
    }
}


[样式展示]
样式


[后语]
1.选择框还可以根据实际情况更改为其他样式,如正方形/图片,因时间关系在此就不一一演示.
2.由于工作原因,没有过多时间来排版和优化控件,控件较为粗糙,内部bug可能存在很多,各位朋友同仁如发现异常请轻喷并与我及时联系,以免误导他人.
3.写该文章目的是记录自己在开发中遇到的问题,方便以后遇到类似问题以便快速解决,也是为了给有相同问题的道友提供部分思路.
本章完

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值