在pictureBox的mouseMove事件里通过CreateGraphics绘图无效,但是换成用bitmap,然后pic.Image=bmp就是正常的,我在测试项目里是都可以的,但是在我们软件里就有这样的问题,不知道有没有人跟我一样的,因为我找了一天了也没找出来什么问题!C#GDI+Graphics绘图

解决方案 »

  1.   

    应该是有其他代码在刷新,把CreateGraphics画出来的东西给充掉了,屏蔽下其他代码调试下;
      

  2.   

    CreateGraphic是画在控件表面的,只要有遮挡或是控件大小等更新就会把刷掉可以考虑将代码写在Paint事件里
      

  3.   


    因为我在测试程序里再paint事件实时跟随鼠标移动绘图速度很慢,才在mouseMove时直接画的,代码很简单,我们程序里的那个pictureBox的更新更新已经关了,窗体也没有resize啊,我就是不明白为什么这样画不出来。
     private void pic1_MouseMove(object sender, MouseEventArgs e)
            {
                pic1.Invalidate();
                pic1.Update();
                Graphics gg = pic1.CreateGraphics();
                gg.DrawLine(new Pen(Brushes.Red), 0, intY, pic1.Width, intY);
                gg.DrawLine(new Pen(Brushes.Red), intX, 0, intX, pic1.Height);
            }
      

  4.   

    刚才代码里的intX,intY是代表e.X,e.Y,刚才复制时忘记改过来了。
      

  5.   

    代码上看不出异常,试试删除pic1.Invalidate();在不清屏的情况下看看它到底有没有绘制上去.
      

  6.   


    我刚刚试了,去掉Invalidate也是没画出来我的pictureBox开始赋的有背景图的,我在测试程序里也是模拟的有背景图,所以不应该是受背景图backGroundImage的影响的。
      

  7.   


            Pen pen = new Pen(Brushes.Red);        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                pictureBox1.Invalidate();
            }
            
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                var p = this.pictureBox1.PointToClient(MousePosition);
                e.Graphics.DrawLine(pen, 0, p.Y, pictureBox1.Width, p.Y);
                e.Graphics.DrawLine(pen, p.X, 0, p.X, pictureBox1.Height);
            }
      

  8.   

    看看pictureBox的父容器有没有什么刷新的代码,从而引起pictureBox被强制要求刷新。
      

  9.   


    我刚刚试了,在pictureBox的paint事件里加了监视,发现不执行invalidate时鼠标在上面也是在不停地触发paint,这应该就是问题所在(为什么会不停触发),我在测试程序里如果不执行invalidate,鼠标在pictureBox上时不触发paint的,我们的工程里的timer定时更新的我都已经屏蔽掉了,用的是MDI窗体,请问还有什么情况可以导致这样的呢?
      

  10.   

     private void pic1_MouseMove(object sender, MouseEventArgs e)
            {
                pic1.Refresh();
                Graphics gg = pic1.CreateGraphics();
                gg.DrawLine(new Pen(Brushes.Red), 0, intY, pic1.Width, intY);
                gg.DrawLine(new Pen(Brushes.Red), intX, 0, intX, pic1.Height);
            }
      

  11.   


    杠杆发现我的程序在invalidate(Refresh)之后paint重绘了一次,drawLine之后又重绘了一次,就是画完图之后自己又重绘了,所以没图,不知道为什么。
      

  12.   

    高手高手快来啊,现在的问题就是为什么draw了以后又自动重绘了,有哪些可能的原因呀,测试里是只有invalidate后才执行了一次重绘