【高分跪求】CTreeCtrl目录树自定义排序问题

时间:2022-12-26 23:57:22
现用CTreeCtrl生成了目录树,要给目录树排序。要求满足:
1.按照节点名称排序
2.文件夹必须排在文件前面


对于第一点,SortChildren默认是支持的。
对于第二点,SortChildrenCB似乎可以考虑。使用SortChildrenCB要求每个节点已被SetItemData绑定自己的HTREEITEM
而我的树的每个节点已经绑定了其他重要数据,不可修改。
那么如何实现自定义排序呢?

另外尝试过载insertItem的时候就设置hInsertAfter,然而还是不能很好的排列文件和文件夹。

希望各位前辈指教。。。

14 个解决方案

#1


先排序文件夹,再排序文件,用SortChildrenCB排序文件夹,再用SortChildren排序文件夹里的文件。

#2


重要的数据是数据结构吧?
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。

#3


如果同一层不仅有文件还有文件夹,你这样的方法还是不能把文件夹排在文件前面

#4


用SetItemData标识一下文件夹和普通文件。

#5


哎。。。搞定了,是这样弄的,给大家分享下:

 if(ff.IsDirectory())
        {          
            // 简单的插入排序:文件夹排在文件前面
            HTREEITEM itemAfter = FindInsertAfterItem(itemParent, enuNodeDirectory, strTitle);

            // 创建文件节点
            itemCur = m_poTreeControl->InsertItem( 
                uTreeNodeMask, strTitle, 
                enuIconDirectory, enuIconDirectory, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0, 
                itemParent, itemAfter);          
            // 递归生成子节点
            AddTreeNodeRecursive(strPath, itemCur);
        }
        else            
        {  
            itemCur = m_poTreeControl->InsertItem( 
                uTreeNodeMask, strFileName, 
                enuIconJob, enuIconJob, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0, 
                itemParent, TVI_LAST);

        }

其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可

#6


恭喜了!

#7


JF

#8


接分!

#9


多谢楼主分享、、、、、

#10


里面的文件夹 和 文件 分别缓存起来,
把缓存的文件夹和文件排序以后,再分别加进树控件里面

不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。

#11


学习咯·~~~

#12


楼主是强人!!~~BOSS L

#13


自己慢慢排序,并修改Tree的节点,这并不困难,只不过速度慢。

#14


【高分跪求】CTreeCtrl目录树自定义排序问题

#1


先排序文件夹,再排序文件,用SortChildrenCB排序文件夹,再用SortChildren排序文件夹里的文件。

#2


重要的数据是数据结构吧?
自己再定义一个结构,包括原来你的重要数据,再加上一个节点类型,统一作为一个Data绑定到节点上,然后自己写响应的排序函数,首先判断节点类型。

#3


如果同一层不仅有文件还有文件夹,你这样的方法还是不能把文件夹排在文件前面

#4


用SetItemData标识一下文件夹和普通文件。

#5


哎。。。搞定了,是这样弄的,给大家分享下:

 if(ff.IsDirectory())
        {          
            // 简单的插入排序:文件夹排在文件前面
            HTREEITEM itemAfter = FindInsertAfterItem(itemParent, enuNodeDirectory, strTitle);

            // 创建文件节点
            itemCur = m_poTreeControl->InsertItem( 
                uTreeNodeMask, strTitle, 
                enuIconDirectory, enuIconDirectory, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0, 
                itemParent, itemAfter);          
            // 递归生成子节点
            AddTreeNodeRecursive(strPath, itemCur);
        }
        else            
        {  
            itemCur = m_poTreeControl->InsertItem( 
                uTreeNodeMask, strFileName, 
                enuIconJob, enuIconJob, GetStateImageIndex(SvnExcluded), TVIS_STATEIMAGEMASK, 0, 
                itemParent, TVI_LAST);

        }

其中FindInsertAfterItem用于对文件夹的排序,确保排列在该层最前面即可

#6


恭喜了!

#7


JF

#8


接分!

#9


多谢楼主分享、、、、、

#10


里面的文件夹 和 文件 分别缓存起来,
把缓存的文件夹和文件排序以后,再分别加进树控件里面

不缓存直接进树。
丢一个记录 第一个文件在什么地方的变量
看到目录,就插入排序丢进去
看到文件就 从记录的位置开始插入。

#11


学习咯·~~~

#12


楼主是强人!!~~BOSS L

#13


自己慢慢排序,并修改Tree的节点,这并不困难,只不过速度慢。

#14


【高分跪求】CTreeCtrl目录树自定义排序问题