轉載請說明原出處,謝謝函數
今天原本打算把仿酷狗播放列表的子控件拖動插入功能作一下,可是仔細使用播放列表控件時發現了幾個邏輯錯誤,因爲個人播放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