C#-使用多个图片框处理鼠标位置

C#-使用多个图片框处理鼠标位置,c#,forms,window,picturebox,C#,Forms,Window,Picturebox,我以窗口形式创建了4个PictureBox(pictureBox1、pictureBox2、pictureBox3和pictureBox4)。我还创建了一个函数,可以在pictureBox上绘制一个矩形,如下所示: 要创建矩形,请执行以下操作: private void PictureBox_MouseMove(object sender, MouseEventArgs e) { var x = e.X; var y = e.Y; var width = 10;

我以窗口形式创建了4个PictureBox(pictureBox1、pictureBox2、pictureBox3和pictureBox4)。我还创建了一个函数,可以在pictureBox上绘制一个矩形,如下所示:

要创建矩形,请执行以下操作:

private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    var x = e.X;
    var y = e.Y;

    var width = 10;
    var height = 10;

    FwRect = new[]
    {
        new PointF(x, y), new PointF(x, y + height), new PointF(x + width, y + height),
                new PointF(x + width, y)
    };
    FwRectan = new Rectangle((int)x, (int)y, (int)width, (int)height);
    Refresh();
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
    using (var pen = new Pen(Color.Black, 2))
    {
        //Draw the rectangle on our form with the pen
        e.Graphics.DrawRectangle(pen, FwRectan);
    }
}
然后,我为每个pictureBox添加了此事件:

this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox3.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox4.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.pictureBox1.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox2.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox3.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox4.MouseMove += this.PictureBox_MouseMove;

        this.pictureBox1.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox2.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox3.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox4.MouseLeave += this.pictureBox_MouseLeave;

        this.pictureBox1.Paint += this.PictureBox_Paint;
        this.pictureBox2.Paint += this.PictureBox_Paint;
        this.pictureBox3.Paint += this.PictureBox_Paint;
        this.pictureBox4.Paint += this.PictureBox_Paint;
    }

    private int bxWidth = 10;
    private int bxHeight = 10;
    private void PictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = new Rectangle(e.X, e.Y, bxWidth, bxHeight);
        pb.Invalidate();
    }

    private void PictureBox_Paint(object sender, PaintEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        if (pb.Tag != null && pb.Tag is Rectangle)
        {
            Rectangle rc = (Rectangle)pb.Tag;
            using (var pen = new Pen(Color.Black, 2))
            {
                //Draw the rectangle on our form with the pen
                e.Graphics.DrawRectangle(pen, rc);
            }
        }            
    }

    private void pictureBox_MouseLeave(object sender, EventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = null; // if you want the box to disappear when the mouse leaves?
        pb.Invalidate();
    }

}
要绘制矩形,请执行以下操作:

private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    var x = e.X;
    var y = e.Y;

    var width = 10;
    var height = 10;

    FwRect = new[]
    {
        new PointF(x, y), new PointF(x, y + height), new PointF(x + width, y + height),
                new PointF(x + width, y)
    };
    FwRectan = new Rectangle((int)x, (int)y, (int)width, (int)height);
    Refresh();
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
    using (var pen = new Pen(Color.Black, 2))
    {
        //Draw the rectangle on our form with the pen
        e.Graphics.DrawRectangle(pen, FwRectan);
    }
}
最后,如果我在pictureBox1中移动鼠标并绘制一个矩形,它也会为每个pictureBox绘制一个矩形。如何仅在鼠标所在的pictureBox上绘制矩形


多谢各位

您有4个
图片框
,因此您需要4个
矩形
来绘制当前鼠标移动:

Rectangle[] _rectangle = new Rectangle[4];
然后在常见的
PictureBox\u MouseMove
PictureBox\u Paint
事件中,您需要确定要使用哪个值,即PictureBox的索引。可以通过使用
标记
属性或将所有PictureBox放入数组以使其索引匹配来完成:

PictureBox _control = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4 };
事件句柄将如下所示

void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    var x = e.X;
    var y = e.Y;

    var width = 10;
    var height = 10;

    FwRect = new[]
    {
        new PointF(x, y), new PointF(x, y + height), new PointF(x + width, y + height),
                new PointF(x + width, y)
    };

    var index = _control.IndexOf(sender);
    _rectangle[index] = new Rectangle((int)x, (int)y, (int)width, (int)height);
    _rectangle[index].Invalidate();
}

void PictureBox_Paint(object sender, PaintEventArgs e)
{
    var index = _control.IndexOf(sender);
    using (var pen = new Pen(Color.Black, 2))
    {
        //Draw the rectangle on our form with the pen
        e.Graphics.DrawRectangle(pen, _rectangle[index]);
    }
}

编辑:


实际上,上述解决方案将记住每个picturebox的矩形。可能不是你想要的。简单的解决方法是清除mousemove中的其他矩形。虽然更合适的解决方案是从mousemove中记住
sender
,并且只在paint中绘制匹配的
sender

您有4个
PictureBox
,因此您需要4个
矩形来绘制当前鼠标移动:

Rectangle[] _rectangle = new Rectangle[4];
然后在常见的
PictureBox\u MouseMove
PictureBox\u Paint
事件中,您需要确定要使用哪个值,即PictureBox的索引。可以通过使用
标记
属性或将所有PictureBox放入数组以使其索引匹配来完成:

PictureBox _control = new PictureBox[] { pictureBox1, pictureBox2, pictureBox3, pictureBox4 };
事件句柄将如下所示

