duilib进阶教程 -- 各种控件的响应 (10)
到上一个教程为止,界面显示的代码就都介绍完啦,现在开始介绍控件的响应,其实在《2013 duilib入门简明教程 -- 事件处理和消息响应 (17)》里已经列出了duilib自己定义的所有消息,并且前面也介绍了Button和Tab的响应,还是有小伙伴们不知道怎么响应其他控件,因此这里介绍一下其他控件的响应。
需要注意的是,如果要响应控件,则必须给控件指定一个唯一的ID,在windows编程里,每个控件的ID都是一个数字,如IDC_BUTTON_ 等等,可以用GetDlgItem()来获取控件的指针;而duilib的ID却不是数字,而是一个字符串,如name="button1",获取控件的指针是通过FindControl函数。duilib没有像MFC那样的DDX机制来绑定ID和控件变量,所以只能通过FindControl函数。
Button和Option控件已经在入门教程里介绍过了,而其他控件在duilib自带的Demo里面都有介绍,Alberl搞不清楚为什么有些小伙伴还是不知道怎么响应的,那么这里就说说其他控件的响应吧,入门教程里已经说了,duilib的控件响应都可以在Notify函数里搞定,也可以用DUI_ON_MSGTYPE宏搞定,比如DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK,OnClick)。
一、菜单控件:
由于Demo里的菜单控件既不通用,代码量也大,看起来还比较复杂,所以Alberl提炼出了一个精简的菜单控件,用法很简单:
1、在想要显示菜单的地方加上:
CMenuWnd *pMenu = new CMenuWnd(_T("menu.xml"));
POINT pt = {msg.ptMouse.x, msg.ptMouse.y};
pMenu->Init(&m_PaintManager, pt);
pMenu->ShowWindow(TRUE);
2、在menu.xml里加上要显示的菜单项,如:
<ListContainerElement name="menuSingleCircle" height="22" inset="15,0,25,0" >
<Label text="单曲循环" textcolor="#FFC8C6CB" align="center"/>
</ListContainerElement>
3、在Notify里响应itemclick消息,如:
if(msg.sType == _T("itemclick"))
{
if (msg.pSender->GetName() == _T("menuSingleCircle"))
{
m_emPlayMode = EM_PLAY_MODE_SINGLE_CIRCLE;
}
}
二、treeview控件:
List的响应都是在"itemactivate"里,所以在Notify里用 if( msg.sType == _T("itemactivate") ) 就可以了,需要说明的是List控件比较特殊,虽然也可以像button一样指定一个name属性,然后判断name就知道点击了哪个控件,但还是建议用List自带的函数GetItemIndex(msg.pSender)来获取点击了哪一列,List控件比较简单,请自行看Demo,TreeView由于没有Demo可以看,这里介绍一下:
因为TreeView继承于List,所以很多特性都是一样的,比如在_T("itemactivate")里响应点击消息,用GetItemIndex获取点击了哪一列。
if( msg.sType == _T("itemactivate"))
{
CTreeViewUI* pTree = static_cast<CTreeViewUI*>(m_PaintManager.FindControl(_T("treePlaylist"))); if(pTree && - != pTree->GetItemIndex(msg.pSender) && U_TAG_PLAYLIST == msg.pSender->GetTag())
{
int iListIndex = pTree->GetItemIndex(msg.pSender);
}
}
不过获取到了iListIndex,好像也没啥用,它是哪个节点的?是我想要的节点吗?
所以这里就需要给我们想要的节点加上特殊的属性,比如name、tag、userdata等等,这里Alberl用的是Tag来标记的,所以只要GetTag获取一下tag就知道是不是点击了播放列表。
而Tag的设置是在添加TreeNode节点时调用pNodeTmp->SetTag(U_TAG_PLAYLIST); 这样就设置了一个值为U_TAG_PLAYLIST 的Tag。
知道了用户点击了咱们想要的控件,那么直接GetItemText就可以获取到文件路径了,这个时候就可以播放啦~O(∩_∩)O~
但是问题又来了,如果想要实现顺序播放的功能,那么就必须获取下一个节点的指针,不过List并没有提供GetNextItem这样的功能,所以得绕一下,就是先用GetItemIndex获取本节点的Index,再用GetItemAt(Index + 1)即可获取下一个节点的指针。
如果播放到最后一首,想跳到第一首,怎么办?
嗯,这个时候只有找出播放列表第一个文件的下标了,可以看到本播放器的文件路径是从【播放列表】的第五个子节点才开始的,我们直接用【播放列表】的下标加5就OK了?目前是OK,但是如果在前面再加上2个节点呢,那不就要改成7了? 所以这里用了一个通用的函数GetPlaylistInfo来获取文件的数量,以及第一个文件的Tree下标。
是不是绕晕了? 嗯,因为Demo里并没有Tree控件的响应,Alberl只是为了给大家示范Tree控件的用法,实际使用中,建议嵌入一个ListBox进去,这样就无需绕来绕去了,直接GetItemIndex就是相应的下标,GetItemIndex(0)就是第一个文件~O(∩_∩)O~
嗯,最复杂的控件响应都介绍完了,剩下的就去看Demo吧~O(∩_∩)O~
duilib进阶教程 -- 各种控件的响应 (10)的更多相关文章
- duilib进阶教程 -- Container控件的bug (14)
在<duilib进阶教程 -- TreeView控件的bug (9)>里,Alberl发现了两个bug,并解决了其中一个,现在教程已经接近尾声啦,所以Alberl就解决了另外一个bug. ...
- duilib进阶教程 -- TreeView控件(6)
代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调 ...
- duilib进阶教程 -- Container控件 (3)
前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在<duilib入门教程>里面讲过了,因此基础知识不再赘述. 代码下载:h ...
- duilib进阶教程 -- TreeView控件的不足 (7)
上一个教程中,虽然播放列表的框架和迅雷一样了,但是字体大小.文字居中还没有解决.如果是刚学duilib,搞定这个可不容易,因为在有了入门教程的指导后,很容易就想到去看[属性列表.XML],但是当你试了 ...
- duilib进阶教程 -- Label控件的bug (8)
上个教程说到了TreeView的文字不能垂直居中的问题,而我们用LabelUI其实是可以垂直居中的,为什么不说是TreeView的bug,而说是Label控件的bug呢?因为影响TreeView垂直居 ...
- duilib进阶教程 -- TreeView控件的bug (9)
一.不自动调整子控件的宽度(TreeView宽度小于260时) 相信亲们用同样的代码,显示效果肯定和Alberl不一样吧~O(∩_∩)O~ 嘿嘿,仔细对比下,看看你们的列表头背景图片是下面这样的么? ...
- 百度地图Api进阶教程-默认控件和自定义控件2.html
<!DOCTYPE html> <html> <head> <meta name="viewport" content="ini ...
- EasyMvc入门教程-基本控件说明(10)图片轮播导航
图片轮播导航大家一定很常见,尤其是中小型建站系统的必备神器..:) 先上图上例子,看效果如下: 实现代码如下: @{ var data = new List<PhotoPlayerItem> ...
- duilib进阶教程 -- 总结 (17)
整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
随机推荐
- 用jsch.jar实现SFTP上传下载删除
java类: 需要引用的jar: jsch-0.1.53.jar 关于jsch有篇文章关于目录的问题写得非常好:http://www.zzzyk.com/show/9f02969327434a6c.h ...
- html里文本编辑器如何制作呢?
初入it职场,文本编辑器真的让人捉摸不透.最终在前端姐姐帮助下弄好了↓ 先在头部写好编辑器的各种功能的总体模型 <script>var editor; KindEditor.ready(f ...
- Dynamic CRM2016在一台本地服务器安装部署
在本地单独一台服务器上安装部署CRM2016时需要提前安装好CRM软件需要的必备软件,具体需要安装的组件如下截图:其中required为必须具备的安装组件.license可以采用微软官网的90天测试版 ...
- jsp学习--基本语法和基础知识
一.JSP简单介绍 1.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于 ...
- js点击按钮倒计时setTimeout和setInterval
setTimeout() 用于在指定的毫秒数后调用函数或计算表达式,只执行 code 一次. setInterval() 可按照指定的周期(以毫秒计)来调用函数或计算表达式,不停地调用函数,直到 cl ...
- Android Preference使用
Android Preference经常使用在例如设置的功能,Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,这种就是使用android share ...
- iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
Avoid duplicate symbol in static library and its customer 发布static library给使用者使用.在实际的工程实践中,iOS静态库一般会 ...
- zend 汉化
http://jingyan.baidu.com/article/4f34706ecdb566e387b56d05.html
- [R] 回归拟合
如下示例 > fit <- lm(y~x, data = data01) > summary(fit) Call: lm(formula = data01$P ~ data01$M, ...
- NDK开发总结
NDK开发差不多结束了, 估计后面也不会再碰了诶, 想着还是写个总结什么的,以后捡起来也方便哈.既然是总结,我这里就不会谈具体的细节,只会记录下我觉得重要的东西, 所以这篇随笔不是为萌新学习新知识准备 ...