GDI+绘图闪烁问题

myfan0707 2009-11-25 03:00:36
我在wince下绘图,试用了双缓冲技术:
1,在内存建一张图
2,把图画到图片上
3,把图片画到内存
结果闪烁情况有所减轻,但是在小范围移动图片的时候还是闪的厉害,不知如何解决?


...全文
257 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
myfan0707 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 weiletian 的回复:]
我在winc下做过这个,使用双缓冲只能减弱闪烁,不能完全消除。
不知你用来装载图片的控件是什么呢?最好用picturebox,因其重新加载图片时能把上一次的图片完全覆盖,能较好的减轻闪烁。
据我的理解,双缓冲是把静态图存储于内存中,每次绘制动态图并加载到内存中已有的静态图,最后把图片显示在控件中。
[/Quote]
我用的UserControl,充当画布
myfan0707 2009-11-26
  • 打赏
  • 举报
回复
有没有人做过呀?帮帮忙吧
weiletian 2009-11-25
  • 打赏
  • 举报
回复
我在winc下做过这个,使用双缓冲只能减弱闪烁,不能完全消除。
不知你用来装载图片的控件是什么呢?最好用picturebox,因其重新加载图片时能把上一次的图片完全覆盖,能较好的减轻闪烁。
据我的理解,双缓冲是把静态图存储于内存中,每次绘制动态图并加载到内存中已有的静态图,最后把图片显示在控件中。
angel6709 2009-11-25
  • 打赏
  • 举报
回复
这个@#¥%
真不知道该怎么整。指定是上面的过程,哈哈。看看
private BufferedGraphicsContext
private BufferedGraphics
是怎么实现的,自己做个。
myfan0707 2009-11-25
  • 打赏
  • 举报
回复
非常感谢angel6709,在精简框架下,很多东西是不支持的。不知还有其他办法没有?我的绘图过程是把要绘的图分为静态和动态,把静态图绘到图片上,把动态图绘到带有静态图的图片上,再把最终的图绘到内存。移动的过程因为不停的重绘所以闪的厉害,很郁闷啊
angel6709 2009-11-25
  • 打赏
  • 举报
回复
private Bitmap srcImage;
private Bitmap toDrawBeffor;
private Graphics gOfToDrawBeffor;
private Graphics gOfbuff;
private BufferedGraphicsContext ctx;
private BufferedGraphics bg;
private Graphics MyGraphics;

MyGraphics = panel1.CreateGraphics();
ctx = BufferedGraphicsManager.Current;
bg = ctx.Allocate(MyGraphics, new Rectangle(new Point(0, 0), panel1.Size));
gOfbuff = bg.Graphics;
toDrawBeffor = new Bitmap(panel1.Width,panel1.Height);
gOfToDrawBeffor = Graphics.FromImage(toDrawBeffor);
////////下面是你要做的
gOfToDrawBeffor.DrawLine(Pens.Blue, 0, 0, 1000, 1000);
//////上面是你要做的
gOfbuff.Clear(panel1.BackColor);
gOfbuff.DrawImage(toDrawBeffor, 0, 0);
bg.Render();
angel6709 2009-11-25
  • 打赏
  • 举报
回复
MyGraphics = panel1.CreateGraphics();
ctx = BufferedGraphicsManager.Current;
bg = ctx.Allocate(MyGraphics, new Rectangle(new Point(0, 0), panel1.Size));
gOfbuff = bg.Graphics;
toDrawBeffor = new Bitmap(panel1.Width,panel1.Height);
gOfToDrawBeffor = Graphics.FromImage(toDrawBeffor);
gOfToDrawBeffor.DrawLine(1,1,100,100);
gOfbuff.Clear(panel1.BackColor);
gOfbuff.DrawImage(toDrawBeffor, 0, 0);
bg.Render();
xg198804 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 myfan0707 的回复:]
引用 1 楼 xg198804 的回复:
采用图像复贴,不让它重绘,就是说把先前绘好的内存图像保存下来,移动的时候把保存好的图像复贴出来

这个思路我能明白,不知道如何实现?能否再详细跟我说下,不胜感激

[/Quote]
不好意思,我还只用过位块传输,双缓存,图像复贴还没有具体用过,你现在可能正要用到,可以借此查找一下资料一试,这是个不错的学习方法。
myfan0707 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xg198804 的回复:]
采用图像复贴,不让它重绘,就是说把先前绘好的内存图像保存下来,移动的时候把保存好的图像复贴出来
[/Quote]
这个思路我能明白,不知道如何实现?能否再详细跟我说下,不胜感激
xg198804 2009-11-25
  • 打赏
  • 举报
回复
采用图像复贴,不让它重绘,就是说把先前绘好的内存图像保存下来,移动的时候把保存好的图像复贴出来

111,122

社区成员

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

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

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