用mouseclick事件在picturebox获取的坐标不准确??

小白晒太阳 2012-06-20 09:40:09
我用
//MessageBox.Show(e.X.ToString(), e.Y.ToString());//显示X坐标
获取坐标值,然后在picturebox上画矩形,为什么矩形画的位置偏差好大?求大神指导,谢谢了。
         if (e.X > 330 && e.X < 360 && e.Y > 140 && e.Y < 165)
{
Graphics g = Graphics.FromImage(pictureBox1.Image);
Pen mpen = new Pen(Color.Red, 4);
g.DrawRectangle(mpen,330, 140, 50, 50);
this.pictureBox1.Refresh();
}


其中(330,140)和(360,165)是对应点击的鼠标值.
...全文
381 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
恩,确实可以了。该结贴了。。 我还是有疑问,为什么我那样写画的矩形位置跟鼠标点击的位置偏差很大,照你这么写就没事。能顺便告诉我,谢谢。

引用 9 楼 的回复:

矩形要保留的图片上么,如果只是给用户看,那可以这样
注册 pictureBox1 Paint 事件
C# code
private bool drawRect = false;

private void pictur……
[/Quote]
原先代码是从 Graphics.FromImage(pictureBox1.Image) 图片上创建画布,图片在 PictureBox 上显示时可能有拉伸缩放,绘画上去的矩形也会被拉伸缩放,坐标就不准确了
小白晒太阳 2012-06-24
  • 打赏
  • 举报
回复
恩,确实可以了。该结贴了。。 我还是有疑问,为什么我那样写画的矩形位置跟鼠标点击的位置偏差很大,照你这么写就没事。能顺便告诉我,谢谢。[Quote=引用 9 楼 的回复:]

矩形要保留的图片上么,如果只是给用户看,那可以这样
注册 pictureBox1 Paint 事件
C# code
private bool drawRect = false;

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (drawRect)
{
Pen mpen……
[/Quote]
小白晒太阳 2012-06-23
  • 打赏
  • 举报
回复
            MessageBox.Show(e.X.ToString(), e.Y.ToString());
int Left =357 * pictureBox1.BackgroundImage.Left / pictureBox1.Width;
int Top = 192 * pictureBox1.BackgroundImage.Height / pictureBox1.Height;
int Width = 95 * pictureBox1.BackgroundImage.Width / pictureBox1.Width;
int Height = 75 * pictureBox1.BackgroundImage.Height / pictureBox1.Height;
if (e.X > 357 && e.X < 452 && e.Y > 192 && e.Y < 267) {


Graphics g = Graphics.FromImage(pictureBox1.Image);
Pen mpen = new Pen(Color.Red, 4);
g.DrawRectangle(mpen,Left, Top, Width, Height);
this.pictureBox1.Refresh();




}
你说的是这个意思吧。
小白晒太阳 2012-06-23
  • 打赏
  • 举报
回复
错误 1 “System.Drawing.Image”不包含“Left”的定义,并且找不到可接受类型为“System.Drawing.Image”的第一个参数的扩展方法“Left”(是否缺少 using 指令或程序集引用?) D:\360data\重要数据\我的文档\Visual Studio 2008\学习C#\picturebox坐标测试\WindowsFormsApplication3\Form1.cs 23 57 WindowsFormsApplication3
,不好意思,前几天太忙了没上CSDN,请问这是怎么回事。[Quote=引用 5 楼 的回复:]

不是,你画的相对于picturebox的坐标,由于图片和picturebox不一般大,画到图片上看起来就是缩小或者放大了,你只要将坐标改到和图片一致就可以了,我把代码给你
C# code

/// <summary>
/// 坐标缩放,返回符合图片大小的坐标
/// </summary>
/// <param name="r">画图……
[/Quote]
__天涯寻梦 2012-06-23
  • 打赏
  • 举报
回复
矩形要保留的图片上么,如果只是给用户看,那可以这样
注册 pictureBox1 Paint 事件
private bool drawRect = false;

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (drawRect)
{
Pen mpen = new Pen(Color.Red, 4);
e.Graphics.DrawRectangle(mpen, 330, 140, 50, 50);
}
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (e.X > 330 && e.X < 360 && e.Y > 140 && e.Y < 165)
{
drawRect = true;
this.pictureBox1.Invalidate();
}
}
美丽的鸡翅膀 2012-06-21
  • 打赏
  • 举报
回复
对了, 上面代码frmBackGround就是picturebox,
美丽的鸡翅膀 2012-06-21
  • 打赏
  • 举报
回复
不是,你画的相对于picturebox的坐标,由于图片和picturebox不一般大,画到图片上看起来就是缩小或者放大了,你只要将坐标改到和图片一致就可以了,我把代码给你

/// <summary>
/// 坐标缩放,返回符合图片大小的坐标
/// </summary>
/// <param name="r">画图框坐标</param>
/// <param name="x">画板宽</param>
/// <param name="y">画板高</param>
/// <param name="width">图片实际宽</param>
/// <param name="height">图片实际高</param>
/// <returns></returns>
private Rectangle ResizeRect(Rectangle r)
{
int Left = r.Left * frmBackGround.BackgroundImage.Width / frmBackGround.Width;
int Top = r.Top * frmBackGround.BackgroundImage.Height / frmBackGround.Height;
int Width = r.Width * frmBackGround.BackgroundImage.Width / frmBackGround.Width;
int Height = r.Height * frmBackGround.BackgroundImage.Height / frmBackGround.Height;
r = new Rectangle(Left, Top, Width, Height);
return r;

}
vingsa8352 2012-06-21
  • 打赏
  • 举报
回复
是不是绝对坐标和相对坐标的问题
美丽的鸡翅膀 2012-06-21
  • 打赏
  • 举报
回复
你是直接画在图上的,然后你的picturebox多半使用是图片伸展的属性吧,你画的坐标是相对于图片的坐标,而不是相对于picturebox的,要想相对于picturebox你就得将坐标进行一下转换,使其显示在图片上和picturebox上的一致(等比放大或者缩小)
crystal_lz 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

g.DrawRectangle(mpen,330, 140, 50, 50)
位置你都写死了,和什么偏差大?
[/Quote]
- -!、、你要表示淡定、、、万一楼主的关键不是这个呢!、、
__天涯寻梦 2012-06-20
  • 打赏
  • 举报
回复
g.DrawRectangle(mpen,330, 140, 50, 50)
位置你都写死了,和什么偏差大?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