Определение щелчка

Вопрос: у меня есть линия(e.DrawLine(...)) при щелчке мыши, как узнать, я на линию щелкнул или нет ?
14 ответов

сверить принадлежат ли координаты щелчка линии...элементарная алгебра, 10-й класс...


У меня там сложный график из мн-ва линий)Ну тогда как проверить каким цветом пиксель, на который я нажал ?


Получаете объект типа Graphics для нужной области, а затем на его основе создаёте объект Bitmap, у которого есть метод GetPixel


* Проходил мимо * WPF всему голова: там геометрические фигуры выполнены в виде контролов, поэтому для них уже реализованы события Click, MouseDown, MouseUp и т. д. Хотя впринципе можно реализовать подобные контролы и в WinForms...Способ, предложенный Partizan, позволяет работать с "легкой" графикой (все же контролы будут больше тормозить), но требует затраты ресурсов на просчет принадлежности пиксела к тому или иному объекту. Способ с контролами более тяжеловесный (и поэтому может не подходить в случае real-time графиков), но зато не требует затрат на определение, по какому объекту был осуществлен клик (он будет храниться в переменной sender обработчика клика).


мне надо на Win Forms


private void pictureBox1_Paint(object sender, PaintEventArgs e)        {               bmp = (Bitmap)pictureBox1.Image;        }if(bmp.GetPixel(e.X,e.Y).B==0) //ошибка NullReferenceException{...}
в чём у меня проблема ?)


GLeBaTi, в том, что какого-то из объектов в той строке не существует...скорее всего GetPixel вернул null...


у меня pictureBox1.Image == null - почему ? Так не должно быть(((


GLeBaTiу меня pictureBox1.Image == null - почему ? Так не должно быть(((а у меня полное отсутствие джин-тоника в холодильнике. так не должно быть, однако он пуст."Life sucks, and then you die" © Dead Like me.почему?неправильно инициализировал PictureBox или вообще забил на инициализацию.


неужели никто не сталкивался с этим ?  


GLeBaTi, ну дык проверьте что вам возвращает:
bmp = (Bitmap)pictureBox1.Image;
ведь вам в "лоб" говорят что то с чем вы пытаетесь работать ( а скорей всего это битмап ) его не существует.


Если ян е путаю - Image это изображение которое ты загружаешь в него... если же ты изображение не загружаешь а просто рисуешь на нем надо юзать Graphics...


GLeBaTi, видимо ты рисуешь вызывая метод Graphics.DrawLine(...), используй вместо этого GraphicsPath.AddLine(...).Вот пример (добавь панель):
    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            pathPen = new Pen(Color.Red);            pathPen.Width = 5;            path = new GraphicsPath();            path.AddLine(0, 0, 200, 100);            path.AddEllipse(0, 0, 200, 100);        }        GraphicsPath path;        Pen pathPen;        private void panel1_Paint(object sender, PaintEventArgs e)        {            e.Graphics.DrawPath(pathPen, path);        }        private void panel1_MouseMove(object sender, MouseEventArgs e)        {            string result = string.Empty;            if (path.IsOutlineVisible(e.Location, pathPen))                result += "(в контуре)";            if (path.IsVisible(e.Location))                result += "(внутри)";            this.Text = result;        }    }
Добавлено через 3 минуты и 23 секундыЕсли ты делаешь нечто вроде графического редактора, то полезно будет разделить графические объекты по классам.


мне надо просто узнать цвет пикселя на PictureBox.Вот только как ?)