摘要:整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完整代码请进《仿迅雷播放器教程》)进阶教程汇总:duilib进阶教程 -- 在MFC中使用duilib (1)duilib进阶教程 -- 在duilib中使用MFC (2)duilib进阶教程 -- Container控件 (3)duilib进阶教程 -- XML嵌套及自定义控件 (4)duilib进阶教程 -- 图片和文字的位置调整 (5)duilib进阶教程 -- TreeView控件(6...
阅读全文
摘要:一、控件隐藏后,允许用代码操作所有行为。 在做播放器的时候,最常用的功能莫过于顺序播放、随机播放了,而当我们切换歌曲的时候,显然应该选中该歌曲,List的选中函数是SelectItem,但是调用此函数时,却发现有时候没有效果,原因是每当播放歌曲或电影时,会隐藏播放列表,这个时候SelectItem会返回false,当然,我们在SelectItem之前显示播放列表,SelectItem之后再隐藏播放列表就可以绕过这个问题,但始终不是个好办法,并且这和常规逻辑不符合,或者说和MFC的逻辑不符合,可以看到Alberl在《仿迅雷播放器教程 -- 基于ffmpeg的C++播放器 (1)》和《仿迅雷播放.
阅读全文
摘要:在前面的教程里,虽然图片都放到了skin文件夹里,但是XML却都在外面,当XML比较多时,就不太好看啦,如下图: 所以需要整理一下,将XML也放入skin文件夹,这样exe的目录就简洁多了: 将XML放入skin文件夹后,代码也要跟着变化哦,在duilib的Demo里经常可以看到如下代码: (其中SetResourcePath是设置资源的路径,包括XML和图片等各种资源;SetResourceZip是指资源都放到ListRes.zip文件里了。) CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::S...
阅读全文
摘要:在《duilib进阶教程 -- TreeView控件的bug (9)》里,Alberl发现了两个bug,并解决了其中一个,现在教程已经接近尾声啦,所以Alberl就解决了另外一个bug。 Bug现象: 第一次启动软件时,由于播放列表并没有文件,所以没有显示垂直滚动条,当我们拖入文件后,就显示了垂直滚动条,这个时候会自动调整子控件的宽度,于是一切显示正常。 但是当我们第二次启动软件时,由于软件会加载文件到播放列表,所以一开始就显示了垂直滚动条,但这个时候并没有自动调整子控件的宽度,所以子控件显示到了列表的外面,如图: 其实不仅TreeView有问题,而且List也有问题,用如下代...
阅读全文
摘要:一、windows原生消息 同样,入门教程只是给出了响应windows原生消息的方法,并没给出例子,这里以自适应屏幕分辨率为例。迅雷播放器虽然可以在启动的时候自动调整窗口大小,但是当屏幕分辨率实时改变时并没有调整窗口。我们做个改进,即可以实时调整大小,很明显,应该响应WM_DISPLAYCHANGE消息,而duilib自己处理windows消息的函数是在HandleMessage里,因此重载HandleMessage函数,加入如下代码:LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ){.
阅读全文
摘要:现在大家应该都知道caption="0,0,0,32",是指示标题栏区了吧,如果想要整个窗口都能拖动呢? 那直接把高度改成和窗口一样不就得了~O(∩_∩)O~ 嗯,这样是可以,比如窗口高度是600,那么我们指定caption="0,0,0,600",这样整个窗口就可以拖动了,但是如果窗口大小改变了呢?假如调整窗口的大小到800,这个时候最下面的200个像素的高度就不能拖动啦,因此这里进行一个改进,也是举手之劳,在WindowImplBase::OnNcHitTest里的 RECT rcCaption = m_PaintManager.GetCaption
阅读全文
摘要:duilib并没有提供双击和右键消息,所以需要我们自行扩展,这里以添加双击消息为例, 在UIDefine.h里,我们只看到了DUI_MSGTYPE_CLICK消息,却没有看到双击消息,因此需要在这里添加一个双击消息: #define DUI_MSGTYPE_DBCLICK (_T("dbclick")) 在UIManager.h里可以看到UIEVENT_DBLCLICK、UIEVENT_RBUTTONDOWN等消息,这是因为它的右键和双击等消息只给了内部的控件使用,这时我们需要让他传递出来,所以需要在CControlUI::DoEvent函数里传递双击消...
阅读全文
摘要:到上一个教程为止,界面显示的代码就都介绍完啦,现在开始介绍控件的响应,其实在《2013 duilib入门简明教程 -- 事件处理和消息响应 (17)》里已经列出了duilib自己定义的所有消息,并且前面也介绍了Button和Tab的响应,还是有小伙伴们不知道怎么响应其他控件,因此这里介绍一下其他控件的响应。 需要注意的是,如果要响应控件,则必须给控件指定一个唯一的ID,在windows编程里,每个控件的ID都是一个数字,如IDC_BUTTON_ 等等,可以用GetDlgItem()来获取控件的指针;而duilib的ID却不是数字,而是一个字符串,如name="button1"
阅读全文
摘要:一、不自动调整子控件的宽度(TreeView宽度小于260时) 相信亲们用同样的代码,显示效果肯定和Alberl不一样吧~O(∩_∩)O~ 嘿嘿,仔细对比下,看看你们的列表头背景图片是下面这样的么? 细心的小伙伴们应该早就发现了,可以看到右边那个箭头并没有完全显示出来,这是因为TreeView又调皮啦! 最开始觉得是TreeView没有自动调整控件的宽度,去看了下代码,没啥问题,并且TestApp1里面那个tree也没出现这种现象,所以就一直以为是自己的XML代码出了问题。由于对duilib并不熟,所以只是稍微调试了一下,并没找到问题,就暂时没管。到后面其他效果都OK了,只剩下这个...
阅读全文
摘要:上个教程说到了TreeView的文字不能垂直居中的问题,而我们用LabelUI其实是可以垂直居中的,为什么不说是TreeView的bug,而说是Label控件的bug呢?因为影响TreeView垂直居中的就是Label,可以发现LabelUI的【属性列表.XML】里有valign属性,而代码里却找不到,是因为valign属性被合并到align属性里去了,只要设置align="center"就可以水平垂直都居中,但是想要垂直居中,水平左对齐啥的,就犯难了,因此这里需要将两个属性分开,valign管垂直,align管水平,这样想要怎么组合都OK啦。 将CLabelUI::Set
阅读全文
摘要:上一个教程中,虽然播放列表的框架和迅雷一样了,但是字体大小、文字居中还没有解决。如果是刚学duilib,搞定这个可不容易,因为在有了入门教程的指导后,很容易就想到去看【属性列表.XML】,但是当你试了一圈之后,发现font、itemfont、align、itemalign等等,都没有效果! 这个时候就只有去看duilib内部的代码了,和上个教程一样,虽然小伙伴们花一个晚上或者几个晚上就能搞出来,但一样没什么含金量,纯体力活,所以Alberl在这里告知一下小伙伴,省得重复掉坑。 虽然CTreeViewUI继承于CListUI,但是其font、itemfont、align、itemalig...
阅读全文
摘要:代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调了好久,不过既然决定要山寨了,那当然得学习下华强北~O(∩_∩)O~ 那么现在只剩下播放列表和四个网页啦,那四个网页很简单,用ActiveX控件和Tab控件就搞定了,具体参见《2013 duilib入门简明教程 -- 复杂控件介绍 (13)》,那么接下来就来介绍播放列表的实现。 看到播放列表,小伙伴们可能有各种实现方式: 1、用3个Tab控件,每个Tab控件里放一个List控件,不过这...
阅读全文
摘要:已经有8个晚上没写教程啦,因为之后遇到了一些问题,主要是TreeView控件的问题,这个问题搞了几个晚上,然后还需要调试代码才能知道它的用法,虽然能够调试出来,但毕竟没什么含金量,只是重复劳动而已,相信很多前辈已经做过了。好吧,天朝的开源状况一向如此,重复造轮子的事情就由Alberl来终结吧,希望能给后面的小伙伴们节省时间,这里向那些提供Demo的大神们致敬,向duilib的作者致敬~O(∩_∩)O~ 说说这8个晚上干了啥吧: 1、前两个晚上实现了Treeview的基本界面,因为Demo里只有一个Treeview的例子,但是和迅雷的播放列表相差甚远,【属性列表】里很多属性都是没用的,比...
阅读全文
摘要:代码下载:http://download.csdn.net/detail/qq316293804/6433937 之前入门教程里已经讲过了自定义控件,这里借着迅雷播放器再次举个例子。 1、我们先给迅雷播放器加入下面那一排按钮。 和上个教程一样,我们可以选择直接放在主XML里面,也可以选择放到Container里面,在这里,为了让主XML的代码更简洁一点,我们选择放到单独的XML里面。而这个单独的XML就相当于一个自定义控件了,将控件名取为WndPlayPanel,XML取名为【WndPlayPanel.xml】,然后在CDuiFrameWnd::CreateControl里加入如下代...
阅读全文
摘要:前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在《duilib入门教程》里面讲过了,因此基础知识不再赘述。 代码下载:http://download.csdn.net/detail/qq316293804/6433161 效果如下(可拖拽边缘调节窗口大小,图片会自动居中) 此例子唯一需要说明的就是XML,代码如下: ...
阅读全文
摘要:好人做到底,送佛送到西。虽然上一篇教程已经说得很详细了,但Alberl还是再举一个例子。上一篇教程的主窗口是MFC的,所以这篇教程把主窗口换成duilib的~O(∩_∩)O~ 1、我们利用《2013 duilib入门简明教程 -- 完整的自绘标题栏(8)》里的XML做为主窗口,并且把客户区的控件都去掉,换成一个自定义控件。将XML改名为XMP_MAIN.xml,并放到exe目录。 2、在CDuiFrameWnd::CreateControl()函数里,加入自定义控件Dialog的创建: if (_tcsicmp(pstrClassName, _T("Dialog")) ==
阅读全文
摘要:由于入门教程的反响还不错,因此Alberl就以直播的形式来写《进阶教程》啦,本教程的前提: 1、请先阅读《仿迅雷播放器教程》 2、要有一定的duilib基础,如果还没,请先阅读《2013 duilib入门简明教程》。 3、下载基于VLC的MFC播放器(包含VLC等所有文件),csdn不允许上传相似的代码,因此后面的教程将不再上传VLC的dll、头文件等没有改变的文件。 《仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)》中界面是用MFC做的,因此我们要将它换成duilib。而在《2013 duilib入门简明教程 -- 结合win32和MFC (16)》中只讲了怎么在dui...
阅读全文