探讨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::GetItemRect`可以获取节点的矩形区域,`CTreeCtrl::SetItemTextColor`和`CTreeCtrl::SetItemState`可以改变节点的文字颜色和状态。此外,`NMTVCUSTOMDRAW`结构提供了关于当前绘制操作的详细信息,...
3. **递归解析XML并添加子节点**:通过遍历XML文档,为每个元素创建一个树节点,并用`CTreeCtrl::InsertItem()`插入。属性可以作为附加信息存储在自定义结构中,或以其他方式关联到树节点。 4. **设置节点文本**:...
可以使用`CTreeCtrl::SetItemData`将任意数据关联到节点,然后在需要时通过`CTreeCtrl::GetItemData`获取。这对于存储与节点相关的复杂信息很有用。 8. **自定义绘图** 如果需要自定义节点的显示,可以重载`...
4. **处理节点状态**:在消息处理函数中,使用`CTreeCtrl::GetItemState`和`CTreeCtrl::SetItemState`方法来获取和设置节点的状态。三态通常表示为TVIS_SELECTED、TVIS_DROPHILITED和自定义的中间状态。 5. **...
这通常通过调用`CTreeCtrl::EditLabel`函数实现,该函数会弹出一个编辑框,允许用户修改选中的节点文本。在编辑完成后,你需要处理`TVN_ENDLABELEDIT`通知,以接收并确认新的节点文本。 ```cpp void CMyTreeCtrl::...
在`CTreeCtrl::DrawItem`或`CTreeCtrl::MeasureItem`回调中,使用`CDC`类的`SelectObject`方法选择这些对象,并在绘制节点时应用。 3. **消息处理**:为了响应用户的字体更改操作,可能需要重载消息处理函数,例如`...
首先,你需要在类定义中包含头文件`#include <afxctl.h>`,然后在成员变量声明中包含CTreeCtrl: ```cpp class CMyDialog : public CDialog { // ... CTreeCtrl m_treeCtrl; // ... }; ``` 接着,在 ...
根据鼠标当前位置和开始拖动时的位置,确定目标位置,然后调用`CTreeCtrl::DeleteItem`删除原节点,或者使用`CTreeCtrl::InsertItem`在新位置插入节点。 在实现过程中,还需要注意以下几点: - **消息映射**:确保...
2. **OnDrawItem()**:覆盖MFC的`CTreeCtrl::OnDrawItem()`虚函数,可以自定义每个节点的绘制逻辑,包括文字、图标等。 3. **OnMeasureItem()**:如果需要调整节点大小,可重写`CTreeCtrl::OnMeasureItem()`,返回...
3. 设置节点图标:在插入或修改节点时,使用`CTreeCtrl::SetItem()`函数,指定`hItem`(节点句柄)、`mask`(标志,如TVIF_IMAGE和TVIF_SELECTEDIMAGE)、`iImage`(正常状态下图标的索引)和`iSelectedImage`(选中...
CTreeCtrl::PreCreateWindow(cs); } ``` 2. **注册拖放标识符**: 在类的初始化部分,使用 `RegisterDragDrop()` 注册一个IDropTarget接口,使得控件可以成为拖放的目标。 ```cpp HRESULT CMyTreeCtrl::...
同时,为了确保树形控件的文本和图标能正常显示,需要在绘制背景之后调用`CTreeCtrl::DrawItem()`、`CTreeCtrl::MeasureItem()`和`CTreeCtrl::DeleteItem()`等方法。 对于添加和删除节点,`CMyTreeCtrl`类可能会...
#### CTreeCtrl: 构建树形结构 `CTreeCtrl`是MFC中的一个类,用于在窗口中创建树形视图,如文件夹结构。在这个实例中,我们首先从`CTreeCtrl`派生出一个新类`CDirTreeCtrl`,以便更好地控制树形控件的行为。这个新...
本资源主要探讨的是如何在CTreeCtrl控件中实现选择性选中节点的功能。 CTreeCtrl控件是Windows API中的TVN_SELCHANGING和TVN_SELCHANGED消息处理的扩展,允许用户在树形视图中选择或取消选择单个或多个节点。实现...
以下是一个简单的例子,展示如何创建并填充一个CTreeCtrl: ```cpp class CMyDlg : public CDialogEx { public: CTreeCtrl m_treeCtrl; // ...其他成员和构造函数 protected: virtual void DoDataExchange...
在Windows编程领域,`CTreeCtrl` 是一个非常重要的控件,它被广泛用于创建具有层级结构的视图,比如文件资源管理器中的目录树。`CTreeCtrl` 是MFC(Microsoft Foundation Classes)库中对Windows API的`HTREEITEM`...
这通常涉及到调用`CTreeCtrl::DeleteItem()`删除源节点,再使用`InsertItem()`在新位置插入。 **二、CTreeCtrl节点高亮** 高亮节点通常是用户选中或悬停时的一种视觉反馈。可以通过以下方式实现: 1. 重写`...
本文将深入探讨如何在CListCtrl中嵌套CTreeCtrl,实现一个名为“supergrid”的功能,这是通过开源项目在VS2010上实际测试并验证的方法。 首先,让我们理解这两个控件的基本概念: 1. **CListCtrl**:CListCtrl控件...
在Windows编程中,`CtreeCtrl` 是MFC(Microsoft Foundation Classes)库提供的一种控件,用于实现树形视图。这个控件常用于GUI应用程序,以展示分层的数据结构,比如文件系统或者项目结构。在`CtreeCtrl` 中添加复...