仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

转载请说明原出处,谢谢

       今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放

列表控件是基于CTreeViewUI和CTreeNodeUI做得,所以产生这几个bug的原因还在于他们两个,在《仿酷狗音乐播放器开发日志十一

——CTreeNodeUI的bug修复》中已经修复过一个动态添加控件的相关bug,这属于第二次修复了。关于第一次bug的修复,后来

Duilib扩展群的 joe 又进行过比我更全面的修复,我现在使用的CTreeViewUI就是joe修复过的,文章结尾会把第二次修复后的源文件免

费提供给大家。

       我先来描述一下这个bug。

        第一个BUG:

        含有子节点的CTreeNodeUI节点的选中和未选中状态是相反的,这个在我给播放列表添加音乐项目后可以看到,如图:

        

        这一点让人觉得很不舒服,看了一下源码,负责展开与收缩的函数是CTreeViewUI的OnFolderChanged函数和OnDBClickItem,

CTreeNodeUI在收缩按钮被单击或者整体被双击时就会去分别调用这两个函数,看了这两个函数的源码,发现了一些逻辑错误。首

先看OnFolderChanged函数的源码:

bool CTreeViewUI::OnFolderChanged( TNotifyUI* pTNotifyUI,LPARAM lParam,WPARAM wParam )
{
	if(pTNotifyUI->sType == DUI_MSGTYPE_SELECTCHANGED)
	{
		CCheckBoxUI* pFolder = (CCheckBoxUI*)pTNotifyUI->pSender;
		CTreeNodeUI* pItem = (CTreeNodeUI*)pFolder->GetParent()->GetParent();
		pItem->SetVisibleTag(!pFolder->GetCheck());
		SetItemExpand(!pFolder->GetCheck(),pItem);
		return true;
	}
	return false;
}

        问题出在pItem->SetVisibleTag(!pFolder->GetCheck());和SetItemExpand(!pFolder->GetCheck(),pItem);上,收缩按钮默认状态下

是未选中状态,当我点击了收缩按钮后,CCheckedUI控件会自动设置自己为选中状态,这时pFolder->GetCheck()会返回真,而

OnFolderChanged函数却取反,得到了假,然后再调用SetVisibleTag和SetItemExpand函数,恰好得到了相反结果,所以在这里把

取反去掉就可以了。

       第二个BUG:

       接着看看OnDBClickItem函数的源码:

bool CTreeViewUI::OnDBClickItem( TNotifyUI* pTNotifyUI,LPARAM lParam,WPARAM wParam )
{
	if(pTNotifyUI->sType == DUI_MSGTYPE_ITEMDBCLICK)
	{
		CTreeNodeUI* pItem		= static_cast<CTreeNodeUI*>(pTNotifyUI->pSender);
		CCheckBoxUI* pFolder	= pItem->GetFolderButton();
		pFolder->Selected(!pFolder->IsSelected());
		pItem->SetVisibleTag(!pFolder->GetCheck());
		SetItemExpand(!pFolder->GetCheck(),pItem);
		return true;
	}
	return false;
}

         这个的bug同样也是那两句代码,在双击了包含子节点的了CTreeViewUI控件后进入到此函数内,第一步先获取收缩按钮的句柄

并且将他的选中状态取反,pFolder->Selected(!pFolder->IsSelected());,这句代码没问题。接下来收缩按钮的状态已经为正确的状态

了,此时调用pFolder->GetCheck()后得到的就是正确值,不应该再取反了。所以后面的两句代码又把逻辑搞反了,应该把取反去

掉。

        总结:

        在开发仿酷狗播放器的过程中已经修复了好几个bug,估计以后还有会,duilib的作者不维护,只能靠我们这些使

用者自己修复了。此次修复只是我临时修改,如果有不妥的地方,请联系我,我会及时修复代码。在代码里搜

索“//add by:Redrain   2014.8.8”和“//edit by:Redrain   2014.8.8 ” 可以找到我修改的地方。此源码是第二次修复

bug,在这之前已经修复了无法动态添加节点的bug。

        源码下载地址:点击打开链接

       Redrain  2014.8.8  20:29    QQ:491646717

时间: 2024-11-01 14:58:38

仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)的相关文章

仿酷狗音乐播放器开发日志十五——音乐电台列表控件的实现

转载请说明原文出处,谢谢~~             前些日子封装了好几天控件,把webkit浏览器控件,vlc视频播放控件,音频播放控件做好了,做这些控件一来是可以单独使用,用到其他项目中,而来可以直接用到这个仿酷狗播放器项目中,后期把他们结合起来就是个完整播放器了.           今天就继续前段时间的工作,继续完善仿酷狗的界面.前面的文章里已经把左侧的各个列表的外观做好了,尤其是做好了播放器列表,不过今天发现,音乐电台列表中的电台项目也是个比较复杂的控件,所以今天就把他做出来.    

仿酷狗音乐播放器开发日志十六——各个右键菜单的实现

