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进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
随机推荐
- nginx伪静态
nginx 伪静态设置目录 /usr/local/nginx/conf/nginx/conf 1.域名绑定.server_name bbs.99vps.com; 2.网站根目录设置.root /ho ...
- maven中添加servlet、jsp依赖
或者在eclipse中,右键项目名称->Maven->Add Dependency->输入servlet,会自动找到最新的版本(记得联网哦),如图:
- RabbitMQ 学习记录
rabbit mq知识点:1.消费时可以通过acknowledge设定消费是否成功,消费不成功时在server端requeue2.需要注意两个持久化:queue持久化和消息持久化(通过代码设定,默认即 ...
- hdu 1573 X问题 (非互质的中国剩余定理)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- CK13物料价格评估的数据ALV显示
*&---------------------------------------------------------------------* *& Report ZPP023 * ...
- android开发学习---layout布局、显示单位和如何进行单元测试
一.五大布局(layout) android中的用五大布局:LinearLayout (线性布局).AbsoluteLayout(绝对布局).RelativeLayout(相对布局).TableLay ...
- 柬埔寨手机上网资费套餐(3G/4G上网)
柬埔寨三大运营商 Cellcard 官网套餐详情http://www.cellcard.com.kh/cellcard-internet Metfone 官网套餐详情http://www.met ...
- 深入理解C语言的函数调用过程
本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解. 先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include stdio. ...
- acm入门编成题
http://wenku.baidu.com/view/c8f2f64acf84b9d528ea7aee.html
- public <T> void show(T t),void前面的泛型T是什么作用
public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样. <T> 不是返回值,表示传入参数有泛型 public static ...