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

 

相关文章
相关标签/搜索