C#闪烁问题解决方法

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 15:06 点击:
自从米格的仁兄向我推荐C#之后,偶就误入歧途的渐渐脱离了Java阵营。最近在写工具的时候,忽然发现了一个老生常谈的闪烁问题,要知道这样的问题在Java Swing里只要把DoubleBuffer设置为true基本上是不会发生的,但在C#上却怎么也搞不定,竟然连双缓冲都有问题,GDI+不会这么脆弱吧。

  偶再一次被微软的花头给戏弄了,无奈只好踏上了漫漫搜索之路,也不知道搜了多少帖子,找了多少资料,基本上都是无功而返,更可气的是网上有些资料还骗人,偶试了试基本上都不行的,该闪的照样闪的欢。有些方法像脏矩阵一样要Invalide部分更新区域,偶嫌他麻烦,幸好偶找到了一篇文章,讲闪烁原理的,虽然偶过去自认为了解闪烁原理,比如什么刷新周期,显存之类的,不过偶还是耐着性子看了一遍,收获颇丰,看来孔夫子的温故而知新颇有道理!

  于是偶按照原理自己改起了代码,没想到还真让我给解决了。C#控件之所以会闪烁,是因为Refresh会把整个控件给清成背景色,然后再把图像绘制上去,就算先把所有待画的图像绘制到缓冲上,然后再Render到控件上,因为清屏时的颜色,相当于中间插了一空白帧,当刷新过快时也是会有闪烁的。

  偶的做法是:

  1.每帧控件创建一个Graphics,记得一定是CreateGraphics而不是通过Paint函数的那个参数e获得。

  2.把待绘制的图像绘制到缓冲上,缓冲大小为控件大小。

  3.刷新的时候调用Invalidate(new Rectangle(0, 0, 1, 1));

  4.在Paint函数绘制缓冲,搞定!

  哈哈,相信大家看了都会了解,Invalidate(new Rectangle(0, 0, 1, 1));相当于调用Paint函数,但却不重绘控件,这样中间那个空白帧就没有了,闪烁当然就消失啦!

  原理很重要啊很重要!

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 用C#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1