接受网友的建议,把问题重新描述如下,恳请各位大牛能给予解答。我使用的是c#2005,.net的版本是2.0
在form框体上添加一个picturebox组件,在picturebox组件中定义private Bitmap RefBackground()函数用来绘制表格,并返回bitmap,在自定义showcurve()函数中的定义中,使用在RefBackground()返回的bitmap上绘制数据曲线,绘制完毕后传递给picCurveShow.Image ,在form框体中添加一个按钮处理程序,之中用一个循环生成所需要的数据,数据是被添加在ARRAYLIST的对象中,每生成一组就调用一次showcurve(),以实现动态绘图。,showcurve()中也是从ARRAYLIST对象中读取数据绘图。
调试后发现背景图片显示正确,即在第一次调用showcurve()是成功的,然后点击按钮后发现图像并没有改变,也没有绘制数据曲线,调试中发现每次生成数据的确调用了showcurve(),并且数据的传递也是正确的,但是图形总是保持初始的状态。不知道是什么原因,难道要更改onpaint函数来实现图像的重绘吗,还是可以有其他的解决方法。不知这次是否将问题说清楚,感谢你的回复!多谢!!

解决方案 »

  1.   

    不是重绘的问题,重绘只是避免窗体变化时或窗体被其他窗体遮盖时,图象被遮盖。仔细检查下你的ShowCurve(),如果可以,建议LZ把主要代码发上来。
      

  2.   

    这是我的showcurve()的实现代码
    public void ShowCurve()
      {
       System.Drawing.Bitmap bitmap = this.RefBackground();
       System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap);
       graphics.TranslateTransform(this.coordinate, -this.coordinate);
       int i = 0;
         foreach (float Delay in picdata.m_Delay)
       {
           endPoint.Y = Delay;
           endPoint.X = (float)picdata.m_Datatime[i];
           graphics.DrawLine(new Pen(this.curveColor,this.curvePenWidth), PixelPoint(startPoint), PixelPoint(endPoint));
           startPoint = endPoint;
           i++;
       }
         this.picCurveShow.Image = bitmap;  
      }
    delay datatime是由按钮处理程序中的循环产生并添加到ARRAYLIST的对象m_Delay和m_Datatime中的。每添加一次就调用一次showcurve()。
      

  3.   

    好像是this.picCurveShow.Image = bitmap;  语句总是不执行,即第一次赋值后就不再改变了,是不是图像被锁定还是怎么回事,请大家帮忙看看啊!
      

  4.   

    经过测试你的代码(刚刚)this.picCurveShow.Image = bitmap;这里是执行的,但是
     graphics.DrawLine(new Pen(this.curveColor,this.curvePenWidth), PixelPoint(startPoint), PixelPoint(endPoint)); 
    看似没有执行。也就是说,你画的表格可以看得到,但是曲线你是看不到了!
      

  5.   


    public void ShowCurve()//画表格
            {
                Bitmap bitmap =new Bitmap("E:\\1.jpg");
                Graphics graphics = Graphics.FromImage(bitmap);
                graphics.DrawLine(Pens.Red, new Point(10, 20), new Point(100, 200));
                pictureBox1.Image = bitmap;            
            }
            public void ShowCurve2()//画线
            {
                Graphics gr = pictureBox1.CreateGraphics();
                gr.DrawLine(Pens.Red, new Point(10, 20), new Point(100, 200));        }
            private void button1_Click(object sender, EventArgs e)//测试画背景为表格
            {
                ShowCurve();
            }        private void button2_Click(object sender, EventArgs e)//测试有没有画线
            {
                ShowCurve2();
            } 
    按照上面的方法,测试下就知道哪个没运行了!
      

  6.   

    graphics.DrawLine(new Pen(this.curveColor,this.curvePenWidth), PixelPoint(startPoint), PixelPoint(endPoint)); 代码也是执行的,我把数据直接放在showcurve()中,即在初始化的时候就把数据装入,出来的图也可以看到数据曲线,说明程序在第一次装载完图形后,就不再更新了,即以后再更改bitmap,picturebox.image也不再更新了。难道是设置的问题?
      

  7.   

    已经解决,有两个问题导致程序不能正常运行
    1 在程序中使用了一个用户自定义控件,自定义控件的各项参数在curvecontrol中进行说明,在程序中调用一次自定义控件就会自动生成一个与此控件相联系的curvecontrol对象,如果要对控件做任何修改例如传递数据需要对这个对象进行修改,不能自己再定义一个curvecotrol对象
    2 在数据生成器中使用了sleep来阻塞线程,这是一个同步调用,会阻塞整个线程,导致动态画图失败。应该使用异步调用或是事件触发来动态生成数据
    感谢sjm2003对此问题的关注