winforms 如何检测鼠标光标是否在pictureBox上?

nwnhqdif  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(184)
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";
            }
        }

有时,它正在写入文本,这是它没有结束,但当移动鼠标回到pictureBox2区域,它没有改变文本。
mousemove完整代码:

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_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);

                }
            }
        }
ev7lccsx

ev7lccsx1#

e.Xe.Y属性是相对于引发事件的控件,而PictureBoxLeftTop则是相对于表单。如果您要以目前的方式执行作业,请执行下列动作:

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

应该是这样的

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

如果PictureBox引发了MouseMove,那么你可以保证鼠标指针在PictureBox上,所以没有必要也不值得检查。

相关问题