探讨CtreeCtrl::SortChildrenCB<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在实际开发中,我们往往需要对树控件(CTreeCtrl)的节点进行排序。事实上,大部分的排序工作可以用CTreeCtrl::SortChildren来实现,不过CTreeCtrl::SortChildren是简单的通过树项目名称排序,假如要实现个性化排序,则需要借助SortChildrenCB。
CTreeCtrl::SortChildrenCB这个函数用来实现对树控件的个性化排序,但是,由于这个函数本身的缺陷,初学者很难自如的使用这个函数来对树进行排序,往往失败了还不知道是什么原因。在这里,我将详细介绍一下SortChildrenCB的用法。
首先看看SortChildrenCB的定义:
BOOL SortChildrenCB( LPTVSORTCB pSort );
typedef struct tagTVSORTCB
{
HTREEITEM hParent;
PFNTVCOMPARE lpfnCompare;
LPARAM lParam;
} TVSORTCB, *LPTVSORTCB;
解释一下各个参数的含义:
LPTVSORTCB psort 这是一个结构体,包含了执行本函数必须的数据。
hParent 这个参数标志的是一个树的某一项,我们要排序的,就是这个项的子项。
lpfnCompare 这个参数标志的是一个很重要的回调函数,下面会单独介绍。
lParam 这个参数是指向要排序的树控件的指针
我刚才说到,lpfnCompare是一个很重要的参数,这是因为它所标志的回调函数,将直接影响到排序的结果:
typedef int (CALLBACK *PFNTVCOMPARE)(
LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort);
这就是排序回调函数的定义。
假如你用过STL,就一定知道qsort(),这个快速排序函数也要引用一个回调函数来判别两个数据项的大小,TreeCtrl的这个回调函数,恰好类似于qsort的回调函数。当我们认为第一个项应该靠前时,返回一个负数;当我们需要颠倒两个项时,返回一个整数;当我们认为两个项等价时,我们返回0。这样的定义,恰好和strcmp的返回值相同,因此我们可以很容易的写出与SortChildren等价的回调函数:
int CALLBACK CTestIconDlg::MyCompareProc(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
CTreeCtrl* pTree = (CTreeCtrl *) lParamSort;
CString strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
CString strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);
return strcmp(strItem2, strItem1);
}
在这里,我要着重说明两点:
第一,看到lParamSort了吗?它就是你刚才为TVSORTCB::lParam所赋的值。
第二,lParam1和lParam2是什么?树的两个项的data,你可以用SetItemData来指定。在刚才的例子里面,我们可以断定它是曾经执行了类似于
HTREEITEM hLeaf = m_Tree.InsertItem(&tciItem);
m_Tree.SetItemData(hLeaf, (DWORD)hLeaf);
的代码。在这段代码里面,该项的HTREEITEM被设置成了自身的Data。这很关键,因为这个值就是排序的依据。
好了,对于就介绍CTreeCtrl::SortChildren就介绍到这里
分享到:
相关推荐
CTreeCtrl的功能.如移动.添加.删除节点 CTreeCtrl添加删除节点
增加顶级节点:TreeView.Nodes.Add("Key...,通过CTreeCtrl控件的节点的变化,让不同的Dialog交替地粘贴在主Dialog上,从而方便于我们只用少数的窗口,调用更多的功能模块,不必再为每个模块都作为弹出窗口,而显得繁杂
很详细的详解CTreeCtrl,非常完整
CTreeCtrl 和 CListCtrl 应用实例
CTreeCtrl控件重绘总汇,内含八十多个源码
VC CTreeCtrl 空间的使用 VC CTreeCtrl 空间的使用 VC CTreeCtrl 空间的使用
关于CTreeCtrl的一些操作方法,CTreeCtrl
MFC CTreeCtrl 动态让节点前面出现+ ,源码,已验证,现在资源网上好难找,很多都不对,过时了好多。还是要研究透啊
CTreeCtrl(树状控件)用法CTreeCtrl(树状控件)用法CTreeCtrl(树状控件)用法
CtreeCtrl控件向CLISTCTRL控件的拖拽
一个ctreectrl控制checkbox显示、隐藏的代码,有兴趣可以关注下。声明:此程序来源于网络,经本人部分修改。
如何对CTreeCtrl遍历VC编程中,若要展现一个树形结构,我们基本都会继承CTreeCtrl进行扩展。通过InsertItem、SetItemData等操作可以建立起一颗树并展现出来。对树的操作,最常用的就是遍历和查找。如何遍历一个...
CTreeCtrl类的递归使用CTreeCtrl类的递归使用.rar
在VS2010下可编译运行,MFC CtreeCtrl 保存为.xml格式,提供 bool LoadXmlFile(CTreeCtrl& m_tree, string& szFileName) 函数保存MFC CtreeCtrl,并提供 bool CreateXmlFile(CTreeCtrl& m_tree, string& ...
CtreeCtrl控件的遍历和查找,让你更加全面的了解和掌握树形控件。
MFC 中 CListCtrl 已经有 集成类 CMFCListCtrl,实现 单行高亮,多行选择。但是 CTreeCtrl 却没有,纵观网络 也没有完整的实现,今天 贡献给大家
实现了Ctreectrl控件对数据项的查找定位和路径的打开。
可多选进行拖拽删除的CTreeCtrl.rar
同事给的一个资源,自己稍作修改以满足自己的需要。一来传播经典二来留作日后自己使用。
CTreeCtrl目录树遍历,提供了两种遍历目录树的方式,循环,递归。