将单选按钮中包含的小圆圈(点)的颜色更改为红色?

Posted

技术标签:

【中文标题】将单选按钮中包含的小圆圈(点)的颜色更改为红色?【英文标题】:Change the color of a small circle (dot) contained within the radio button to be red? 【发布时间】:2011-09-21 12:14:11 【问题描述】:

如何在使用 VB.NET 或 C# 的 Winform 应用程序中

问候和感谢, 迪威

================================================ ============ 我会分享,可能对其他人有用。这个程序有效。

Imports System.Drawing.Drawing2D

Public Class Form1

Public Class MyRadioButton
    Inherits RadioButton

    Private m_OnColor As Color
    Private m_OffColor As Color

    Public Sub New(ByVal On_Color As Color, ByVal Off_Color As Color)
        m_OnColor = On_Color
        m_OffColor = Off_Color
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        BackColor = Color.Transparent
    End Sub

    Public Property OnColor() As Color
        Get
            Return m_OnColor
        End Get
        Set(ByVal value As Color)
            m_OnColor = value
        End Set
    End Property

    Public Property OffColor() As Color
        Get
            Return m_OffColor
        End Get
        Set(ByVal value As Color)
            m_OffColor = value
        End Set
    End Property

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)

        Dim g As Graphics = e.Graphics
        g.SmoothingMode = SmoothingMode.AntiAlias

        Dim dotDiameter As Integer = ClientRectangle.Height - 17
        Dim innerRect As New RectangleF(1.8F, 7.8F, dotDiameter, dotDiameter)

        If Me.Checked Then
            g.FillEllipse(New SolidBrush(OnColor), innerRect)
        Else
            g.FillEllipse(New SolidBrush(OffColor), innerRect)
        End If

        g.DrawString(Text, Font, New SolidBrush(ForeColor), dotDiameter + 17, 1)
    End Sub

End Class


Dim objRadio As New MyRadioButton(Color.Blue, Color.Red)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    objRadio.Location = New Point(100, 100)
    objRadio.Visible = True
    Me.Controls.Add(objRadio)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If objRadio.Checked Then
        objRadio.Checked = False
    Else
        objRadio.Checked = True
    End If
End Sub


End Class

【问题讨论】:

【参考方案1】:

我以 OP 的 VB 代码为基础,并在 MSDN 的帮助下使用 PathGradientBrush 为 C# 提出了这个派生类。下图中的绿色和红色按钮是使用我的代码,两个蓝色的是普通版本。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace WindowsFormsApplication1

    public class ColouredRadioButton : RadioButton
    
        // Fields
        private Color m_OnColour;
        private Color m_OffColour;
        private Rectangle m_glint;
        private Rectangle m_circle;
        private PathGradientBrush m_flareBrush;
        private Pen m_outline;

        // Properties
        public Color OnColour
        
            get
            
                return m_OnColour;
            
            set
            
                if ((value == Color.White) || (value == Color.Transparent))
                    m_OnColour = Color.Empty;
                else
                    m_OnColour = value;
            
        
        public Color OffColour
        
            get
            
                return m_OffColour;
            
            set
            
                if ((value == Color.White) || (value == Color.Transparent))
                    m_OffColour = Color.Empty;
                else
                    m_OffColour = value;
            
        

        // Constructor
        public ColouredRadioButton()
        
            // Init
            m_circle = new Rectangle(2, 5, 7, 7 /*Magic Numbers*/);
            m_glint = new Rectangle(3, 6, 4, 4  /*Magic Numbers*/);
            m_outline = new Pen(new SolidBrush(Color.Black), 1F /*Magic Numbers*/);

            // Generate Glint
            GraphicsPath Path = new GraphicsPath();
            Path.AddEllipse(m_glint);
            m_flareBrush = new PathGradientBrush(Path);
            m_flareBrush.CenterColor = Color.White;
            m_flareBrush.SurroundColors = new Color[]  Color.Transparent ;
            m_flareBrush.FocusScales = new PointF(0.5F, 0.5F/*Magic Numbers*/);

            // Allows for Overlaying
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.Transparent;
        

        // Methods
        protected override void OnPaint(PaintEventArgs e)
        
            // Init
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;

            // Overlay Graphic
            if (this.Checked)
            
                if (OnColour != Color.Empty)
                
                    g.FillEllipse(new SolidBrush(OnColour), m_circle);
                    g.FillEllipse(m_flareBrush, m_glint);
                    g.DrawEllipse(m_outline, m_circle);
                
            
            else
            
                if (OffColour != Color.Empty)
                
                    g.FillEllipse(new SolidBrush(OffColour), m_circle);
                    g.FillEllipse(m_flareBrush, m_glint);
                    g.DrawEllipse(m_outline, m_circle);
                
            
        
    

如果你很好奇并想要我用来测试画笔功能的大红球的代码,那么你可以...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsFormsApplication1

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void Form1_Paint(object sender, PaintEventArgs e)
        
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            int Offset = 25;
            int BoxSize = 100;
            int GlintSize = (int)((double)BoxSize * ((double)3 / (double)4));
            Rectangle Circle = new Rectangle(Offset, Offset, BoxSize, BoxSize);
            Rectangle Glint = new Rectangle(Offset, Offset, GlintSize, GlintSize);

            //Debug
            //e.Graphics.FillRectangle(new SolidBrush(Color.Red), Circle);
            //e.Graphics.FillRectangle(new SolidBrush(Color.BlueViolet), Glint);

            //Generate Glint
            GraphicsPath P = new GraphicsPath();
            P.AddEllipse(Glint);
            PathGradientBrush FlareBrush = new PathGradientBrush(P);
            FlareBrush.CenterColor = Color.FromArgb(255, 255, 255, 255);
            Color[] colors =  Color.Transparent ;
            FlareBrush.SurroundColors = colors;

            e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(255, 255, 0, 0)), Circle);
            e.Graphics.FillEllipse(FlareBrush, Glint);
            e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black), 1F), Circle);
        
    

【讨论】:

这种严格的 m_circle 和 m_glit 定位“幻数”并不通用。使用不同的字体或 autosize=false 会使彩色圆圈不居中。 @Andmark Ym_circleConvert.ToInt32(Math.Floor((Height - 7) / 2))。对于m_glint,它总是高一。【参考方案2】:

Here's 一个所有者绘制的列表框的 winforms 示例,它模拟了一个单选按钮列表,您可以根据需要使用这些单选按钮。

编辑:Here 是一个更深入的 Winforms 自定义控件示例。

【讨论】:

我不确定该代码是否适用——绘图由ControlPaint.DrawRadioButton(e.Graphics, rect, ButtonState.Checked); 完成。你会如何改变它来画一个红色的圆圈? 你可以画任何你想要的。将该行代码替换为使用 e.Graphics 绘制红色圆圈的代码。在此处查看更深入的自定义控件示例:codeproject.com/KB/miscctrl/ScrollingTextControlArtic.aspx 感谢您的参考,我成功了,我在一个单选按钮的圆圈上方画了一个圆圈。还要感谢@justin。我将分享可能对其他人有用。有关更多详细信息,请参见上文。

以上是关于将单选按钮中包含的小圆圈(点)的颜色更改为红色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中更改单选按钮的颜色?

如何更改单选按钮悬停颜色

将单选组分配给单选按钮

防止基于选择框选择的单选按钮更改

无法在 Android 上更改单选按钮颜色

Material UI:更改未选中单选按钮的颜色