转载请说明原出处,谢谢~~         整个软件主体做完了,现在就开始做各个零碎的部分了,首先拿各个菜单开刀.做这个菜单要比做前面的功能简单多,因为我已经写好了一个通用菜单可以直接拿来用.没看过我的菜单的那篇文章的请点这里:点击打开链接.我看了一下,酷狗的各种菜单共有6个,主界面的 右键菜单,托盘菜单,音乐列表项右键菜单,音乐分组菜单,电台列表项右键菜单,定位功能菜单,下载列表右键菜单.        我大致给截图看一下几个主要的菜单的效果.        主界面右键菜单:        

仿酷狗音乐播放器开发日志十二——播放列表的实现六

转载请说明出处,谢谢~~      前天和昨天只顾看电视剧了,没有写程序,好在把<孤岛飞鹰>看完了,这下在可以安心写代码了 ^_^     上次说道还要开发分组控件,分组控件的开发过程要比其他两个控件要简单得多,因为他的功能相对要少,而且自身的状态不像音乐播放项目哪个多,所以外观的编写比较简单,主要的功能就是所以一个容器来盛放音乐播放项目CMusicListItemUI控件.     他同样是继承自CTreeNodeUI控件,然后我重写了DoEvent函数,过滤了几个消息的处理,让他的行为和原

仿酷狗音乐播放器开发日志十八——换肤功能的实现二:改变控件和窗体透明度(附挂件类源码)

转载请说明原出处,谢谢~~          昨天把大致布局分析了一下,昨天晚上把布局写好实现了,今天把大致的功能完成了一下,现在的外观已经和原酷狗的换肤界面完全一样,其中的调整播放列表透明度和设置整个软件透明度的代码已经完成了,先把效果图贴一下,然后开发说开发过程.    开发步骤一:        布局的部分我就不说了,昨天已经分析了,只要用好素材,花点时间就能把界面效果做出来,其中"官方皮肤"和 "我的皮肤"调用CTabLayout可以实现两个界面的切换,如图

仿酷狗音乐播放器开发日志十——播放列表的实现五

  之前做好了CMusicListItemUI控件,昨天晚上经过修改后现在已经把一些bug修复,可以正常工作了.所以开始开发播放列表CMusicListUI控件.    但是今天早上经过我分析后,发现我目前继承自CListUI的CMusicListUI控件,我虽然给他添加了可以设置分组的功能,并且能正常工作,但是再和酷狗的播放列表比起来发现缺点就比较多了,下面我先对比一下酷狗和我做的CMusicListUI控件.    //////////////////////////////////////

仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)

转载请说明原出处,谢谢~~           上一篇仿酷狗日志结束后,整个换肤功能就只剩下调色板功能没有做了,我本以为会很简单,但是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子:         我原本以为酷狗的主界面只是一张图片,然后通过鼠标坐标来选择颜色,简单粗暴.等我开始做这部分时发现情况不一样.         可以看到,酷狗的调色板分为两部分,上半部分是调色板的主界面,下半部分是调整亮度的工具栏,我这里分别给他们起名为Pallet和Bar方便说明.这个

仿酷狗音乐播放器开发日志二十二 动态调色板控件第二版(性能大幅提升附源码)

转载请说明原出处,谢谢~~         在上次写的博客<仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)>发布后,我在群里和网友讨论这个控件的性能和优 缺点,发现了他很多不足,还有很多提升空间,之后我简单的修改了代码提升了控件的响应速度.        昨天网友"风之羽翼"联系到我,他在我原来写的控件基础上,对绘图的算法进行重写,大幅提升了控件的绘制速度,算法也精准了很多,最终的控 件效果要比原酷狗更加流畅,于是今天把新的控件代码上传,供感兴趣的朋友使用.在

仿酷狗音乐播放器开发日志二十——换肤功能背景图片控件的制作(附源码)

转载请说明原出处,谢谢~~           <仿酷狗音乐播放器开发日志二十>里做了换肤功能的一部分,今天完成其他的部分.酷狗的换肤窗口里的背景图可以让用户选择来换图,原酷狗的背景图的小图标,有normal.hover.down等多种状态,鼠标移动上去便会发生变化.如图        当鼠标经过时会有个黑色图片覆盖,边框变为浅蓝色.并且在他上面显示出作者的一些信息.要实现这个效果应该另外开发一个控件来支持动态的信息展示效果.我把这个小控件的开发过程和源码发一下,给学习做duilib控件的新手

仿酷狗音乐播放器开发日志——整体框架分析

转载请说明出处,谢谢~~ 学习duilib界面库有一段时间了,除了仓鼠软件共享以外还没用它开发过什么完整的软件项目.今天看到酷狗音乐播放器做得不错,经过几年的改革,酷狗现在的UI已经相当不错了.在这个假期,我决定做一个仿酷狗音乐播放器,模仿酷狗的软件界面,并加入基本的音乐播放功能,在QQ空间写出开发日志以作记录~~     首先分析一下酷狗播放器的界面布局.     很简单明了的布局方式,我把它先大致分为3部分,在Firework里贴上酷狗的软件的截图,然后使用切片工具对三部分进行精确分割,得到