仿酷狗音樂播放器開發日誌十九——CTreeNodeUI的bug修復二(附源碼)

轉載請說明原出處,謝謝函數

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

相關文章
相關標籤/搜索