0

雷蒙德陈写道:

TreeView公共控件不支持将项目移动到新的父级。如果你想>移动一个项目相对于它的兄弟姐妹(但保持在同一个父级下),你可以使用 >TreeView_SortChildrenCB并传递一个自定义排序函数,该函数对子级排序你>想要的方式。”

是否有任何地方确切地说明如何TreeView_SortChildrenCB根据任意顺序调用排序(例如,排序双精度数或字符串)?对于经验丰富的 C++ 程序员但不熟悉此功能的人来说,该文档一目了然。

谢谢。

4

1 回答 1

0

首先,您填充 TVSORTCB 的一个实例。hParent 应该是您希望在其下排序的树中的项目,lpfnCompare 应该是一个看起来像这样的静态函数

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    /*your casting of lParams and sorting code here*/
}

该函数的目的是确定 lParam1 是否“小于”lParam2。

结构中的 lParam 值是您希望作为回调 (lParamSort) 的第三个参数传递的任何值,可以为 0

然后将该结构实例的地址作为 TreeView_SortChildrenCB 的第二个参数传递

传递给回调 (lParam1/2) 的 2 个参数是与插入到树中的每个项目相关联的值。在大多数(如果不是所有)常用控件上,您可以将 lParam 值与控件中的每个可选项目相关联。在这种情况下,这是您传递给 TreeView_InsertItem ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb773898(v=vs.85)的 TVINSERTSTRUCT 中 TVITEM 结构中的 lParam 值。 .aspx )

通常这只是一个包含字符串或其他可比较结构的表的索引。如果您将 TVSORTCB 的 lParam 设置为指向该表,则该表可能可以通过将回调的第三个参数转换为该表结构来访问。

抱歉,如果不清楚。win32 api 倾向于过度使用 lParam 机制来将数据与 GUI API 中的几乎每个句柄相关联。不要陷入分配字符串/结构并将新内存地址分配给树项的 lParam 的陷阱。如果您未能删除树中每个项目的分配,您将泄漏内存。

于 2012-07-03T21:17:12.447 回答