WedX - журнал о программировании и компьютерных науках

Изменить цвет маленького кружка (точки) внутри переключателя на красный?

Как изменить цвет небольшого кружка (точки) внутри переключателя на красный в приложении Winform, использующем 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

Ответы:


1

Вот нарисованный на winforms пример владельца listbox, имитирующий список радиокнопок, которые вы можете использовать по своему усмотрению.

Изменить: Вот более подробный Пример настраиваемого элемента управления Winforms.

23.06.2011
  • Я не уверен, что большая часть этого кода применима - рисунок сделан ControlPaint.DrawRadioButton(e.Graphics, rect, ButtonState.Checked);. Как бы вы изменили это, чтобы нарисовать красный круг? 23.06.2011
  • Вы можете рисовать все, что хотите. Замените эту строку кода кодом, чтобы нарисовать красный круг с e.Graphics. Посмотрите здесь более подробный пример настраиваемого элемента управления: codeproject.com/KB/miscctrl/ ScrollingTextControlArtic.aspx 23.06.2011
  • Спасибо за ссылку, мне удалось это сделать, я рисую кружок над кружком радиокнопки. Также спасибо @justin. Поделюсь, может быть, другим будет полезно. Подробнее см. Выше. 24.06.2011

  • 2

    Я взял за основу код VB OP и немного помощи MSDN по использованию PathGradientBrush придумал этот производный класс для C #. Зеленая и красная кнопки, как показано на изображении ниже, используют мой код, две синие - обычная версия.

    Form1 - отображение цветных радиокнопок

    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);
            }
        }
    }
    
    11.03.2013
  • Эти строгие магические числа для позиционирования m_circle и m_glint не универсальны. Использование разных шрифтов или autosize = false приводит к смещению цветного круга по центру. 15.05.2015
  • @ Знак Y из m_circle - Convert.ToInt32(Math.Floor((Height - 7) / 2)). Для m_glint он всегда на единицу выше. 22.05.2017
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]