2011-06-23 10 views
6

Radyo düğmesi içinde bulunan küçük bir dairenin (nokta) rengini, Winform Uygulaması kullanımı VB.NET veya C# olarak kırmızı renkte nasıl değiştiririm?Radyo düğmesi içinde bulunan küçük bir dairenin (nokta) rengini kırmızı mı olacak şekilde değiştirin?

Regard & sayesinde Dewi

==================================== ======================
Ben paylaşacak , başkalarına yararlı olabilir. Bu program çalışıyor.

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 

cevap

3

Here's istediğini için kullanabilirsiniz RadioButtons listesini simüle sahibi çizilmiş bir liste kutucukları Win örneği.

Düzenleme:Here, daha ayrıntılı bir Winforms özel denetim örneğidir.

+1

geçerlidir - çizim 'ControlPaint.DrawRadioButton (e.Graphics, yönüne bağlı ButtonState.Checked) tarafından yapılır;'. Kırmızı bir daire çizmek için bunu nasıl değiştirirdiniz? – Justin

+0

İstediğinizi çizebilirsiniz. E.Graphics ile kırmızı bir cicle çizmek için bu kod satırını kodla değiştirin. Bir daha derinlemesine özel denetim örneğin buraya bakınız: http://www.codeproject.com/KB/miscctrl/ScrollingTextControlArtic.aspx –

+0

referans için teşekkür ederiz, bunu yapmak başardı, ben bir daire üzerinde bir daire çizin Radyo düğmesi. Ayrıca justin'e teşekkürler. Paylaşacağım diğerlerine faydalı olabilirim. Daha fazla bilgi için yukarıya bakın. – Dewi

4

OP'nin VB kodunu bir temel olarak aldım ve biraz da MSDN yardımı ile PathGradientBrush'u kullanarak bu C# sınıfı için bu derlenmiş sınıfı buldum. Aşağıdaki resimde görüldüğü gibi yeşil ve kırmızı düğmeler kodumu kullanıyor, iki mavi olanlar normal versiyon.

Form1 - Displaying Coloured Radio Buttons

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); 
       } 
      } 
     } 
    } 
} 

merak ediyorsun ve bunu gittiğiniz burada, fırça özelliklerini test etmek kullanıyordum büyük kırmızı top için kod isterseniz ...

o kod pek emin değilim
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); 
     } 
    } 
} 
+0

m_circle ve m_glint konumlandırma için bu "Magic numaraları" evrensel değildir. Farklı yazı tiplerinin kullanılması veya autosize = false, renkli dairenin merkezlenmesini sağlar. – Andark

+0

@Andmark 'y'm' 'm_circle'' Convert.ToInt32 (Math.Floor ((Yükseklik - 7)/2)) 'dır. M_glint için her zaman bir yüksektir. – Breeze