我用 //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)是对应点击的鼠标值.

解决方案 »

  1.   

    g.DrawRectangle(mpen,330, 140, 50, 50)
    位置你都写死了,和什么偏差大?
      

  2.   

    你是直接画在图上的,然后你的picturebox多半使用是图片伸展的属性吧,你画的坐标是相对于图片的坐标,而不是相对于picturebox的,要想相对于picturebox你就得将坐标进行一下转换,使其显示在图片上和picturebox上的一致(等比放大或者缩小)
      

  3.   

    不是,你画的相对于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;        }
      

  4.   

    对了, 上面代码frmBackGround就是picturebox,
      

  5.   

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

  6.   

                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();
                
                
                
                
                }
    你说的是这个意思吧。
      

  7.   

    矩形要保留的图片上么,如果只是给用户看,那可以这样
    注册 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();
        }
    }
      

  8.   

    原先代码是从 Graphics.FromImage(pictureBox1.Image) 图片上创建画布,图片在 PictureBox 上显示时可能有拉伸缩放,绘画上去的矩形也会被拉伸缩放,坐标就不准确了