void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    var x = e.X;
    var y = e.Y;

    var width = 10;
    var height = 10;

    FwRect = new[]
    {
        new PointF(x, y), new PointF(x, y + height), new PointF(x + width, y + height),
                new PointF(x + width, y)
    };

    var index = _control.IndexOf(sender);
    _rectangle[index] = new Rectangle((int)x, (int)y, (int)width, (int)height);
    _rectangle[index].Invalidate();
}

void PictureBox_Paint(object sender, PaintEventArgs e)
{
    var index = _control.IndexOf(sender);
    using (var pen = new Pen(Color.Black, 2))
    {
        //Draw the rectangle on our form with the pen
        e.Graphics.DrawRectangle(pen, _rectangle[index]);
    }
}

编辑:


实际上,上述解决方案将记住每个picturebox的矩形。可能不是你想要的。简单的解决方法是清除mousemove中的其他矩形。虽然更合适的解决方案是从mousemove中记住
发送者
,并且只在paint中绘制匹配的
发送者

下面是一个示例,展示了如何将矩形存储在Sinatr在文章中提到的
.Tag
属性中。此示例还将在鼠标离开时清除矩形,以便在当前PictureBox中仅绘制一个矩形:

this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox3.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox4.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.pictureBox1.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox2.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox3.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox4.MouseMove += this.PictureBox_MouseMove;

        this.pictureBox1.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox2.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox3.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox4.MouseLeave += this.pictureBox_MouseLeave;

        this.pictureBox1.Paint += this.PictureBox_Paint;
        this.pictureBox2.Paint += this.PictureBox_Paint;
        this.pictureBox3.Paint += this.PictureBox_Paint;
        this.pictureBox4.Paint += this.PictureBox_Paint;
    }

    private int bxWidth = 10;
    private int bxHeight = 10;
    private void PictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = new Rectangle(e.X, e.Y, bxWidth, bxHeight);
        pb.Invalidate();
    }

    private void PictureBox_Paint(object sender, PaintEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        if (pb.Tag != null && pb.Tag is Rectangle)
        {
            Rectangle rc = (Rectangle)pb.Tag;
            using (var pen = new Pen(Color.Black, 2))
            {
                //Draw the rectangle on our form with the pen
                e.Graphics.DrawRectangle(pen, rc);
            }
        }            
    }

    private void pictureBox_MouseLeave(object sender, EventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = null; // if you want the box to disappear when the mouse leaves?
        pb.Invalidate();
    }

}
以下是跑步的感觉:


下面是一个示例,展示了如何在Sinatr在其文章中提到的
.Tag
属性中存储矩形。此示例还将在鼠标离开时清除矩形,以便在当前PictureBox中仅绘制一个矩形:

this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox3.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
this.pictureBox4.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBox_MouseMove);
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.pictureBox1.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox2.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox3.MouseMove += this.PictureBox_MouseMove;
        this.pictureBox4.MouseMove += this.PictureBox_MouseMove;

        this.pictureBox1.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox2.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox3.MouseLeave += this.pictureBox_MouseLeave;
        this.pictureBox4.MouseLeave += this.pictureBox_MouseLeave;

        this.pictureBox1.Paint += this.PictureBox_Paint;
        this.pictureBox2.Paint += this.PictureBox_Paint;
        this.pictureBox3.Paint += this.PictureBox_Paint;
        this.pictureBox4.Paint += this.PictureBox_Paint;
    }

    private int bxWidth = 10;
    private int bxHeight = 10;
    private void PictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = new Rectangle(e.X, e.Y, bxWidth, bxHeight);
        pb.Invalidate();
    }

    private void PictureBox_Paint(object sender, PaintEventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        if (pb.Tag != null && pb.Tag is Rectangle)
        {
            Rectangle rc = (Rectangle)pb.Tag;
            using (var pen = new Pen(Color.Black, 2))
            {
                //Draw the rectangle on our form with the pen
                e.Graphics.DrawRectangle(pen, rc);
            }
        }            
    }

    private void pictureBox_MouseLeave(object sender, EventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        pb.Tag = null; // if you want the box to disappear when the mouse leaves?
        pb.Invalidate();
    }

}
以下是跑步的感觉:


什么是FwIsDown、FwDisable和FwStartPointX?“它还为每个pictureBox绘制一个矩形”-为什么?我看不到您显示的代码中的答案,请显示更多信息,请参阅。将发件人置于图片框中,然后您可以读取框中的文本:PictureBox box=发件人为PictureBox;创建一个自定义的
PictureBox
,以避免出现这种情况。重写
OnPaint
方法以绘制橡皮筋+常用例程。这种方式将帮助您在实现中集中精力解决您试图解决的主要问题。我只需测试鼠标是否在发送者边界内:
if((发送者作为PictureBox.bounds.Contains((发送者作为PictureBox.Parent.PointToClient(Control.MousePosition))
什么是FwIsDown、FwDisable和FwStartPointX?它还为每个pictureBox绘制一个矩形“-为什么?我看不到您显示的代码中的答案,请显示更多信息,请参阅。将发件人置于图片框中,然后您可以读取框中的文本:PictureBox box=发件人为PictureBox;创建一个自定义的
PictureBox
,以避免出现这种情况。重写
OnPaint
方法以绘制橡皮筋+常用例程。这种方式将帮助您在实现中集中精力解决您试图解决的主要问题。我只需测试鼠标是否在发件人的边界内:
if((发件人作为PictureBox.bounds.Contains((发件人作为PictureBox.Parent.PointToClient(Control.MousePosition)))
Use
如果(pb.Tag是矩形rc){…}
,则使用
如果(pb.Tag是矩形rc){…}