Home > Blockchain >  How to detect if the mouse cursor is over a pictureBox or not?
How to detect if the mouse cursor is over a pictureBox or not?

Time:10-11

private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
        {
            int X = e.X;
            int Y = e.Y;

            if ((X >= pictureBox2.Left && X <= pictureBox2.Left   pictureBox2.Width) && (Y >= pictureBox2.Top && Y <= pictureBox2.Top   pictureBox2.Height))
            {
                Text = "Mouse over picturebox";
            }
            else
            {
                Text = "Mouse is not over picturebox";
            }
        }

Sometimes it's writing to the Text that's it's not over but then when moving the mouse back inside the pictureBox2 area it's not changing the text.

mousemove full code :

private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
        {
            int X = e.X;
            int Y = e.Y;

            if ((X >= 0 && X <= pictureBox2.Width) && (Y >= 0 && Y <= pictureBox2.Height))
            {
                if (e.Button != MouseButtons.Left) return;

                if (pictureBox2.Image != null && selectedPath != null)
                {
                    var dr = DrawingRects[DrawingRects.Count - 1];
                    if (e.Y < dr.StartPosition.Y) { dr.Location = new Point(dr.Rect.Location.X, e.Y); }
                    if (e.X < dr.StartPosition.X) { dr.Location = new Point(e.X, dr.Rect.Location.Y); }

                    dr.Size = new Size(Math.Abs(dr.StartPosition.X - e.X), Math.Abs(dr.StartPosition.Y - e.Y));
                    pictureBox2.Invalidate();
                }
            }
        }

All the mouse events :

private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;

            if (pictureBox2.Image != null && selectedPath != null)
            {
                DrawingRects.Add(new DrawingRectangle()
                {
                    Location = e.Location,
                    Size = Size.Empty,
                    StartPosition = e.Location,
                    Owner = (Control)sender,
                    DrawingcColor = SelectedColor // <= Shape's Border Color
                });
            }
        }

        private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
        {
            int X = e.X;
            int Y = e.Y;

            if ((X >= 0 && X <= pictureBox2.Width) && (Y >= 0 && Y <= pictureBox2.Height))
            {
                if (e.Button != MouseButtons.Left) return;

                if (pictureBox2.Image != null && selectedPath != null)
                {
                    var dr = DrawingRects[DrawingRects.Count - 1];
                    if (e.Y < dr.StartPosition.Y) { dr.Location = new Point(dr.Rect.Location.X, e.Y); }
                    if (e.X < dr.StartPosition.X) { dr.Location = new Point(e.X, dr.Rect.Location.Y); }

                    dr.Size = new Size(Math.Abs(dr.StartPosition.X - e.X), Math.Abs(dr.StartPosition.Y - e.Y));
                    pictureBox2.Invalidate();
                }
            }
        }

        private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;

            if (DrawingRects.Count > 0 && pictureBox2.Image != null && selectedPath != null)
            {
                // The last drawn shape
                var dr = DrawingRects.Last();
                if (dr.Rect.Width > 0 && dr.Rect.Height > 0)
                {
                    rectImage = cropAtRect((Bitmap)pictureBox2.Image, dr.Rect);
                    if (saveRectangles)
                    {


                        rectangleName = GetNextName(Path.Combine(selectedPath, "Rectangle"), ".bmp");
                        FileList.Add($"{dr.Location}, {dr.Size}", rectangleName);
                        string json = JsonConvert.SerializeObject(
    FileList,
    Formatting.Indented // this for pretty print
);
                        using (StreamWriter sw = new StreamWriter(Path.Combine(selectedPath, "rectangles.txt"), false))
                        {
                            sw.Write(json);
                            sw.Close();
                        }

                        rectImage.Save(rectangleName);
                        saveRectanglesCounter  ;
                    }
                    pixelsCounter = rect.Width * rect.Height;
                    
                    pictureBox1.Invalidate();

                    listBox1.DataSource = FileList.ToList();
                    listBox1.SelectedIndex = listBox1.Items.Count - 1;

                    pictureBox2.Focus();
                    Graphics g = Graphics.FromImage(this.pictureBox1.Image);
                    g.Clear(this.pictureBox1.BackColor);

                }
            }
        }

CodePudding user response:

The e.X and e.Y properties are relative to the control raising the event, while the Left and Top of the PictureBox are relative to the form. If you were going to do things the way you are, this:

if ((X >= pictureBox2.Left && X <= pictureBox2.Left   pictureBox2.Width) && (Y >= pictureBox2.Top && Y <= pictureBox2.Top   pictureBox2.Height))

should actually be this:

if ((X >= 0 && X <= pictureBox2.Width) && (Y >= 0 && Y <= pictureBox2.Height))

You wouldn't do it that way though. If the PictureBox is raising a MouseMove then you're guaranteed that the mouse pointer is over the PictureBox, so no check is necessary or worthwhile.

  • Related