转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42265209

CTreeViewUI里面自带了复选的功能,但是复选功能存在bug:

1)当一个分组下面存在子项时,子项被手动全选后,分组的复选框没有自动变为选中状态

2)当一个分组下面存在子项时,当所有子项都取消选中状态时,分组的复选框还是选中状态

分组的CTreeNodeUI控件应该自动判断是否为选中状态,bug被修复后的效果如下:

修复过程:



当某个复选框被单击后会触发CTreeViewUI控件的OnCheckBoxChanged函数,这时应该在这里做出判断,来决定分组的选中状态,为此我给CTreeNodeUI控件增加了IsAllChildChecked函数。

修改后的OnCheckBoxChanged函数如下:

	bool CTreeViewUI::OnCheckBoxChanged( void* param )
{
TNotifyUI* pMsg = (TNotifyUI*)param;
if(pMsg->sType == _T("selectchanged"))
{
CCheckBoxUI* pCheckBox = (CCheckBoxUI*)pMsg->pSender;
CTreeNodeUI* pItem = (CTreeNodeUI*)pCheckBox->GetParent()->GetParent();
SetItemCheckBox(pCheckBox->GetCheck(),pItem); if(pItem->GetParentNode() != NULL) //edit by:Redrain 2014.12.11
pItem->GetParentNode()->IsAllChildChecked(); return true;
}
return true;
}

当某个复选框被单击后,去通知他的父控件,让父控件判断是否应该是选中状态。为CTreeNodeUI控件增加的IsAllChildChecked函数如下:

	void CTreeNodeUI::IsAllChildChecked()
{
bool bIsAllChildChecked = true;
bool bIsAllChildUncheck = true;
int nCount = GetCountChild();
if(nCount > 0)
{
for(int nIndex = 0;nIndex < nCount;nIndex++)
{
CTreeNodeUI* pItem = GetChildNode(nIndex);
if(!pItem->GetCheckBox()->IsSelected())
{
bIsAllChildChecked = false;
}
else
{
bIsAllChildUncheck = false;
}
}
if (bIsAllChildChecked && !GetCheckBox()->IsSelected())
{
GetCheckBox()->Selected(true);
return;
}
else if (bIsAllChildUncheck && GetCheckBox()->IsSelected())
{
GetCheckBox()->Selected(false);
return;
} } }

总结:



bug的修复代码已经提交到我自己的Duilib库。

我的Duilib库代码下载地址:点击打开链接

  Redrain  2014.12.30

duilib 修复CTreeViewUI复选功能判断不准确的bug的更多相关文章

  1. Flex 扩展combobox 实现复选功能

    前段时间,老大召唤,给个任务,研究一下flex的combobox控件 实现复选功能(flex自带的combobox控件不可以复选),小兵能力有限,哪里可以扩展呀,网上看了别人写的,发现总是有点瑕疵(关 ...

  2. QComboBox实现复选功能

    需求: 下拉列表有复选功能 不可编辑 显示所有选中项   关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + ...

  3. QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

    今天介绍一下一个小东西 — 如何让QComboBox实现复选功能?   需求: 下拉列表有复选功能 不可编辑 显示所有选中项   关于QComboBox的复选功能有几种方案: QStandardIte ...

  4. QT 创建一个具有复选功能的下拉列表控件

    最近研究了好多东西,前两天突然想做一个具有复选功能的下拉列表框.然后在网上"学习"了很久之后,终于发现了一个可以用的,特地发出来记录一下. 一.第一步肯定是先创建一个PROJECT ...

  5. 在QComboBox的基础上实现复选功能

    这个是最近的一个项目上需要实现的功能.要求如下: 下拉列表的项目可以多选 显示框不能编辑 所选中的项目在显示框中出现 下面根据网上的提示代码(参照博客 一去二三里),主要实现如下代码(与参照略有不同) ...

  6. .is() 全选复选的判断

    /* 全选/全不选 */function selectAll(){ if($("#ckAll").is(":checked",true)){ $(": ...

  7. duilib 修复CTreeViewUI控件动态添加子控件时,对是否显示判断不足的bug

    转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42264947 这个bug我在仿酷狗开发日志里提到过,不过后来发现修复的不够 ...

  8. 为DataGridView控件实现复选功能

    实现效果: 知识运用: DataGridViewCheckBoxColumn类 实现代码: private class Fruit { public int Price { get; set; } p ...

  9. 个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框

    插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...

随机推荐

  1. 冲刺阶段站立会议每日任务i4

    昨天对小组成员的任务进行了进一步细化分配,今天了解了安卓开发环境的相关知识. 遇到的问题: 没有遇到问题.

  2. CS小分队第一阶段冲刺站立会议(5月13日)

    昨日成果:昨日由于课程满课,未进行项目的制作 遇到困难:/ 今天计划:为2048和扫雷添加游戏音效,和组员一起合作对扫雷进行外观美化,学习程序生成时渐隐等特效

  3. 博弈---威佐夫博奕(Wythoff Game)

    这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.     这种情况下是颇为复杂 ...

  4. Windows Forms编程实战学习:第一章 初识Windows Forms

    初识Windows Forms 1,用C#编程 using System.Windows.Forms;   [assembly: System.Reflection.AssemblyVersion(& ...

  5. mysql的程序组成

    MySQL的程序组成 1:客户端 mysql:客户端程序 mysqldump:mysql备份工具 mysqladmin:mysql管理工具 mysqlbinlog:二进制日志查询工具 2:服务端 my ...

  6. spring表单—乱码解决方案

    1.POST方式提交 A.jsp页面POST方式提交表单 B.web.xml配置过滤器 <!-- spring过滤器解决乱码问题 --> <filter> <filter ...

  7. Objective - C 之协议

    一.创建方法: 二.实现过程: 1.遵循协议: @protocol NurseWorkingProtocol <NSObject>   //<> 表示遵守协议,创建时就有(Nu ...

  8. 利用canvas对上传图片进行上传前压缩

    利用谷歌调式工具发现,图片大小直接影响着首屏加载时间. 且考虑到后期服务端压力,图片压缩特别必要. 本文是前端利用canvas实现图片.参考文章:https://www.cnblogs.com/007 ...

  9. [C/C++] 指针数组和数组指针

    转自:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html 这两个名字不同当然所代表的意思也就不同.我刚开始看到这就吓到了,主要是中文 ...

  10. 【插件】LinqToExcel常用对象

    1.ExcelQueryFactory对象(1)获取工作表名集合IEnumerable<string> GetWorksheetNames() //获取工作薄中的工作表名foreach ( ...