最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005。在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果。

于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数,但这里不理想是因为控件中中的元素很多),猜想大概每次更新,.Net底层都会更新重绘每个图元,所以速度会慢,造成闪烁。但是如果这样,使用双缓冲应该会有较好效果。再看代码,发现可能是更新动作太过频繁,于是降低速度,有所好转,但还是不行。

继续在网上查阅,最终找到一个方案比较合适。原来底层重绘每次会清除画布,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:

protected override void WndProc(ref Message m)

{

if (m.Msg == 0x0014) // 禁掉清除背景消息

return;

base.WndProc(ref m);

}

成功!

注:双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息。

附:一些尝试过但失败的记录

1)使用setStyle

网上有说使用setStyle函数去设置该控件的参数,具体为:

SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);

这三个选项参数后者是依赖前者的,必须并存,否则无效。并且这个函数本身是protected的,所以首先需要继承某控件再使用。

这个目标是跟前面正确解决方案一致,也是禁止清除背景并开启双缓冲,但需要使用用户绘制选项,而且是全部交由用户绘制。这需要自己实现控件的全部绘制,比较麻烦。所以这个方法不是完全不可行,但是需要额外工作量,不推荐。我也没有使用。

2)使用BeginUpdate和EndUpdate

这一对操作对于需要批量操作更新控件的情景有比较好的效果,比如初始化时批量添加了大量节点。坏处就在于不能即时更新。所以,对于频繁的更新节点并希望立即反映到界面的情况不适用。如果使用并且没有禁掉清除界面消息的话,则控件看起来就会不停的闪烁,而且以白底为主,内容几乎不可见(这个视频繁程度而定)。因为界面更新都在EndUpdate处完成,操作太多导致EndUpdate阻塞时间过长,且清空在先,更新在后,导致界面看起来长时间处于空白状态。

3)使用ControlStyles.EnableNotifyMessage选项

这个选项的作用和正确解决方案也是一致的。使用方法是:

SetStyle(ControlStyles.EnableNotifyMessage, true);

protected override void onNotifyMessage(Message m)

{

// 此处书写过滤消息代码

}

但是实际实验显示无效果,不知是什么原因,没有细究。

转载于:https://www.cnblogs.com/xhllxd/p/4418537.html

几个C#控件出现闪烁的问题的解决方案(转)相关推荐

  1. C#控件的闪烁问题解决方法总结

    最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005.在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果. ...

  2. Android控件点击圆形阴影反馈解决方案

    Android控件点击圆形阴影反馈解决方案 愿景 对于手机App而言,没有反馈效果的按钮使用体验是不舒服的.最近在深入学习Material Design,对其中的ripple效果比较感兴趣.我想着尝试 ...

  3. VS2010 自定义用户控件未出现在工具箱的解决方案

    VS2010 自定义用户控件未出现在工具箱的解决方案 参考文章: (1)VS2010 自定义用户控件未出现在工具箱的解决方案 (2)https://www.cnblogs.com/lyout/arch ...

  4. C# Winform 实现窗体无系统边框,但是具有系统边框的所有功能,同时保证控件不闪烁

    本人新手,想写个上位机,窗口能够实现最小化,最大化,拖动,改变大小等常用功能,Winform窗体的FormBorderStyle设置成sizable即可实现,但是窗体有自带的边框,不好看且无法编辑,想 ...

  5. WPF WrapPanel IsMouseOver 控制Visibility控件不停闪烁

    搜索问题,发现答案都是如果使控件闪烁的答案,最后去stackflow找答案,如果希望鼠标进入就显示控件,可以使用Opacity属性控制显隐. code: <WrapPanel.Resources ...

  6. Android 在onCreate()方法中获取控件宽高值为0解决方案

    大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view. ...

  7. java 动态加载控件_JS动态添加节点后渲染为EasyUI控件,EasyUI动态渲染解析解决方案...

    这是个小菜在实际工作中遇到的问题,相信很多EasyUI新手很可能也遇到这样的问题,因此小菜觉得有必要拿出来分享一下. 这个问题要从EasyUI的datebox组件说起,小菜用这个组件的时候,发现用$( ...

  8. android 关于listview scrollview 底部 控件无法显示的两个解决方案

    方案一 用LinearLayout实现,代码如下: <!-- 中奖纪录 by mhd --><LinearLayout xmlns:android="http://sche ...

  9. c#鼠标点击TextBox控件后清空默认字体-完美解决方案

    方案(一) 脚本: <script type="text/javascript" language="javascript">         // ...

  10. c#winform控件过多卡顿问题解决方案

    近期在项目中遇到了登录以及切换界面时,界面不停闪烁的问题,经过查阅发现以下方法可以成功解决该问题. 将下面代码添加到窗体代码中即可: protected override CreateParams C ...

最新文章

  1. 《The Coaching Booster》问与答
  2. 华为云春节前夕遭连续偷袭!密谋3个月,专挑凌晨断网
  3. SCOI2019AFO记
  4. XCTF easyCpp buu [MRCTF2020]EasyCpp
  5. 认证令牌_Java应用程序的简单令牌认证
  6. Careercup - Microsoft面试题 - 5428361417457664
  7. 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
  8. 学生使用计算机中怎么关机,学会正确开关机初中计算机教案
  9. JAVA 获取操作系统属性
  10. 不小心删除了系统的GRUB怎么办
  11. leetcode刷题:不同路径
  12. 参加东方道迩2010用户大会的归来总结
  13. 5寸照片尺寸_证件照尺寸及更换背景颜色教程
  14. 【ESP32】12.I2C LCD1602液晶显示实验(LiquidCrystal_I2C库)
  15. 蚂蚁集团IPO的小秘密:人均月薪5.5万,利润有望超中国石油
  16. Dreamweaver自带流体布局+自己添加,后附效果,不知代码有错误没?请行家指正!多谢先
  17. linux下ps、grep和kill联合使用杀掉进程
  18. S32K144烧写程序记录
  19. 计算机相关技术在医院应用,计算机管理相关技术在医院中的应用分析
  20. Linux磁盘对拷后无法开机,硬盘对拷后无法开机怎么办?

热门文章

  1. KNN——K nearest neighbor
  2. 【为了爱,为了pascal】【第三章】 认识PASCAL语言基础
  3. [转]C# 3.0入门系列(二)
  4. android 获取屏幕宽高
  5. “阿里味” PUA 编程语言火上GitHub热榜,标星1.9K!
  6. 牛逼!终于有人开源了一份基于SSM框架实现了支付宝支付功能的完整源代码......
  7. Redis深入之道:原理解析、场景使用以及视频解读
  8. 新年礼物 | 今天可以免费领取3980的Hadoop视频教程!
  9. 摩托android one手机图片,Motorola One都说外观像iPhone,但实际却不一样!
  10. 《算法图解》第五章 散列表 课后作业