mfc CTreeCtrl 树控件排序

使用场景

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);
}

猜你喜欢

转载自blog.csdn.net/qiangzi4646/article/details/80832918