`
shangjava
  • 浏览: 1229547 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

探讨CtreeCtrl::SortChildrenCB

阅读更多

探讨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所赋的值。

第二,lParam1lParam2是什么?树的两个项的data,你可以用SetItemData来指定。在刚才的例子里面,我们可以断定它是曾经执行了类似于

HTREEITEM hLeaf = m_Tree.InsertItem(&tciItem);

m_Tree.SetItemData(hLeaf, (DWORD)hLeaf);

的代码。在这段代码里面,该项的HTREEITEM被设置成了自身的Data。这很关键,因为这个值就是排序的依据。

好了,对于就介绍CTreeCtrl::SortChildren就介绍到这里
分享到:
评论

相关推荐

    【树控件CTreeCtrl】控件应用第二十二课

    例如,`CTreeCtrl::GetItemRect`可以获取节点的矩形区域,`CTreeCtrl::SetItemTextColor`和`CTreeCtrl::SetItemState`可以改变节点的文字颜色和状态。此外,`NMTVCUSTOMDRAW`结构提供了关于当前绘制操作的详细信息,...

    使用CMarkup创建XML和初始化XML到CTREECTRL

    3. **递归解析XML并添加子节点**:通过遍历XML文档,为每个元素创建一个树节点,并用`CTreeCtrl::InsertItem()`插入。属性可以作为附加信息存储在自定义结构中,或以其他方式关联到树节点。 4. **设置节点文本**:...

    实现treeview的操作

    可以使用`CTreeCtrl::SetItemData`将任意数据关联到节点,然后在需要时通过`CTreeCtrl::GetItemData`获取。这对于存储与节点相关的复杂信息很有用。 8. **自定义绘图** 如果需要自定义节点的显示,可以重载`...

    VS2015做的CTreeCtrl三态树

    4. **处理节点状态**:在消息处理函数中,使用`CTreeCtrl::GetItemState`和`CTreeCtrl::SetItemState`方法来获取和设置节点的状态。三态通常表示为TVIS_SELECTED、TVIS_DROPHILITED和自定义的中间状态。 5. **...

    MFC Tree Control

    这通常通过调用`CTreeCtrl::EditLabel`函数实现,该函数会弹出一个编辑框,允许用户修改选中的节点文本。在编辑完成后,你需要处理`TVN_ENDLABELEDIT`通知,以接收并确认新的节点文本。 ```cpp void CMyTreeCtrl::...

    MFC.design.tree.control.font.rar_MFC tree_MFC树形控件_tree_tree cont

    在`CTreeCtrl::DrawItem`或`CTreeCtrl::MeasureItem`回调中,使用`CDC`类的`SelectObject`方法选择这些对象,并在绘制节点时应用。 3. **消息处理**:为了响应用户的字体更改操作,可能需要重载消息处理函数,例如`...

    CTreeCtrl添加.删除节点

    首先,你需要在类定义中包含头文件`#include &lt;afxctl.h&gt;`,然后在成员变量声明中包含CTreeCtrl: ```cpp class CMyDialog : public CDialog { // ... CTreeCtrl m_treeCtrl; // ... }; ``` 接着,在 ...

    Vc树形控件的拖动

    根据鼠标当前位置和开始拖动时的位置,确定目标位置,然后调用`CTreeCtrl::DeleteItem`删除原节点,或者使用`CTreeCtrl::InsertItem`在新位置插入节点。 在实现过程中,还需要注意以下几点: - **消息映射**:确保...

    CTreeCtrl控件重绘总汇

    2. **OnDrawItem()**:覆盖MFC的`CTreeCtrl::OnDrawItem()`虚函数,可以自定义每个节点的绘制逻辑,包括文字、图标等。 3. **OnMeasureItem()**:如果需要调整节点大小,可重写`CTreeCtrl::OnMeasureItem()`,返回...

    CTreeCtrl+Access+Icon

    3. 设置节点图标:在插入或修改节点时,使用`CTreeCtrl::SetItem()`函数,指定`hItem`(节点句柄)、`mask`(标志,如TVIF_IMAGE和TVIF_SELECTEDIMAGE)、`iImage`(正常状态下图标的索引)和`iSelectedImage`(选中...

    mfc ctreectrl 中节点拖动的实现

    CTreeCtrl::PreCreateWindow(cs); } ``` 2. **注册拖放标识符**: 在类的初始化部分,使用 `RegisterDragDrop()` 注册一个IDropTarget接口,使得控件可以成为拖放的目标。 ```cpp HRESULT CMyTreeCtrl::...

    VC++ 带背景的树形控件

    同时,为了确保树形控件的文本和图标能正常显示,需要在绘制背景之后调用`CTreeCtrl::DrawItem()`、`CTreeCtrl::MeasureItem()`和`CTreeCtrl::DeleteItem()`等方法。 对于添加和删除节点,`CMyTreeCtrl`类可能会...

    CTreeCtrl 和 CListCtrl 应用实例

    #### CTreeCtrl: 构建树形结构 `CTreeCtrl`是MFC中的一个类,用于在窗口中创建树形视图,如文件夹结构。在这个实例中,我们首先从`CTreeCtrl`派生出一个新类`CDirTreeCtrl`,以便更好地控制树形控件的行为。这个新...

    CTreectrl控件选择性选中节点

    本资源主要探讨的是如何在CTreeCtrl控件中实现选择性选中节点的功能。 CTreeCtrl控件是Windows API中的TVN_SELCHANGING和TVN_SELCHANGED消息处理的扩展,允许用户在树形视图中选择或取消选择单个或多个节点。实现...

    CTreeCtrl树结构的创建与读取

    以下是一个简单的例子,展示如何创建并填充一个CTreeCtrl: ```cpp class CMyDlg : public CDialogEx { public: CTreeCtrl m_treeCtrl; // ...其他成员和构造函数 protected: virtual void DoDataExchange...

    实现了很多CTreeCtrl的功能.如移动.添加.删除节点等

    在Windows编程领域,`CTreeCtrl` 是一个非常重要的控件,它被广泛用于创建具有层级结构的视图,比如文件资源管理器中的目录树。`CTreeCtrl` 是MFC(Microsoft Foundation Classes)库中对Windows API的`HTREEITEM`...

    CTreeCtrl节点拖拽/高亮

    这通常涉及到调用`CTreeCtrl::DeleteItem()`删除源节点,再使用`InsertItem()`在新位置插入。 **二、CTreeCtrl节点高亮** 高亮节点通常是用户选中或悬停时的一种视觉反馈。可以通过以下方式实现: 1. 重写`...

    ClistCtrl中嵌套ctreeCtrl(supergrid)

    本文将深入探讨如何在CListCtrl中嵌套CTreeCtrl,实现一个名为“supergrid”的功能,这是通过开源项目在VS2010上实际测试并验证的方法。 首先,让我们理解这两个控件的基本概念: 1. **CListCtrl**:CListCtrl控件...

    CtreeCtrl checkbox 显示隐藏

    在Windows编程中,`CtreeCtrl` 是MFC(Microsoft Foundation Classes)库提供的一种控件,用于实现树形视图。这个控件常用于GUI应用程序,以展示分层的数据结构,比如文件系统或者项目结构。在`CtreeCtrl` 中添加复...

Global site tag (gtag.js) - Google Analytics