Microsoft  CSIP   WindowsMobile   MEDC   合作伙伴   体验中心 设为首页 加到收藏夹

 
登录       点击换一张     注册新用户 找回密码

.Net Compact Framework下的绘图闪烁解决方案
2008年10月13日10:19   编辑:cppguy 来源: 博客 浏览: 275

 

1:缓冲贴图

   //重新绘制的函数  

     void Redraw()
       {

           //直接从窗体取得Graphics
           Graphics g = this.CreateGraphics();
           Redraw(g);
           g.Dispose();
       }
      //缓冲图以及操作缓冲图所需要的设备上下文

       Bitmap tempBitmap;
       Graphics tempGraphics;
       void Redraw(Graphics g)
       {
           if (tempBitmap == null)
           {
               tempBitmap = new Bitmap(this.Width, this.Height);
               tempGraphics = Graphics.FromImage(tempBitmap);
           }

           //在这里对缓冲图进行重新绘制
           DrawTempBitmap(tempGraphics);

          //将缓冲图直接贴到窗体上
           g.DrawImage(tempBitmap, 0, 0);
       }

      可以看到Redraw中的窗体Graphics是从窗体直接获得的,并不是从PaintEvent中得到的,这样的好处是,既可以在系统要求重绘的时候(比如出现窗体的切换,遮挡)在Onpaint中直接调用Redraw,而且在本窗体的业务功能运行中(比如出现图形的变换,擦除等等),要求主动绘制,也可以直接调用。

2:摒弃无效刷新

     一个区域,比如RECT,正常情况下是在活动窗口中的,你可以直接看的到,如果上面有一个窗口把这个区域覆盖了,那么这个区域就不是有效的了.变成无效的区域了.对于WINDOWS操作系统以及WinCE来说,当一个无效区域要面对用户的时候,它就会自动调用OnPaint进行刷新,用内存中的内容重新在界面上显示.使你看到的总是有效区域.   造成无效区域的方法很多,比如窗口覆盖,拖动,等等,如果你项强制你的区域刷新,比如你已经在这个区域更换了一幅图片之类.那么把这个要刷新的区域设置成无效区域,WINDOWS就会自动帮你刷新了。

     实现无效刷新,我们经常用到this.Invalidate(Rectangle),这个函数,可是,在.NETCF下,这个函数的重载实现并不完美,效率也很低,被设定的无效区域Rectangle,会有很明显的闪烁(首先被涂白,然后再绘制),比较起使用1方法的直接重贴缓冲图,后者基本没有闪烁,用户体验更好。

     另外频繁的this.Invalidate或者通过this.refresh,被动的激活系统来进行重新绘制,往往会产生win32501Exception的系统异常,所以对于图形变换比较频繁的系统来说,尽量应该摒弃掉无效刷新这种方式。

发表评论
评论标题 :
评论内容 :

    查看评论

请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。 本站拥有管理笔名和留言的一切权利。
相关文章推荐
· .Net Compact Framework 基础篇-- Exception 2008-8-5  AppleSeeker
· .NET Compact Framework 中的消息处理 2008-7-30  MSDN
· Delphi for .NET Compact Framework Preview Quickstart Guide - By David Clegg 2008-7-16  David Clegg
· 基于.NET Compact Framework的九宫格控件 2008-7-16  JustDI
· 在.NET Compact Framework中设置webservice的session状态 2008-6-4  黄季冬

  

论坛推荐  
热点活动
更多»

© CSIP 信息产业部软件与集成电路促进中心 All Rights Reserved 版权所有 京ICP备06020771号
联系电话:010-63951881-8003 王先生        邮件:wangj@csip.org.cn