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

来源:互联网 发布:淘宝晒图怎么删除 编辑:程序博客网 时间:2024/04/30 18:29

转载请说明出处,谢谢~~: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.11pItem->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 0
原创粉丝点击