关于动态作图闪烁与bitmap的释放问题。

雨雨雨儿 2015-08-20 03:48:12
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);

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; // 设置为背景层
bmp.Dispose();//这里有问题,就是如果释放了bmp的话,下次再新建bmp也不行了,调试报错就是 如果试图操作已 //释放的对象(如已关闭的流或注册表项),则会引发 ObjectDisposedException 异常。
}


如果不释放bmp就会报错超出内存。
请教一下这里怎么解决这个问题,
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨雨雨儿 2015-08-21
  • 打赏
  • 举报
回复
求助啊,为什么bmp.Dispose();后再新建bmp都不行么?
_lee_chong 2015-08-21
  • 打赏
  • 举报
回复
引用 7 楼 lgfccc 的回复:
[quote=引用 6 楼 lc316546079 的回复:] 好像之前不是问过么,可以自己实现双缓冲呀, 而且picturebox是有doublebuffer的,所有的control都有,可以通过继承后重写或者反射来开启所有control的双缓冲
vs2005,C#在wince开发板上的应用程序,木有doublebuffer[/quote] 饿,没有就自己实现呀, http://bbs.csdn.net/topics/391812920 这个帖子里不是给过你示例代码了么; 另外那示例代码里的线程只是我拿来模拟你那里的串口数据的呀,在你那里肯定不用开什么线程了。。。
雨雨雨儿 2015-08-21
  • 打赏
  • 举报
回复
引用 6 楼 lc316546079 的回复:
好像之前不是问过么,可以自己实现双缓冲呀, 而且picturebox是有doublebuffer的,所有的control都有,可以通过继承后重写或者反射来开启所有control的双缓冲
vs2005,C#在wince开发板上的应用程序,木有doublebuffer
_lee_chong 2015-08-21
  • 打赏
  • 举报
回复
好像之前不是问过么,可以自己实现双缓冲呀, 而且picturebox是有doublebuffer的,所有的control都有,可以通过继承后重写或者反射来开启所有control的双缓冲
雨雨雨儿 2015-08-21
  • 打赏
  • 举报
回复
引用 4 楼 crystal_lz 的回复:
[quote=引用 3 楼 lgfccc 的回复:] [quote=引用 2 楼 crystal_lz 的回复:] 为什么一定要把图 绘制到一个 bmp 然后又把 bmp 给picturebox 的 image 下次 又去提取 不是很麻烦吗

private void picturebox1_paint(object sender,PaintEventArges e){
    Graphics g = e.Graphics;
    g.DrawXXXX //直接就在picturebox上面绘图了。。。
}
这样会闪烁的不行,所以才想画一段作为背景,下次在背景上画下一段,这样的话就只有新出来的一段线段在不断更新,而不是之前所有的线段都在闪烁[/quote] 你确定这样会闪? picturebox 是有做双缓冲处理的 你的 x 是非局部变量 y 和 i 也是 所以我也不知道你要搞什么 [/quote] 。。。。肯定闪啊 ,不然我跑过来求助什么?我用vs2005在wince上做一个动态显示波形,分析的应用,没有doublebuffer的属性,
crystal_lz 2015-08-21
  • 打赏
  • 举报
回复
引用 3 楼 lgfccc 的回复:
[quote=引用 2 楼 crystal_lz 的回复:] 为什么一定要把图 绘制到一个 bmp 然后又把 bmp 给picturebox 的 image 下次 又去提取 不是很麻烦吗

private void picturebox1_paint(object sender,PaintEventArges e){
    Graphics g = e.Graphics;
    g.DrawXXXX //直接就在picturebox上面绘图了。。。
}
这样会闪烁的不行,所以才想画一段作为背景,下次在背景上画下一段,这样的话就只有新出来的一段线段在不断更新,而不是之前所有的线段都在闪烁[/quote] 你确定这样会闪? picturebox 是有做双缓冲处理的 你的 x 是非局部变量 y 和 i 也是 所以我也不知道你要搞什么
雨雨雨儿 2015-08-21
  • 打赏
  • 举报
回复
引用 2 楼 crystal_lz 的回复:
为什么一定要把图 绘制到一个 bmp 然后又把 bmp 给picturebox 的 image 下次 又去提取 不是很麻烦吗

private void picturebox1_paint(object sender,PaintEventArges e){
    Graphics g = e.Graphics;
    g.DrawXXXX //直接就在picturebox上面绘图了。。。
}
这样会闪烁的不行,所以才想画一段作为背景,下次在背景上画下一段,这样的话就只有新出来的一段线段在不断更新,而不是之前所有的线段都在闪烁
crystal_lz 2015-08-21
  • 打赏
  • 举报
回复
为什么一定要把图 绘制到一个 bmp 然后又把 bmp 给picturebox 的 image 下次 又去提取 不是很麻烦吗

private void picturebox1_paint(object sender,PaintEventArges e){
    Graphics g = e.Graphics;
    g.DrawXXXX //直接就在picturebox上面绘图了。。。
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