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

1、控件隱藏後,容許用代碼操做全部行爲。

  在作播放器的時候,最經常使用的功能莫過於順序播放、隨機播放了,而當咱們切換歌曲的時候,顯然應該選中該歌曲,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就不用繞彎了。函數

 

2、記憶雙擊的下標

  仍是歌曲切換的問題,當用戶正在聽第一首歌的時候,去單擊了第十首歌,這個時候若是要切換到下一首,顯然應該是第二首歌,可是很不幸,若是用了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

 

相關文章
相關標籤/搜索