使用场景
CTreeCtrl 常被用来加载一个公司(具有许多分公司的公司)的组织架构,而公司的部门,最起码是一级部门,往往是需要排序的。类似于Windows资源管理器:
库 是根节点
Subversion
视频
图片
文档
迅雷下载
音乐
这些是根节点下的一级部门,而图片下面的
我的图片
共用图片
则为一级部门下的二级部门。
往往一级部门是需要排序的,好了不废话,下面贴代码:
排序实现
CTreeCtrl m_treeOrg;
HTREEITEM root_org;
//...
//部门排序
TVSORTCB tvs;
//根目录的一级部门排序
tvs.hParent = root_org;// CTreeCtrl 的根节点句柄 HTREEITEM
tvs.lpfnCompare = MyCompareProc;//设置比较函数
tvs.lParam = (LPARAM)&m_treeOrg;
m_treeOrg.SortChildrenCB(&tvs);
//每个一级部门下的二级部门全部排序
HTREEITEM hDepartment = m_treeOrg.GetChildItem(root_org);
while(NULL != hDepartment)
{
tvs.hParent = hDepartment;
tvs.lpfnCompare = MyCompareProc;
tvs.lParam = (LPARAM)&m_treeOrg;
m_treeOrg.SortChildrenCB(&tvs);
hDepartment = m_treeOrg.GetNextSiblingItem(hDepartment);
Sleep(1);
}
排序函数
//排序函数
int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//把该函数换成自己的规则
CMyTreeCtrl* pmyTreeCtrl = (CMyTreeCtrl*)lParamSort;
HTREEITEM hTreeItem1 = (HTREEITEM)lParam1;
HTREEITEM hTreeItem2 = (HTREEITEM)lParam2;
tagItemInfo pItemMSG1,pItemMSG2;//自定义保存单个节点数据的结构体
pmyTreeCtrl->getItemInfoData(hTreeItem1,pItemMSG1);
pmyTreeCtrl->getItemInfoData(hTreeItem2,pItemMSG2);
//排序规则1,按照给定的排序id进行排序
int nRank1 = pItemMSG1.nRankId;//子节点的排序id
int nRank2 = pItemMSG2.nRankId;
if (nRank1 < nRank2)
{
return -1;
}
else if (nRank1 > nRank2)
{
return 1;
}
else
{
return 0;
}
//排序规则2,按照节点名称进行字符串比较排序
CString strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM)lParam1);
CString strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM)lParam2);
return strItem2.Compare(strItem1);
}