C#在Form中动态显示gif
C#在Form中填充一个panelMain,现有2个用户控件ucLoad(label的image为gif),ucInfo(数据加载得一段时间),希望点击一个按钮后,pan...
C#在Form中填充一个panelMain,现有2个用户控件 ucLoad(label的image为gif),ucInfo(数据加载得一段时间),希望 点击一个按钮后,panelMain添加ucLoad 显示一个动态的加载画面,待ucInfo加载完了显示的是 ucInfo. 我用单线程做的话 ucLoad无法显示,画面显示panelMain的backgroundimage一会后直接显示的ucInfo,没有过程。 多线程做的话2个控件切换过程完全不是预期的想要的效果,请问怎么解决??
展开
2个回答
展开全部
在DotNET中有一个ImageAnimator类,动画处理包含基于时间的帧的图像,这样的在C#中就不需要加载一组图片了,一个Gif轻松搞定,程序也干净很多。
ImageAnimator类
这个类非常简单,主要有几个方法
1)Animator,启动一个多帧的图片,开始动画显示。这里需要制定一个回调函数onFrameChangedHandler,当图片内部间隔时间达到时触发,通常在这个回调函数中刷新界面,显示下一帧图片。特别强调一点,可能ImageAnimator内部用线呈池的定时器检查时间间隔,所以该回调函数触发时,不在程序的主线程中,要注意同步的问题。 2)CanAnimator方法,判断图片是否是动画图片。
3)StopAnimator方法,比较简单,就是停止正在运行的动画。
4)UpdateFrame方法,使该帧在当前正被动画处理的所有图像中前移。新帧在下一次呈现图像时绘制。如(1)所述onFrameChangedHandler不是在主线程中被触发,所以利用这个事件调用UpdateFrame时一定要考虑同步,如果在绘制图片的同时调用UpdateFrame,或者在调用UpdateFrame时绘制图片都会产生资源冲突的异常。所以建议UpdateFrame和绘制图片的动作都在主线程中去执行。
最后还有一点注意事项:动画图片的绘制可能会比较频繁,由此造成闪烁,解决办法有两个:
1)不要调用this.Invalid()重绘整个窗口,而应该调用this.Invalid(rect)仅绘制显示图形的区域。
2)指定一下窗口风格,启动窗口的双缓存
源码:
http://blog.sina.com.cn/s/blog_6e110f480101dul7.html
ImageAnimator类
这个类非常简单,主要有几个方法
1)Animator,启动一个多帧的图片,开始动画显示。这里需要制定一个回调函数onFrameChangedHandler,当图片内部间隔时间达到时触发,通常在这个回调函数中刷新界面,显示下一帧图片。特别强调一点,可能ImageAnimator内部用线呈池的定时器检查时间间隔,所以该回调函数触发时,不在程序的主线程中,要注意同步的问题。 2)CanAnimator方法,判断图片是否是动画图片。
3)StopAnimator方法,比较简单,就是停止正在运行的动画。
4)UpdateFrame方法,使该帧在当前正被动画处理的所有图像中前移。新帧在下一次呈现图像时绘制。如(1)所述onFrameChangedHandler不是在主线程中被触发,所以利用这个事件调用UpdateFrame时一定要考虑同步,如果在绘制图片的同时调用UpdateFrame,或者在调用UpdateFrame时绘制图片都会产生资源冲突的异常。所以建议UpdateFrame和绘制图片的动作都在主线程中去执行。
最后还有一点注意事项:动画图片的绘制可能会比较频繁,由此造成闪烁,解决办法有两个:
1)不要调用this.Invalid()重绘整个窗口,而应该调用this.Invalid(rect)仅绘制显示图形的区域。
2)指定一下窗口风格,启动窗口的双缓存
源码:
http://blog.sina.com.cn/s/blog_6e110f480101dul7.html
参考资料: http://tech.it168.com/oldarticle/2006-08-30/200608301601224.shtml
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询