日期:2014-05-18  浏览次数:20878 次

老话重提:如何解决控件闪耀问题?
最近由于软件需要做了一个虚拟键盘,于是使用了大概100多按钮控件,但是在SHOW时控件老是闪耀,使用双缓冲也不能解决问题!!用VB做了一个虚拟键盘控件在C#使用反而不闪(!#$#^%$^&%&),到底要如何做才能在winform遇到大量使用控件是界面不闪耀?

//传说中的方法(不过依然闪耀)
  SetStyle(ControlStyles.ResizeRedraw, true);
  this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
  this.SetStyle(ControlStyles.UserPaint, true);
  this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
  this.UpdateStyles();


------解决方案--------------------
楼主为何不先搜索下呢
http://topic.csdn.net/t/20060601/18/4794615.html
------解决方案--------------------
防止闪烁的ListView显示方案
remex 著于2007-10-5 18:01:16
相信做Win Form程序的朋友们一定遇到过在ListView中插入数据时,界面上一直在闪烁,而且速度很慢的情况吧。究其原因,还是在Windows消息机制没有使用好的原因。
------解决方案--------------------
自己使用覆盖重绘,不用双缓冲,就应该不会闪了吧,现在机器快,不一定非用双缓冲不可,
------解决方案--------------------
帮顶
------解决方案--------------------
液晶显示器,你用什么技术也根治不了.Net的闪烁,只能减轻。

换成普通显示器,随便用个双缓就Ok...

==================================================================
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
优惠接单开发,组件控件定制开发,成品源代码批发
联系方式:Q66840199 全天在线
==================================================================
------解决方案--------------------
控件较多时无论如何是会闪烁的,不如用画的,画再多的按钮也不会闪烁,只要处理好region就可以控制了
------解决方案--------------------
用panel控件,直接在里面paint
------解决方案--------------------
老大,你不要使用“100多按钮控件”,你应该自己在一个控件上,绘制 100 多个矩形,然后自己处理鼠标、键盘等事件。
------解决方案--------------------
控件较多时无论如何是会闪烁的
------解决方案--------------------
自已绘制吧...
------解决方案--------------------
是不是重绘的问题,以前是遇到对Commbox添加和删除的时候,控件在闪动。解决方法是在对Commbox数据修改的时候把空间的重绘关闭,修改完了再执行重绘。就没有闪动了。看对你有没有帮助。
------解决方案--------------------
想办法把100多按钮控件变成1个控件吧
------解决方案--------------------
啊?可以吗?
------解决方案--------------------
这个问题我也碰见,13楼的方法是个不错的解决方案
只要动手写,实现起来也不是很难
------解决方案--------------------
100多个按钮控件自己管自己刷新,再怎么双缓存也会闪,只有自己画。

至于复杂,可以有取巧的方法,自己写一个按钮控件(不能从Usecontrol继承,否则一样闪),实现绘制,处理鼠标,键盘操作。

然后由一个统一控件集合进行管理,在绘制的时候保证所有的控件在同一时候刷新,就可以解决问题了
------解决方案--------------------
资源手头也没有,我的意思是如果你觉得在1个窗口上画100多个矩形,处理鼠标消息太麻烦的话,你可以实现一个画矩形,处理键盘,鼠标消息,提供事件的类(Graphic对象,消息句柄就使用父容器的,可以在创建的时候得到,这样就等同于一个控件),然后由一个统一的集合类管理,在父容器的Panit事件中统一刷新

不能每个控件自己接收Paint消息,自己刷新 ,这样控件多了必定会闪的。
------解决方案--------------------
设置双缓冲只是对控件本身的绘制起作用,而对其所有的子控件及父控件不产生任何影响。

这就像个大会堂,每个人都在说话,声音会非常乱,只有一个人说话声音就会很清晰。

所以减少或消失闪的跟本解决方法只有减少控件数量,哪所这个控件占的区域非常大,但是也会由于使用了双缓冲而快速的完成操作。

因此,楼主可以去掉那些“没用”的按钮或控件,而是使用一个Control,且在其Paint事件里能过Graphic来进行绘制,这样双缓冲就会起作用而没有闪的情况发生了。