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