函数原型:BOOL CTreeCtrl::SortChildrenCB(_In_ LPTVSORTCB pSort)
LPVSORTCB结构:
typedef struct tagTVSORTCB
{
HTREEITEM hParent;
PFNTVCOMPARE lpfnCompare;
LPARAM lParam;
} TVSORTCB, *LPTVSORTCB;
PFUNTVCOMPARE是个函数指针
typedef int (CALLBACK *PFNTVCOMPARE)(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
hParent:需要排序的节点的父节点
lParam:PFNTVCOMPARE函数的第三个参数
下面开始写一个简单的例子:
1.初始界面为 一个树控件, 和三个按钮,三个按钮分别执行三种排序方式
点击“按字符串排序”实现代码,
void CSortITemDlg::OnBnClickedButton1()
{
TVSORTCB sortcb;
sortcb.hParent = m_Tree.GetRootItem();
sortcb.lParam = (LPARAM)&m_Tree;
sortcb.lpfnCompare = &SortByChar;
m_Tree.SortChildrenCB(&sortcb);
m_Tree.Expand(sortcb.hParent, TVE_EXPAND);
}
实现实现效果
点击“按数值排序” 代码
void CSortITemDlg::OnBnClickedButton2()
{
//
TVSORTCB sortcb;
sortcb.hParent = m_Tree.GetRootItem();
sortcb.lParam = (LPARAM)&m_Tree;
sortcb.lpfnCompare = &SortByNumber;
m_Tree.SortChildrenCB(&sortcb);
m_Tree.Expand(sortcb.hParent, TVE_EXPAND);
}
实现效果
点击“奇数在前”代码
void CSortITemDlg::OnBnClickedButton3()
{
//SortByOdd
TVSORTCB sortcb;
sortcb.hParent = m_Tree.GetRootItem();
sortcb.lParam = (LPARAM)&m_Tree;
sortcb.lpfnCompare = &SortByOdd;
m_Tree.SortChildrenCB(&sortcb);
m_Tree.Expand(sortcb.hParent, TVE_EXPAND);
}
实现效果:
最重要的时插入节点时 要调用 SetItemData();否则的话 不会有任何效果 。
注意CtreeCtrl的插入函数有一个版本时这样的
HTREEITEM CTreeCtrl::InsertItem(_In_ LPTVINSERTSTRUCT lpInsertStruct)
设置lpInsertStruct.item.lParam设置的值和SetItemData()设置的是同一个值。