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进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
随机推荐
- wget net-tools
新安装的centos7 minimal 没有安装 wget 需要安装一下,才能安装lnmp yum -y install wget yum -y install net-tools
- openstackM版本常见问题汇总
汇总下常见的问题以及解释下一些比较容易让人萌的参数配置等等 问题汇总1.使用纯文本模式进行复制粘贴,打死不要用word!!!可以解决绝大多数问题,如果你依然执迷不悟,那么就好自为之吧 2.创建路由器时 ...
- Light OJ 1019 - Brush (V)(图论-dijkstra)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...
- golang使用interface来mock进行测试(来自dotGO2014)
源自于dotGO 2014的视频,讲述如何使用 interface 来mock 进行测试.. 可以FQ的同学自己观看,这里把重要的一些代码给截图搬到国内了 https://www.youtube.co ...
- Scrum Meeting (Oct. 27 2014)
软件工程是一门十分有意思的课程,它不仅锻炼了我们开发软件的能力,更是给了我们结队作业的机会,在团队协作中,我们学会了欣赏别人,学会了品鉴自己,学会了如何集思广益凝聚成一个锐意进取的集体.继单人单词查询 ...
- php 继承
说多重继承之前首先说下与其相对的单一继承,单一继承指的是一个类只可以继承自一个父类,从现实生活中举例就是说一个儿子只有一个父亲.那么多重继承就好理解了,多重继承指的是一个类可以同时从多于一个父类继承行 ...
- iOS全局调用的提示 没有网络 没有更多 等。。 短时间内自动消失
本来想用SVProgressHUD 但是由于这个需求相对要简单 所以自己写了 下面上代码 .h 文件 #import <UIKit/UIKit.h> @interface HaveNoMo ...
- 0909 45作业one
1.编译原理学什么? 答: 初遇编译原理,我知道编译原理是计算机专业设置的一门重要的专业课程,主要是介绍编译程序构造的一般原理和基本方法.其内容大概包括语言和文法.词法分析.语法分析.语法制导翻译.中 ...
- 基本套接字编程(2) -- I/O模型篇
1. I/O模型简介 最近一直在学习Unix网络编程,被Unix下各种I/O模型搞得头昏脑涨,结合<Unix网络编程 - 卷一>第六章 并参考了网上各牛们的分析,稍稍厘清了一些.因此记录下 ...
- StringGrid 实例3: 本例功能: 1、修改 TStringGrid的默认宽与高; 2、添加行; 3、确认当前单元并赋值.
实例3: 本例功能: 1.修改 TStringGrid的默认宽与高; 2.添加行; 3.确认当前单元并赋值. 实例图形: