【发布时间】:2011-12-09 12:01:56
【问题描述】:
我一直在使用 WinAPI 开发 TreeView 系统。我围绕一些函数构建了包装器,这些函数允许我在控件中插入新项目、删除项目和移动项目。然而,移动物品似乎是一件令人头疼的事情。我在 MSDN (http://msdn.microsoft.com/en-us/library/aa925848.aspx) 中找不到任何可以解决我的问题的函数。
因此,我必须创建一个dirty-hack 来保存项目的属性,删除旧项目并将项目插入新位置。这是一个小代码sn-p:
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,所以库不是选项。
此外,我必须考虑一种可以移动所有孩子和孩子的孩子的方法。每个项目都保存在一个结构中(在 HTREEITEM 句柄中)
struct cTreeItem
{
uint8 Type;
uint8 Used;
uint16 Depth;
int32 ParentID;
HTREEITEM Handle;
};
提供信息,尤其是 ParentID。我可以遍历我所有的项目(它们都保存在一个动态分配的增长数组中)并检查它们的 ParentID 是否与必须移动的节点之一匹配,直到我达到项目深度的最后一个级别,但这是一个原生的替代方案当然会更好。
我希望我的问题是可以理解的,我需要一种在 TreeView 中移动项目的方法,最好也移动他们的孩子和孩子的孩子 (...)。
编辑:顺便说一句,我发现很多东西可以解决这个问题,但不幸的是只在 C#、VB 等中。
【问题讨论】:
-
这是我的理解。移动模式需要删除和读取。不过,您可能可以保留 tvitem 结构而不是单个成员。
-
如果您找不到合适的本机实现,那么您可以使用 .NET 中的解决方案作为起点。 .NET Framework 深入使用 Win32 API,.NET DLL 的源代码可以使用 Telerik 的 JustDecompile(它是免费的)进行检查。所以我会做以下事情:(1)找到这个问题的标准C#解决方案(-> Google,MSDN:System.Windows.Forms命名空间,TreeView类),以及(2)研究这个C#代码每一步的实现在 .NET DLL 中使用 JustDecompile。