如何在鼠标单击坐标处的图片框上绘制矩形
How to draw rectangle on picture box at mouse click coordinates
我正在尝试创建一个 windows 表单应用程序,在该应用程序中,当用户单击图片框上的任意位置时,单击图像的位置会出现一个矩形。
但是,如果我单击图像上的任意位置,无论我单击的位置如何,矩形都会出现在某个随机位置。它可以出现在靠近或远离鼠标点击的地方,在某些情况下它永远不会超出图片框的左半部分。
我可以就如何解决这个问题提供一些指导吗?具体来说,我希望我点击的位置是矩形的中心。
谢谢!
这是我的参考代码:
private void pbImage_Click(object sender, EventArgs e)
{
//Note: pbImage is the name of the picture box used here.
var mouseEventArgs = e as MouseEventArgs;
int x = mouseEventArgs.Location.X;
int y = mouseEventArgs.Location.Y;
// We first cast the "Image" property of the pbImage picture box control
// into a Bitmap object.
Bitmap pbImageBitmap = (Bitmap)(pbImage.Image);
// Obtain a Graphics object from the Bitmap object.
Graphics graphics = Graphics.FromImage((Image)pbImageBitmap);
Pen whitePen = new Pen(Color.White, 1);
// Show the coordinates of the mouse click on the label, label1.
label1.Text = "X: " + x + " Y: " + y;
Rectangle rect = new Rectangle(x, y, 200, 200);
// Draw the rectangle, starting with the given coordinates, on the picture box.
graphics.DrawRectangle(whitePen, rect);
// Refresh the picture box control in order that
// our graphics operation can be rendered.
pbImage.Refresh();
// Calling Dispose() is like calling the destructor of the respective object.
// Dispose() clears all resources associated with the object, but the object still remains in memory
// until the system garbage-collects it.
graphics.Dispose();
}
2015 年 8 月 16 日凌晨 12 点 55 分更新 - 我知道为什么! pictureBox 的 SizeMode 属性 设置为 StretchImage。将其更改回正常模式并且工作正常。不太清楚为什么会这样,我一定会调查一下。
回复的各位,非常感谢你们的帮助! :)
您正在将 EventArgs 转换为 MouseEventArgs,我认为这是不正确的。您是否尝试使用图片控件的 MouseDown 或 MouseUp 事件?这些活动为您提供了所需的信息。
Rectangle 构造函数的前两个参数是左上角(不是中心)坐标。
并分别处理鼠标和绘画事件:
int mouseX, mouseY;
private void pbImage_MouseDown(object sender, MouseEventArgs e)
{
mouseX = e.X;
mouseY = e.Y;
pbImage.Refresh();
}
private void pbImage_Paint(object sender, PaintEventArgs e)
{
//... your other stuff
Rectangle rect = new Rectangle(mouseX - 100, mouseY - 100, 200, 200);
e.Graphics.DrawRectangle(whitePen, rect);
}
我正在尝试创建一个 windows 表单应用程序,在该应用程序中,当用户单击图片框上的任意位置时,单击图像的位置会出现一个矩形。
但是,如果我单击图像上的任意位置,无论我单击的位置如何,矩形都会出现在某个随机位置。它可以出现在靠近或远离鼠标点击的地方,在某些情况下它永远不会超出图片框的左半部分。
我可以就如何解决这个问题提供一些指导吗?具体来说,我希望我点击的位置是矩形的中心。
谢谢!
这是我的参考代码:
private void pbImage_Click(object sender, EventArgs e)
{
//Note: pbImage is the name of the picture box used here.
var mouseEventArgs = e as MouseEventArgs;
int x = mouseEventArgs.Location.X;
int y = mouseEventArgs.Location.Y;
// We first cast the "Image" property of the pbImage picture box control
// into a Bitmap object.
Bitmap pbImageBitmap = (Bitmap)(pbImage.Image);
// Obtain a Graphics object from the Bitmap object.
Graphics graphics = Graphics.FromImage((Image)pbImageBitmap);
Pen whitePen = new Pen(Color.White, 1);
// Show the coordinates of the mouse click on the label, label1.
label1.Text = "X: " + x + " Y: " + y;
Rectangle rect = new Rectangle(x, y, 200, 200);
// Draw the rectangle, starting with the given coordinates, on the picture box.
graphics.DrawRectangle(whitePen, rect);
// Refresh the picture box control in order that
// our graphics operation can be rendered.
pbImage.Refresh();
// Calling Dispose() is like calling the destructor of the respective object.
// Dispose() clears all resources associated with the object, but the object still remains in memory
// until the system garbage-collects it.
graphics.Dispose();
}
2015 年 8 月 16 日凌晨 12 点 55 分更新 - 我知道为什么! pictureBox 的 SizeMode 属性 设置为 StretchImage。将其更改回正常模式并且工作正常。不太清楚为什么会这样,我一定会调查一下。
回复的各位,非常感谢你们的帮助! :)
您正在将 EventArgs 转换为 MouseEventArgs,我认为这是不正确的。您是否尝试使用图片控件的 MouseDown 或 MouseUp 事件?这些活动为您提供了所需的信息。
Rectangle 构造函数的前两个参数是左上角(不是中心)坐标。
并分别处理鼠标和绘画事件:
int mouseX, mouseY;
private void pbImage_MouseDown(object sender, MouseEventArgs e)
{
mouseX = e.X;
mouseY = e.Y;
pbImage.Refresh();
}
private void pbImage_Paint(object sender, PaintEventArgs e)
{
//... your other stuff
Rectangle rect = new Rectangle(mouseX - 100, mouseY - 100, 200, 200);
e.Graphics.DrawRectangle(whitePen, rect);
}