接受网友的建议,把问题重新描述如下,恳请各位大牛能给予解答。我使用的是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函数来实现图像的重绘吗,还是可以有其他的解决方法。不知这次是否将问题说清楚,感谢你的回复!多谢!!
在form框体上添加一个picturebox组件,在picturebox组件中定义private Bitmap RefBackground()函数用来绘制表格,并返回bitmap,在自定义showcurve()函数中的定义中,使用在RefBackground()返回的bitmap上绘制数据曲线,绘制完毕后传递给picCurveShow.Image ,在form框体中添加一个按钮处理程序,之中用一个循环生成所需要的数据,数据是被添加在ARRAYLIST的对象中,每生成一组就调用一次showcurve(),以实现动态绘图。,showcurve()中也是从ARRAYLIST对象中读取数据绘图。
调试后发现背景图片显示正确,即在第一次调用showcurve()是成功的,然后点击按钮后发现图像并没有改变,也没有绘制数据曲线,调试中发现每次生成数据的确调用了showcurve(),并且数据的传递也是正确的,但是图形总是保持初始的状态。不知道是什么原因,难道要更改onpaint函数来实现图像的重绘吗,还是可以有其他的解决方法。不知这次是否将问题说清楚,感谢你的回复!多谢!!
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()。
graphics.DrawLine(new Pen(this.curveColor,this.curvePenWidth), PixelPoint(startPoint), PixelPoint(endPoint));
看似没有执行。也就是说,你画的表格可以看得到,但是曲线你是看不到了!
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();
}
按照上面的方法,测试下就知道哪个没运行了!
1 在程序中使用了一个用户自定义控件,自定义控件的各项参数在curvecontrol中进行说明,在程序中调用一次自定义控件就会自动生成一个与此控件相联系的curvecontrol对象,如果要对控件做任何修改例如传递数据需要对这个对象进行修改,不能自己再定义一个curvecotrol对象
2 在数据生成器中使用了sleep来阻塞线程,这是一个同步调用,会阻塞整个线程,导致动态画图失败。应该使用异步调用或是事件触发来动态生成数据
感谢sjm2003对此问题的关注