问题描述
|
在Winform Application中,如何使用VB.NET或C#将单选按钮中包含的小圆圈(点)的颜色更改为红色?
谢谢,谢谢
德威
================================================== ========
我将分享,可能对其他人有用。该程序有效。
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
解决方法
这是一个winforms示例,其中包含一个所有者绘制的列表框,该列表框模拟了可用于所需功能的单选按钮列表。
编辑:这是一个更深入的Winforms自定义控件示例。
, 我以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);
}
}
}
}
}
如果您好奇并想要我用来测试笔刷功能的红色大球代码,那么您就可以...
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,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);
Color[] colors = { Color.Transparent };
FlareBrush.SurroundColors = colors;
e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(255,0)),Circle);
e.Graphics.FillEllipse(FlareBrush,Glint);
e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black),1F),Circle);
}
}
}