在作播放器的時候,最經常使用的功能莫過於順序播放、隨機播放了,而當咱們切換歌曲的時候,顯然應該選中該歌曲,List的選中函數是SelectItem,可是調用此函數時,卻發現有時候沒有效果,緣由是每當播放歌曲或電影時,會隱藏播放列表,這個時候SelectItem會返回false,固然,咱們在SelectItem以前顯示播放列表,SelectItem以後再隱藏播放列表就能夠繞過這個問題,但始終不是個好辦法,而且這和常規邏輯不符合,或者說和MFC的邏輯不符合,能夠看到Alberl在《仿迅雷播放器教程 -- 基於ffmpeg的C++播放器 (1)》和《仿迅雷播放器教程 -- 基於VLC的MFC播放器 (6)》裏上傳了兩個播放器,其中的播放列表都是很容易實現順序播放等功能的,因此這裏將List控件的行爲改爲和MFC同樣的,畢竟MFC是一個成熟的框架,其邏輯也是很成熟的。html
所以將CListUI::SelectItem函數裏的這兩句註釋掉:框架
//if( !pControl->IsVisible() ) return false; //if( !pControl->IsEnabled() ) return false;
這樣SelectItem就不用繞彎了。函數
仍是歌曲切換的問題,當用戶正在聽第一首歌的時候,去單擊了第十首歌,這個時候若是要切換到下一首,顯然應該是第二首歌,可是很不幸,若是用了duilib的List,你會發現下一首跑到了第十一個~~~ 這是由於List只記憶了單擊的下標,因此CListUI::GetCurSel會隨着用戶單擊的列而變化,顯然這不是咱們想要的結果。ui
這裏也有一個不改List代碼的方法,那就是當用戶雙擊的時候,咱們自行保存雙擊的下標,下次切換歌曲的時候用本身保存的下標便可,顯然,這也不是個好辦法,顯然和MFC的邏輯也不符合,由於MFC記憶的都是雙擊的列,就算失去焦點和隱藏,也不會改變,可是duilib的List就只記憶了單擊的列,而且點到其餘地方時,GetCurSel還會獲得-1。spa
所以Alberl給List記憶了雙擊的下標,爲了保持兼容性,原有的功能都不變,獲取雙擊的下標用GetCurSelActivate函數便可。雙擊選中用SelectItemActivate,code
代碼很簡單,SelectItemActivate函數以下:htm
bool CListUI::SelectItemActivate(int iIndex) { if (! SelectItem(iIndex, true)) { return false; } m_iCurSelActivate = iIndex; return true; }
其餘代碼請參見工程裏的文件~O(∩_∩)O~blog
舒適提示:教程
Alberl的工程裏仍是用的成員變量保存雙擊的下標,由於Alberl爲了演示TreeView的用法,因此用了複雜點的方法,實際使用建議在TreeView裏面嵌入一個ListBox,把文件放入到ListBox,這樣就能夠很方便的獲取下一首等操做了。get