panel面板重绘闪烁是怎么回事

sis_ying 2008-12-01 08:35:32
在做c# winform程序的时候做个个贪吃蛇游戏,但是在调用Invalidate()和Update()方法触发paint事件重绘的时候窗体会闪烁,这是怎么回事呢,能通过什么方法使得不闪烁呢
...全文
477 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangqinggao 2011-02-15
  • 打赏
  • 举报
回复
楼主可解决了,这个我的也存在,而且很严重。

请求支援。
Sunferny 2008-12-03
  • 打赏
  • 举报
回复
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
surewy 2008-12-02
  • 打赏
  • 举报
回复
mark
jy251 2008-12-02
  • 打赏
  • 举报
回复
同意3楼的意见,但是.net 使用的 GDI+ 比起在VC中使用GDI来说,闪烁是大了点,我做过实验...

建议了双缓冲之后,一般的闪烁都不明显了,但是有的时候,你画的内容太多,或者图形太负责,也还是会有闪烁,这个地方是我认为GDI+ 做的反而不如GDI好的地方.
长沙三毛 2008-12-01
  • 打赏
  • 举报
回复
只绘制更新部分,Invalidate()函数可以带个Rectangle对象,这样闪动小点。
net5i 2008-12-01
  • 打赏
  • 举报
回复
搂主可以开启.NET 为我们实现的双缓冲:

添加到构造函数:

//开启双缓冲
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);

这样设置后就没太大问题了,如果还剧烈闪动,那就是搂主的绘制方法的改进了
sis_ying 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pp_shy 的回复:]
用双缓冲方法解决。
在内存中建立一个Bitmap对象,大小设置和你那个panel一样大。
把所有绘制操作首先呈现到内存缓冲区(也就是内存中的Bitmap中),而不是直接在panel上绘图。等所有绘制操作完成后,再把内存缓冲区(也就是Bitmap对象)直接绘制到panel上。
[/Quote]

具体代码如何实现呢
pp_shy 2008-12-01
  • 打赏
  • 举报
回复
用双缓冲方法解决。
在内存中建立一个Bitmap对象,大小设置和你那个panel一样大。
把所有绘制操作首先呈现到内存缓冲区(也就是内存中的Bitmap中),而不是直接在panel上绘图。等所有绘制操作完成后,再把内存缓冲区(也就是Bitmap对象)直接绘制到panel上。

110,538

社区成员

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

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

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