将单选按钮中包含的小圆圈(点)的颜色更改为红色?
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 会使彩色圆圈不居中。 @AndmarkY
的 m_circle
是 Convert.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。我将分享可能对其他人有用。有关更多详细信息,请参见上文。以上是关于将单选按钮中包含的小圆圈(点)的颜色更改为红色?的主要内容,如果未能解决你的问题,请参考以下文章