duilib 修复CTreeViewUI复选功能判断不准确的bug

转载请说明出处,谢谢~~: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值