【问题标题】: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

【问题讨论】:

    标签: c# vb.net winforms radio-button


    【解决方案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。我将分享可能对其他人有用。有关更多详细信息,请参见上文。
    猜你喜欢
    • 2013-04-25
    • 2020-08-20
    • 1970-01-01
    • 2019-03-28
    • 2020-10-10
    • 2020-05-22
    • 2022-12-12
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多