我要实现的效果是在picTureBox的mouseMove事件绘制十字光标,因为试了各种办法都有延迟感,所以现在另一种思路,就是在mouseMove时Inivalidate,然后画光标,用到的是e.X,e.Y,但是我在别处又要通过PointToClient(MousePosition)获取鼠标位置,和mouseMove时的位置相比较,却发现Inivalidate后通过这两种方式获取的点是不一样的,求大神帮忙解决!!!  private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {            
            this.pictureBox1.Invalidate();      
            Graphics g = pictureBox1.CreateGraphics();            Rectangle rec = new Rectangle(5, 5, 200, 25);
            g.DrawRectangle(new Pen(Color.Red), rec);            Pen pen = new Pen(Brushes.White);
            g.DrawLine(pen, 0, e.Y, this.Width, e.Y);
            g.DrawLine(pen, e.X, 0, e.X, this.Height);            this.pictureBox1.Update();//立即更新
            Application.DoEvents();
         
            Point p = myPanel1.PointToClient(MousePosition);//这时这个点和e.X,e.Y不一样            
            Console.WriteLine("Mousemove客户区位置 X=" + p.X + " Y=" + p.Y);
            Console.WriteLine("Mousemove赋值前e.X=" + e.X + "  lastX=" + lastX + "  e.Y=" + e.Y + "  lastY=" + lastY + "  remain=" + remained.ToString());
        }
c#GDI+十字光标重绘鼠标位置

解决方案 »

  1.   

    你要先保证PbBox里面的图片没有缩放过,把PirtureBox的SizeMode属性设置为Normal再取坐标试试看
      

  2.   

    本来那两种方式获取的点是一样的,如果不执行Invalidate重绘,执行重绘后就不一样了,因为我现在家里电脑还没有vs环境,暂时也不能试,是不是Invalidate后PictureBox发生什么变化了才导致的呢,但是只是重绘啊。
      

  3.   

    当然不一样啊、你在PicBox的MouseMove事件取的是PicBox的XY坐标,并不是图片的实际坐标,如果你的图片有缩放过的话,两者的坐标是不一样的,这个你自己测试下就知道了
      

  4.   


    那个SizeMode属性默认的就是Normal啊,我也没修改它。在MouseMove事件里用e.X e.Y获取的是鼠标在pictureBox里的位置啊。
      

  5.   

    我在mouseMove时使用e.X,e.Y获取鼠标位置绘制十字游标是正常的,游标也是紧跟鼠标的,就是使用PointToClient(MousePosition)获取鼠标位置不一样,应该是PointToClient(MousePosition)这种方法获取鼠标在picTureBox位置不准确,那么请问不在mouseMove事件里怎么获取鼠标在pictureBox上的位置呢?
      

  6.   


    这样啊、那我就不太清楚了,要不你按照PointToClient(MousePosition)取的坐标调整下
      

  7.   


    我现在不用PointToClient(MousePosition)了,用另一种思路了。