首先介绍下背景吧,问题如题,这个问题应该说困扰我大半年了(不是说我没有请教大佬,不是说我没有上网查过,之前在搜索时,总是没有解决此问题~~),直到最近一次在在优化代码时,再次上网查找,在发现搜索词条”C#控件闪烁问题“,才有了下文。额额额,于是我记录了下面得到片段。

对于TreeView节点可以动态创建,而且数量还很大的时候,我们给其设置什么双缓冲,使用EndUpdate操作啥的,都是没有效果的。使用了下面的代码即可解决问题;

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

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

protected override void WndProc(ref Message m)

{

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

return;

base.WndProc(ref m);

}

成功!

注意了,注意了,这里其实不只是TreeView控件有闪烁问题,在C#中只要控件的内容数量大,都会存在闪烁。产生闪烁原因如下:

  Windows在窗口的具体绘制之前,会发送WM_ERASEBKGND消息通知该窗口檫除背景。默认情况下,会以窗口的默认背景色清除窗口。

WM_ERASEBKGND消息和WM_PAINT消息的另外一种含义:背景色与前景色

可以这样理解WM_ERASEBKGND消息和WM_PAINT消息:

1.WM_ERASEBKGND消息用于通知系统或者程序员绘制背景色
          2.WM_PAINT消息用于通知程序员绘制前景色,比如在WM_PAINT中调用TextOut函数输出文本

详情可以看看这位网友的:https://blog.csdn.net/analogous_love/article/details/50039467

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

附:一些尝试过但失败的记录(下面的方法我没有尝试)

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)

{

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

}

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

上面转载网友的!仅为记录下。

C#关于TreeView树在节点数较多时总是会出现闪烁的问题方法记录的更多相关文章

  1. 初始化bootstrap treeview树节点

    最近在做启明星图库时,使用了Jquery Bootstrap  Treeview插件.但是,遇到了一个初始化的问题.先看效果如下: 当用户打开图库时,左边分类第一个类别是“所有分类”,默认需要选中. ...

  2. TreeView 树节点的处理

    TreeView 树节点的处理 using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  3. winform中生成TreeView树

    无论是webform还是winform,TreeView都是常用功能.使用递归方法很方便. 下面分享一个小实例. 数据库中3个字段,分别是:ID,itemType_name,itemType_PID ...

  4. WinForm控件TreeView 只部分节点显示 CheckBox

    WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...

  5. C++计算二叉树的节点数和高度

    用struct结构体的写法: /* * description: 计算二叉树的层数和节点数 * writeby: nick * date: 2012-10-23 16:16 * */ #include ...

  6. Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】

    题目链接:http://codeforces.com/problemset/problem/509/F 题意: 告诉你遍历一棵树的方法,以及遍历节点的顺序a[i],长度为n. 问你这棵树有多少种可能的 ...

  7. ztree树 叶子节点路径的集合

    1.Question Description: ztree树各个节点都带有路径,如“/根节点”,"/根节点/一级节点",“根节点/一级节点/二级节点‘; 现在想获取所选的最末级节点 ...

  8. 获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点

    //获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点 $(function () { $('.easyui-tree') ...

  9. zTree实现删除树子节点

    zTree实现删除树子节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</tit ...

随机推荐

  1. 01 JVM 从入门到实战 | 什么是 JVM

    什么是 JVM 先来看下百度百科的解释: JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算 ...

  2. Solr 16 - 增删改Solr中索引数据的几种方式 (在URL上或Web页面中操作)

    目录 1 添加/更新索引数据 1.1 JSON格式的操作 1.2 XML格式的操作 2 删除索引数据 2.1 删除符合特定条件的数据 2.2 删除指定ID的数据 2.3 删除全部索引数据 3 在doc ...

  3. GoLang simple-project-demo-01

    Hello world 经典例子: package main import "fmt" func main(){ fmt.Println("hello world&quo ...

  4. 关于C# 中的布尔运算符 "&" "|” 与 其类似的条件布尔运算符 "&&" "||" 区别说明。

    运算符使用说明如下:  分隔符 ———————————————————————————— 分隔符 ———————————————————————————— 上述两个运算符的结果与&和 | 完全 ...

  5. SpringBoot打包项目成war包,并部署到服务器的tomcat上

    最近遇到项目需要上线部署到服务器,需要讲自己的SpringBoot项目打包成war包,部署到tomcat上. 下面记录下打包部署的过程. (1) 将SpringBoot项目打包成war包, 一.修改打 ...

  6. 【转】使用MySQL处理百万级以上数据时,不得不知道的几个常识

    ---------------------------------------------------------------------------------------------------- ...

  7. 对HTML5标签的认识(三)

    这篇随笔继续来认识HTML标签.这次随笔主要是对<table>标签的认识和最近我学习到的一些标签来和大家分享. 一.<table>标签 <table>标签的作用主要 ...

  8. windows系统 docker + swoole 操作

    之前文章讲过在windows系统安装 cgywin 从而安装swoole扩展的操作,但是安装cgywin的时候会出现这样那样的问题.所以今天记录下另一种方式使用docker 安装 swoole 环境! ...

  9. qsv文件转码mp4格式过程记录

    之前帮一个朋友剪辑配音视频,源文件在爱奇艺里,特有的qsv格式让我白忙活一下午. 晚上趁着有空,在网上查找资料,翻阅了很多文件,都让我无从下手. 基本都是一个套路,转成fiv格式,再转mp4格式,但是 ...

  10. K3实现按虚拟件/组件发料

           最近公司调度部反应了一个K3使用过程中遇到的巨大问题:公司成品BOM组成物料种类破千,绝大部分还不能拆分成组件.为了方便区分,从逻辑上把一堆堆的半成品分成了一个个虚拟件.K3生成的投料单 ...