我一直在使用 WinAPI 开发 TreeView 系统。我围绕一些功能构建了包装器,这些功能允许我在控件中插入新项目、删除项目和移动项目。然而,移动元素似乎是一件让人头疼的事情。我在 MSDN ( http://msdn.microsoft.com/en-us/library/aa925848.aspx ) 中找不到任何可以解决我的问题的函数。
因此,我不得不创建一个肮脏的黑客来保存项目的属性,删除旧项目并将项目插入新位置。这是一个小代码片段:
TVITEM tvitem;
char chrTextBuffer[33];
tvitem.mask = TVIF_TEXT;
tvitem.cchTextMax = sizeof(chrTextBuffer); // \0 termination included?
tvitem.pszText = chrTextBuffer;
tvitem.hItem = olditem; // different in the original code, don't want to post the entire function
TreeView_GetItem(GUIVars.Controls.GUI_Chat.ChannelTree, &tvitem);
TVITEM 结构用于检索有关项目的信息。我不会详细解释这些结构,因为现在不重要。那么,这些信息现在被插入到 TV_INSERTSTRUCT 中并通过
发送到 TreeViewTreeView_Insert(mytreeview, &insertstruct);
旧项目被删除:
TreeView_DeleteItem(mytreeview, olditem);
显然,这很脏。是否还有其他可能性来实现所需的功能?我只在 Pelles C for Windows ( http://www.smorgasbordet.com/pellesc/ ) 中使用纯 WinAPI,所以库不是选项。
此外,我不得不考虑一种方法,让所有的 child 和 child 的 child 也能移动。每个项目都保存在一个结构中(在 HTREEITEM 句柄中)
struct cTreeItem
{
uint8 Type;
uint8 Used;
uint16 Depth;
int32 ParentID;
HTREEITEM Handle;
};
提供信息,尤其是 ParentID。我可以循环遍历我所有的项目(它们都保存在一个动态分配的增长数组中)并检查它们的 ParentID 是否与必须移动的节点之一匹配,直到我到达项目深度的最后一级,但是 native 替代当然会更好。
我希望我的问题是可以理解的,我需要一种方法来移动 TreeView 中的项目,最好也移动他们的 child 和 child 的 child (...)。
编辑: 顺便说一句,我发现了很多解决这个问题的方法,但不幸的是只在 C#、VB 等中。
最佳答案
TreeView 公共(public)控件不支持将项目移动到新父级。如果你想相对于它的 sibling 移动一个项目(但仍然在同一个 parent 之下),你可以使用 TreeView_SortChildrenCB
并传递一个自定义排序函数,按照你想要的方式对 child 进行排序。
关于c - 在 Windows 中移动 TreeView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445204/