如何在PictureBox上捕获鼠标坐标

本文关键字:鼠标 坐标 PictureBox | 更新日期: 2023-09-27 17:57:34

我是c#的新手。我在picturebox上有一个图像,我想在图像上画一个矩形,以捕捉我将要画的矩形的X、Y坐标和宽度/高度(相对于picturebox的图像)。我知道我必须在pictureBox1_MouseEnter上做点什么。。等等,但我不知道从哪里开始。

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {
        Rectangle Rect = RectangleToScreen(this.ClientRectangle);
    }

如果有人能给我示例代码,我将不胜感激。

谢谢。

如何在PictureBox上捕获鼠标坐标

您根本不想使用MouseEnter。您希望使用MouseDown,因为您不希望开始跟踪用户绘制的矩形,直到他们单击鼠标按钮。

因此,在MouseDown事件处理程序方法中,保存光标的当前坐标。这是矩形的起始位置,点(X,Y)。

private Point initialMousePos;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    this.initialMousePos = e.Location;
}

然后,在用户停止拖动并释放鼠标按钮时引发的MouseUp事件中,您希望保存鼠标光标的最终终点,并将其与初始起点组合以构建矩形。构建这样一个矩形的最简单方法是使用Rectangle类的FromLTRB静态方法:

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Save the final position of the mouse
    Point finalMousePos = e.Location;
    // Create the rectangle from the two points
    Rectangle drawnRect = Rectangle.FromLTRB(
                                             this.initialMousePos.X,
                                             this.initialMousePos.Y,
                                             finalMousePos.X,
                                             finalMousePos.Y);
    // Do whatever you want with the rectangle here
    // ...
}

您可能希望将其与MouseMove事件处理程序方法中的一些绘制代码相结合,以便在用户绘制矩形时为其提供视觉指示。

方法是处理MouseMove事件以获取鼠标的当前位置,然后调用Invalidate方法,该方法将引发Paint事件。所有绘制代码都应该在Paint事件处理程序中。这是一种比您在网上找到的许多示例所采用的方法更好的方法,在那里您将看到类似CreateGraphics的东西在MouseMove事件处理程序方法内部被调用。如果可能的话,尽量避免。

示例实现:

private Point currentMousePos;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    // Save the current position of the mouse
    currentMousePos = e.Location;
    // Force the picture box to be repainted
    pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    // Create a pen object that we'll use to draw
    // (change these parameters to make it any color and size you want)
    using (Pen p = new Pen(Color.Blue, 3.0F))
    {
        // Create a rectangle with the initial cursor location as the upper-left
        // point, and the current cursor location as the bottom-right point
        Rectangle currentRect = Rectangle.FromLTRB(
                                                   this.initialMousePos.X,
                                                   this.initialMousePos.Y,
                                                   currentMousePos.X,
                                                   currentMousePos.Y);
        // Draw the rectangle
        e.Graphics.DrawRectangle(p, currentRect);
    }
}

如果你以前从未做过任何类型的绘图,那么关于这段代码有几点需要注意。第一件事是,我已经将创建Pen对象(用于进行实际绘图)的过程封装在using语句中。无论何时创建实现IDisposable接口的对象(如画笔和笔),这都是一种很好的通用做法,以防止应用程序中的内存泄漏。

此外,PaintEventArgs还为我们提供了Graphics类的一个实例,它封装了.NET应用程序中的所有基本绘图功能。您所要做的就是在该类实例上调用类似DrawRectangleDrawImage的方法,将适当的对象作为参数传入,然后所有的绘图都会自动完成。很简单,对吧?

最后,请注意,我们在创建矩形时所做的操作与在MouseUp事件处理程序方法中所做的完全相同。这是有道理的,因为我们只需要用户创建矩形时矩形的即时大小