#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.
}