событие щелчка пользовательского элемента управления c #

#c#

#c#

Вопрос:

Я создал пользовательский элемент управления и хочу добавить событие щелчка, чтобы, когда пользователь нажимает в любом месте элемента управления, он возвращал позицию, в которой пользователь нажал на элемент управления. Например, если пользователь нажмет в середине панели, это, по сути, вернет мне достаточно информации, чтобы я мог вычислить 50% и что пользователь нажал в середине.

 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;
using System.Drawing.Drawing2D;

namespace CustomRangeBar
{
    public partial class RangeBar : UserControl
    {
        public RangeBar()
        {
            InitializeComponent();
            label1.ForeColor = Color.Black;
            this.ForeColor = SystemColors.Highlight; // set the default color the rangeBar
            this.Click  = new EventHandler(RangeBar_Click); 
        }

        protected float percent = 0.0f; // Protected because we don't want this to be accessed from the outside
        // Create a Value property for the rangeBar
        public float Value
        {
            get
            {
                return percent;
            }
            set
            {
                // Maintain the value between 0 and 100
                if (value < 0) value = 0;
                else if (value > 100) value = 100;
                percent = value;
                label1.Text = value.ToString();
                //redraw the rangeBar every time the value changes
                this.Invalidate();
            }
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Brush b = new SolidBrush(this.ForeColor); //create brush that will draw the background of the range bar
            // create a linear gradient that will be drawn over the background. FromArgb means you can use the Alpha value which is the transparency
            LinearGradientBrush lb = new LinearGradientBrush(new Rectangle(0, 0, this.Width, this.Height), Color.FromArgb(255, Color.White), Color.FromArgb(50, Color.White), LinearGradientMode.Vertical);

            // calculate how much has the rangeBar to be filled for 'x' %
            int width = (int)((percent / 100) * this.Width);
            e.Graphics.FillRectangle(b, 0, 0, width, this.Height);
            e.Graphics.FillRectangle(lb, 0, 0, width, this.Height);
            b.Dispose(); lb.Dispose();
        }

        private void RangeBar_SizeChanged(object sender, EventArgs e)
        {
            // maintain the label in the center of the rangeBar
            label1.Location = new Point(this.Width / 2 - 21 / 2 - 4, this.Height / 2 - 15 / 2);
        }

    }
}

public void RangeBar_Click(object obj, EventArgs ea)
{
    // This get executed if the pictureBox gets clicked
    label1.text = "Increment 1";
}
  

Комментарии:

1. переопределить метод OnClick()

2. где или как мне это сделать?

3. Почему вы не используете using для удаления b и lb в своем OnPaint методе?

4. Если у вас есть skype, я могу показать вам это в действии. Я бы не прочь получить наш вклад в то, чтобы убедиться, что то, что я делаю, правильно. @ScottChamberlain Я получаю эту ошибку при использовании переопределения onClick: метод ошибки 1 должен иметь возвращаемый тип

5. @JokerMartini Ну, это потому, что пример, который дал вам Дэвид, неверен, в нем отсутствует возвращаемый тип и параметр.

Ответ №1:

OnClick не является хорошей функцией для переопределения или подписки, потому что она не сообщает вам позицию, в которой произошел щелчок, который вы ищете.

Вам нужен OnMouseClick, который включает в себя x, y точки щелчка.

 protected override void OnMouseClick(MouseEventArgs e)
{
    int x = e.X;
    int y = e.Y;

    //Do your calculation here.
}