Увеличьте или уменьшите значение, присвоенное свойству, чтобы сделать треугольник меньше или больше

Я пытаюсь создать пользовательский элемент управления в Visual С# Winforms. Что я хочу, так это когда я щелкаю элемент управления и перетаскиваю влево, уменьшаю значение свойства, которое напрямую связано с размером треугольника, и когда я перетаскиваю вправо, мне нужно увеличить это значение, чтобы сделать треугольник больше, и покажите значение этого свойства в label2 другой формы, которую я создал, здесь я даю фото, которое возможно вам поможет. Буду признателен за помощь. Спасибо вам, ребята

Поведение треугольника

Вот код из обоих файлов:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MisControles
{
    public partial class ControlVolumen: UserControl
    {
        private int valor;
        Color color1;
        Color color2;
        Color color3;
        public int Valor
        {
            get { return valor; }
            set { valor = value; this.Refresh(); }
        }

        public ControlVolumen()
        {
            InitializeComponent();
            color1 = Color.LawnGreen;
            color2 = Color.Yellow;
            color3 = Color.Red;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            Brush b = new SolidBrush(color1);
            Brush b1 = new SolidBrush(color2);
            Brush b2 = new SolidBrush(color3);
            int ancho = this.Width * Valor / 100;
            int alto = this.Height * Valor / 100;
            Point p0 = new Point(0, this.Height);
            Point p1 = new Point(ancho, this.Height);
            Point p2 = new Point(ancho, this.Height - alto);

            if (valor <= 50) {
                g.FillPolygon(b, new Point[] { p0, p1, p2 }); 
            }else if (valor <= 90)
            {
                g.FillPolygon(b1, new Point[] { p0, p1, p2 });
            }else if (valor > 90)
            {
                g.FillPolygon(b2, new Point[] { p0, p1, p2 });
            }

            
        }

    }
}

/* The form with the control */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Volumen
{
    public partial class Form1 : Form
    {

        Image img2;
        Image img1;
        public Form1()
        {
            InitializeComponent();
            img1 = Image.FromFile("btn2.png");
            img2 = Image.FromFile("btn1.png");
            this.checkBox1.Image = (Image)(new Bitmap(img1, new Size(32, 32)));
            label2.Text = "";
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                this.checkBox1.Image = (Image)(new Bitmap(img1, new Size(32, 32)));
                label1.Text = " ";
            }
            else
            {
                this.checkBox1.Image = (Image)(new Bitmap(img2, new Size(32, 32)));
                label1.Text = "Mute On";
            }
        }
    }
}

Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
157
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Здесь уместно использовать элемент управления TrackBar . Вы можете использовать событие ValueChanged и использовать его свойство Value для обновления метки.

Ответ принят как подходящий

Взаимодействие с событиями мыши

Обработайте соответствующие события мыши, чтобы вычислить и установить новое значение в соответствии с положением мыши, пока нажата левая кнопка мыши. Обновите рисунок, вызвав метод Invalidate().

Уведомить хост

Создайте пользовательское событие, чтобы уведомлять хост всякий раз, когда значение изменяется, вызывая инициатор события OnValorChanged.

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace MisControles
{
    [DesignerCategory("Code"),
        DefaultEvent("ValorChanged"),
        DefaultProperty("Valor")]
    public class ControlVolumen : Control
    {
        private SolidBrush b1, b2, b3;

        public ControlVolumen () : base()
        {
            SetStyle(
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.UserPaint |
                ControlStyles.ResizeRedraw |
                ControlStyles.OptimizedDoubleBuffer, true);
            UpdateStyles();

            b1 = new SolidBrush(Color.LawnGreen);
            b2 = new SolidBrush(Color.Yellow);
            b3 = new SolidBrush(Color.Red);
        }

        private int valor;
        public int Valor
        {
            get { return valor; }
            set
            {
                valor = value < 0 ? 0 : value > 100 ? 100 : value;
                Invalidate();
                OnValorChanged();
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            var g = e.Graphics;
            var ancho = Width * Valor / 100;
            var alto = Height * Valor / 100;
            var p0 = new Point(0, Height);
            var p1 = new Point(ancho, Height);
            var p2 = new Point(ancho, Height - alto);
            var b = valor < 50 ? b1 : valor <= 90 ? b2 : b3;

            g.Clear(BackColor);
            g.FillPolygon(b, new[] { p0, p1, p2 });
        }

        // Valor with capital V. The public property not the private field.
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            if (e.Button == MouseButtons.Left)
                Valor = GetValorFromPoint(e.Location);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (e.Button == MouseButtons.Left)
                Valor = GetValorFromPoint(e.Location);
        }

        // Clean up.
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                b1.Dispose();
                b2.Dispose();
                b3.Dispose();
            }
            base.Dispose(disposing);
        }

        public event EventHandler ValorChanged;

        protected virtual void OnValorChanged() => 
            ValorChanged?.Invoke(this, new EventArgs());

        // MaximumValue * Point.X / Width
        private int GetValorFromPoint(Point p) => 
            (int)Math.Round((double)(100 * p.X / Width));
    }
}

В форме хостинга дважды щелкните элемент управления, чтобы подписаться на событие ValorChanged по умолчанию и обработать его следующим образом:

private void controlVolumen1_ValorChanged(object sender, EventArgs e)
{
    label1.Text = controlVolumen1.Valor.ToString();
}

Кроме того, я думаю, что заливка полигона LinearGradientBrush с ColorBlend больше подходит для этого элемента управления.

Например:

// +
using System.Drawing.Drawing2D;

protected override void OnPaint(PaintEventArgs e)
{
    var g = e.Graphics;
    var ancho = Width * Valor / 100;
    var alto = Height * Valor / 100;
    var p0 = new Point(0, Height);
    var p1 = new Point(ancho, Height);
    var p2 = new Point(ancho, Height - alto);

    g.Clear(BackColor);

    var cb = new ColorBlend
    {
        Colors = new[] { Color.LawnGreen, Color.Yellow, Color.Red },
        Positions = new[] { 0, 0.75f, 1 }
    };

    using (var br = new LinearGradientBrush(
        ClientRectangle, Color.Empty, Color.Empty, 0f))
    {
        br.InterpolationColors = cb;
        e.Graphics.FillPolygon(br, new[] { p0, p1, p2 });
    }
}

Результат:

Другие вопросы по теме