duilib進階教程 -- 改進List控件 (16)


一、控件隱藏后,允許用代碼操作所有行為。

  在做播放器的時候,最常用的功能莫過於順序播放、隨機播放了,而當我們切換歌曲的時候,顯然應該選中該歌曲,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,這樣就可以很方便的獲取下一首等操作了。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM