Raymond Chen写道:
“
TreeView
公共控件不支持将项目移动到新父项。如果您想要>相对于其兄弟项目移动项目(但保留在同一父项下),您可以使用> { {1}}并传递一个自定义排序功能,按照您想要的方式命令孩子。“
有没有一个例子,究竟如何调用TreeView_SortChildrenCB
按照任意顺序排序(例如,排序双打或字符串)?对于经验丰富的C ++程序员但不熟悉此功能的人来说,文档是清楚的。
感谢。
答案 0 :(得分: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)是与插入树中的每个项关联的值。在大多数情况下,如果不是所有常用控件,您可以将lParam值与控件中的每个可选项相关联。在这种情况下,这是TVINSERTSTRUCT中TVITEM结构中传递给TreeView_InsertItem(http://msdn.microsoft.com/en-us/library/windows/desktop/bb773898(v=vs.85).aspx)
的lParam值这通常只是包含字符串或其他可比较结构的表的索引。如果将TVSORTCB的lParam设置为指向该表,则可以通过将回调的第三个参数转换为该表结构来访问该表。
很抱歉,如果不清楚的话。 win32 api倾向于过度使用lParam机制将数据与GUI API中的几乎每个句柄相关联。不要陷入分配字符串/结构的陷阱,并将新内存的地址分配到树项的lParam中。如果您未能删除树中每个项目的分配,则会泄漏内存。