c - 在 Windows 中移动 TreeView 项目

标签 c windows winapi

我一直在使用 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 中并通过

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

相关文章:

c - 我的 C 代码在第二次循环运行时在 "realloc"函数中中断

c - 开关 - 默认不在 C 中工作

windows - 应用程序在任务栏上可见吗?

c# - 如何使用 VS Code(Windows 平台)编译控制台应用程序?

windows - 如何使用 Delphi 让 Toast 通知保留在 Windows 10 操作中心

winapi - CreateProcess 和奇怪的 nslookup 错误

c - 如何在 C 结构中使用函数指针?

mysql - 从 C 访问 MySQL 数据库

excel - VBA如何在有Windows句柄时使用FindWindowEx

c - 读取进程的起始地址和长度(虚拟内存映射)