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进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
随机推荐
- 使用JNDI或JDBC连接数据库
一. JNDI 1. tomcat环境 找到X:\xxx\......\apache-tomcat-6.0.39\conf\server.xml,在<Host>节点中配置如下: <H ...
- php 下载图片 文件
$file = dirname(dirname(__FILE__)) . $_GET['download']; //获取图片的绝对路径 header("Content-type: octet ...
- Codeforces 723C. Polycarp at the Radio 模拟
C. Polycarp at the Radio time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...
- 【Android测试】【随笔】性能采集工具——小松鼠诞生记
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4945066.html 起因 去年刚加入TX的时候,我便接手 ...
- iOS IPv6兼容支持和IPv6审核被拒收集整理
最近遇到一个大坑:IPv6审核被拒问题,于是广寻解决方案,先把一些可以用资料文档收集起来备用.也希望同行能用得着. 官方文档说明:Supporting IPv6 DNS64/NAT64 Network ...
- jquery load 加载改造,只加载body
背景: 项目中大量用到了jquery和easyui组件,原生load经常出现主页面异常,原因是组件被重复初始化.也考虑过用iframe,但是在实际项目中的效果,最终取消了iframe方案,也尝试了其他 ...
- Qt 无法解析外部文件2001,2019之类的
一般是部分代码出错,比如构造函数的实参没有对应或者设置好: 还有尝试删除debug生成的文件试试,清理当前项目->重新构建: 以及看下有没有变量没有初始化或者变量定义的时候父类错了等. 以及其他 ...
- canvas,制作炫酷的时钟和倒计时
html部分 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin ...
- 5.11-5.15javascript制作动态表格
制作动态表格的主要是运用js中表格类的insertRow.insertCell简易添加行和列的代码,不过要注意每行添加的表格是有位置行编号的,每行的编号为rows.length-1,增加的表格内的标签 ...
- 解决Maven中OutOfMemory错误
当Maven项目很大,或者你运行诸如 mvn site 这样的命令的时候,maven运行需要很大的内存,在默认配置下,就可能遇到java的堆溢出.如: [INFO] Building jar: / ...