网页资讯贴吧知道视频音乐图片地图文库
进入贴吧全吧搜索吧内搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月14日漏签0天
c#吧 关注:137,565贴子:760,672
  • 看贴

  • 图片

  • 精品

  • 视频

  • 游戏

  • 17回复贴,共1页
<<返回c#吧
>0< 加载中...

【提问】关于winform 窗体Invalidate()或Refresh()的闪烁问题

  • 只看楼主
  • 收藏

  • 回复
  • g小乐g
  • c#爱好者
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我希望窗体每隔20毫秒就改变某些数据(如一些图形的位置),并根据这些数据让窗口刷新一次,抹掉旧图像,画上新图像。
我的方法是:放Timer组件,设置Interval为20,在Timer的Tick事件中更新一次那些数据,然后在一个缓冲Bitmap上把该画的都画好,然后this.Refresh()或者this.Invalidate()让窗体重绘,在窗体OnPaint事件中把缓冲区图像画上去。
结果是画面能更新,但窗体上的图形会频繁发生肉眼可见的闪烁,原因是什么?该怎么解决?
注:之前设置过this.SetStyle什么DoubleBuffered,无效果。
望各位告知,十分感谢。


  • g小乐g
  • c#爱好者
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
录了个GIF展示一下效果


  • TERA_ARISU
  • c#架构狮
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
以前耍winform碰到过闪烁问题,翻了一下,是用BufferedGraphics来解决
BufferedGraphics hostBuffer = new BufferedGraphics //自己管理这块缓冲用的画布
hostBuffer.Graphics.Clear(Form1.BackColor) //背景色刷一下
hostBuffer.Graphics.DrawImage(bmp1) //把你的图刷上去
hostBuffer.Graphics.DrawImage(bmp2) //把你的图刷上去
hostBuffer.Render(Form1.CreateGraphics) //最后再拱到窗体画布上
来wpf啦什么闪烁天生就不存在的


  • 沫漫黛
  • c#牛人
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
做iw?


  • Static274
  • c#码农
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Invalidate指定区域位置,不要每次都刷新控件,


  • sunyubokkkkk
  • c#砖家
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
闪烁是因为调用Refresh或Invalidate之后窗体就会绘制自身把你的绘图覆盖掉,然后才执行到你的OnPaint绘制代码,而系统将窗体内容显示出来的时间可能恰好在窗体绘制自身完成后,你的绘制执行完成前,因此导致闪烁。
另外,用DoubleBuffered,之前实测有效,不知你那为什么不行。。窗体的属性里直接有个DoubleBuffered,设为true即可。
再另外,,,用gm好好的咋跑这来了。。winform gdi+绘图效率很低的


登录百度帐号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 17回复贴,共1页
<<返回c#吧
分享到:
©2019 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示