转载请说明原出处,谢谢函数
今天原本打算把仿酷狗播放列表的子控件拖动插入功能作一下,可是仔细使用播放列表控件时发现了几个逻辑错误,因为个人播放ui
列表控件是基于CTreeViewUI和CTreeNodeUI作得,因此产生这几个bug的缘由还在于他们两个,在《仿酷狗音乐播放器开发日志十一spa
——CTreeNodeUI的bug修复》中已经修复过一个动态添加控件的相关bug,这属于第二次修复了。关于第一次bug的修复,后来.net
Duilib扩展群的 joe 又进行过比我更全面的修复,我如今使用的CTreeViewUI就是joe修复过的,文章结尾会把第二次修复后的源文件免日志
费提供给你们。code
我先来描述一下这个bug。blog
第一个BUG:ip
含有子节点的CTreeNodeUI节点的选中和未选中状态是相反的,这个在我给播放列表添加音乐项目后能够看到,如图:ci
这一点让人以为很不舒服,看了一下源码,负责展开与收缩的函数是CTreeViewUI的OnFolderChanged函数和OnDBClickItem,开发
CTreeNodeUI在收缩按钮被单击或者总体被双击时就会去分别调用这两个函数,看了这两个函数的源码,发现了一些逻辑错误。首
先看OnFolderChanged函数的源码:
bool CTreeViewUI::OnFolderChanged( TNotifyUI* pTNotifyUI,LPARAM lParam,WPARAM wParam ) { if(pTNotifyUI->sType == DUI_MSGTYPE_SELECTCHANGED) { CCheckBoxUI* pFolder = (CCheckBoxUI*)pTNotifyUI->pSender; CTreeNodeUI* pItem = (CTreeNodeUI*)pFolder->GetParent()->GetParent(); pItem->SetVisibleTag(!pFolder->GetCheck()); SetItemExpand(!pFolder->GetCheck(),pItem); return true; } return false; }
问题出在pItem->SetVisibleTag(!pFolder->GetCheck());和SetItemExpand(!pFolder->GetCheck(),pItem);上,收缩按钮默认状态下
是未选中状态,当我点击了收缩按钮后,CCheckedUI控件会自动设置本身为选中状态,这时pFolder->GetCheck()会返回真,而
OnFolderChanged函数却取反,获得了假,而后再调用SetVisibleTag和SetItemExpand函数,刚好获得了相反结果,因此在这里把
取反去掉就能够了。
第二个BUG:
接着看看OnDBClickItem函数的源码:
bool CTreeViewUI::OnDBClickItem( TNotifyUI* pTNotifyUI,LPARAM lParam,WPARAM wParam ) { if(pTNotifyUI->sType == DUI_MSGTYPE_ITEMDBCLICK) { CTreeNodeUI* pItem = static_cast<CTreeNodeUI*>(pTNotifyUI->pSender); CCheckBoxUI* pFolder = pItem->GetFolderButton(); pFolder->Selected(!pFolder->IsSelected()); pItem->SetVisibleTag(!pFolder->GetCheck()); SetItemExpand(!pFolder->GetCheck(),pItem); return true; } return false; }
这个的bug一样也是那两句代码,在双击了包含子节点的了CTreeViewUI控件后进入到此函数内,第一步先获取收缩按钮的句柄
而且将他的选中状态取反,pFolder->Selected(!pFolder->IsSelected());,这句代码没问题。接下来收缩按钮的状态已经为正确的状态
了,此时调用pFolder->GetCheck()后获得的就是正确值,不该该再取反了。因此后面的两句代码又把逻辑搞反了,应该把取反去
掉。
总结:
在开发仿酷狗播放器的过程当中已经修复了好几个bug,估计之后还有会,duilib的做者不维护,只能靠咱们这些使
用者本身修复了。这次修复只是我临时修改,若是有不妥的地方,请联系我,我会及时修复代码。在代码里搜
索“//add by:Redrain 2014.8.8”和“//edit by:Redrain 2014.8.8 ” 能够找到我修改的地方。此源码是第二次修复
bug,在这以前已经修复了没法动态添加节点的bug。
源码下载地址:点击打开连接
Redrain 2014.8.8 20:29 QQ:491646717