如何在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);
}
如果有人能给我示例代码,我将不胜感激。
谢谢。
您根本不想使用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应用程序中的所有基本绘图功能。您所要做的就是在该类实例上调用类似DrawRectangle
或DrawImage
的方法,将适当的对象作为参数传入,然后所有的绘图都会自动完成。很简单,对吧?
最后,请注意,我们在创建矩形时所做的操作与在MouseUp
事件处理程序方法中所做的完全相同。这是有道理的,因为我们只需要用户创建矩形时矩形的即时大小