关于网友提出的“C#动态画图关于bitmap设为背景防止闪烁的问题”问题疑问,本网通过在网上对“C#动态画图关于bitmap设为背景防止闪烁的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:C#动态画图关于bitmap设为背景防止闪烁的问题
描述: 之前请教论坛各位,尝试了drawline画图,因为我是从串口10ms读入一个数据,这样每次画图时虽然画上了新点与旧点,但是闪烁的很厉害。看了很多人的例子。认为先画一段,然后将其当为背景,再在背景上画新的一段,再次将图当为背景,以此类推。
现在有个问题是:如果不dispose背景的画,那么就是层层背景叠加,然后显示out of memory的错误。
下面代码在wince开发板上运行没错,但是只画出第一条线;然而当我用button控件打开第二个form窗体,再关掉第二个窗体,回来看时,又出现了后面的线段,每次打开第二个窗体,再回来就出现一个线段。因为第二个窗体并没有与第一个窗体有什么联系。
所以我怀疑,打开第二个窗体再回来的机制是不是一次清理背景内存的操作呢?
刚接触这些,希望有人帮忙解答。
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
x[0] = 5;
y[0] = 50;
x[1] = 10;
y[1] = 70;
Bitmap bmp = new Bitmap(pictureBox1.Image);
pictureBox1.Image.Dispose();//??这里我不清楚对不对,但是不清理的话就会超出内存。
Graphics g = Graphics.FromImage(bmp);
Pen mypen = new Pen(Color.Red, 1);
g.DrawLine(mypen, x[i - 1], y[i - 1], x[i], y[i]);//一些其他的数据时timer控件每10ms给的
mypen.Dispose();
g.Dispose();
pictureBox1.Image = bmp; // 设置为背景层
}
解决方案1:
1,“好像是没有线程这个东西?”
线程是哪里模拟你那里接受串口数据的,不需要,你只要在你接受到串口数据了传给addPoint就行了,
2,“我尝试用timer”
既然不需要那个线程,你也不用尝试用timer了
3,“picturebox等一些控件找不到双缓冲的属性”
我这示例代码就是在比较粗糙的实现双缓冲,不用管picturebox是否有双缓冲
4,“bmp释放的话,那不就没有画图的地方了么,想请教一下具体怎么个释放法”
不释放啊,双缓冲的缓冲图不需要释放,我的示例代码也没释放呀,你之所以会内存溢出就是因为每次都创建图片,10ms一次的频率太高了导致内存释放不及时;
解决方案2: 你先把点放进List里,再定时绘制,而不用每收到一个数据都绘制一遍,人眼根本看不清,没有必要这样干
以上介绍了“C#动态画图关于bitmap设为背景防止闪烁的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1127859.html