【问题标题】:Moving TreeView items in Windows在 Windows 中移动 TreeView 项目
【发布时间】: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 并通过

发送到 TreeView
TreeView_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。

标签: c windows winapi


【解决方案1】:

TreeView 通用控件不支持将项目移动到新父级。如果你想相对于它的兄弟移动一个项目(但仍然在同一个父级下),你可以使用TreeView_SortChildrenCB 并传递一个自定义排序函数,按照你想要的方式对子级进行排序。

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多