# winex.ctrl.treeview 库模块帮助文档

<details>  <summary>使用说明</summary>  <p>

绑定外部进程的标准 SysTreeView32 控件，复用 win.ui.ctrl.treeview 的节点导航、
遍历、查找、选中、展开、折叠等方法。文本使用 Unicode，结构体和文本缓冲区均在目标进程中分配。

- 当前支持 32 位目标进程（包括 64 位 Windows 上的 32 位程序）。64 位目标会明确返回 null,err，避免截断 HTREEITEM。
- 构造失败返回 null,err。目标程序权限高于调用方时，需要以相同权限运行调用方。
- 节点句柄是 pointer，窗口句柄 hwnd 是数值。不要将目标进程中的地址作为本地指针解引用。
- getItem/setItem 支持 TVITEMW 的基本字段，不支持 TVITEMEX。
- getItemData/setItemData 是调用方本地的关联数据。外部节点的原生 lParam 请通过 getItem/setItem 的 mask=4 访问；不要解引用该地址。
- 不支持外部窗口的 onnotify/onSelChanged 等事件，不应调用通知结构解析方法或设置本地 imageList。
- free() 仅释放本对象持有的进程资源。不要用 close() 释放绑定，它会关闭目标控件。
- each/enum 仅遍历已经存在的节点，不自动展开。find 多级查找会展开途中节点，expandAll 会主动展开整棵子树，目标程序可能因此加载大量数据。

</p></details>

[使用指南](https://www.aardio.com/zh-cn/docs/library/winex/ctrl/treeview/)

## winex.ctrl 成员列表 <a id="winex.ctrl" href="#winex.ctrl">&#x23;</a>

### winex.ctrl.treeview <a id="winex.ctrl.treeview" href="#winex.ctrl.treeview">&#x23;</a>
用于控制外部进程的标准树形控件  
当前支持32位目标进程，不支持外部窗口事件

### winex.ctrl.treeview() <a id="winex.ctrl.treeview" href="#winex.ctrl.treeview">&#x23;</a>
[返回对象:winexTreeviewObject](#winexTreeviewObject)

### winex.ctrl.treeview(外部进程树控件句柄) <a id="winex.ctrl.treeview" href="#winex.ctrl.treeview">&#x23;</a>
绑定 SysTreeView32 控件  
失败返回 null,err

## winexTreeviewObject 成员列表 <a id="winexTreeviewObject" href="#winexTreeviewObject">&#x23;</a>

### winexTreeviewObject.checkAll(节点句柄,是否勾选) <a id="winexTreeviewObject.checkAll" href="#winexTreeviewObject.checkAll">&#x23;</a>
设置子树复选框并更新祖先状态

### winexTreeviewObject.clear(节点句柄) <a id="winexTreeviewObject.clear" href="#winexTreeviewObject.clear">&#x23;</a>
清空指定节点的子节点；省略参数删除全部节点

### winexTreeviewObject.collapse(节点句柄) <a id="winexTreeviewObject.collapse" href="#winexTreeviewObject.collapse">&#x23;</a>
折叠节点，省略节点使用选中项

### winexTreeviewObject.count <a id="winexTreeviewObject.count" href="#winexTreeviewObject.count">&#x23;</a>
当前已存在的节点总数

### winexTreeviewObject.delItem(节点句柄) <a id="winexTreeviewObject.delItem" href="#winexTreeviewObject.delItem">&#x23;</a>
删除节点及其子树；此操作会改变目标程序数据

### winexTreeviewObject.each(父节点句柄) <a id="winexTreeviewObject.each" href="#winexTreeviewObject.each">&#x23;</a>
返回直接子节点迭代器：for hItem in tv.each(parent){}，省略父节点表示根层

### winexTreeviewObject.ensureVisible(节点句柄) <a id="winexTreeviewObject.ensureVisible" href="#winexTreeviewObject.ensureVisible">&#x23;</a>
展开祖先并滚动到指定节点

### winexTreeviewObject.enum(回调函数,父节点句柄) <a id="winexTreeviewObject.enum" href="#winexTreeviewObject.enum">&#x23;</a>
深度遍历已有子节点；回调(hItem,parent)返回false停止

### winexTreeviewObject.enumParent(回调函数,节点句柄) <a id="winexTreeviewObject.enumParent" href="#winexTreeviewObject.enumParent">&#x23;</a>
向上遍历祖先；回调(parent,child)返回false停止

### winexTreeviewObject.expand(节点句柄) <a id="winexTreeviewObject.expand" href="#winexTreeviewObject.expand">&#x23;</a>
展开节点，省略节点使用选中项

### winexTreeviewObject.expandAll(节点句柄) <a id="winexTreeviewObject.expandAll" href="#winexTreeviewObject.expandAll">&#x23;</a>
先展开父节点再递归展开所有子节点；省略节点展开整棵树，可能加载大量数据

### winexTreeviewObject.find(父节点,子项文本,...) <a id="winexTreeviewObject.find" href="#winexTreeviewObject.find">&#x23;</a>
按精确文本逐级查找，父节点参数可省略；会展开途中的父节点

### winexTreeviewObject.findPath(父节点,路径字符串) <a id="winexTreeviewObject.findPath" href="#winexTreeviewObject.findPath">&#x23;</a>
按反斜杠分隔的路径逐级查找，父节点参数可省略

### winexTreeviewObject.free() <a id="winexTreeviewObject.free" href="#winexTreeviewObject.free">&#x23;</a>
释放进程控制句柄与临时资源，不关闭目标程序或控件

### winexTreeviewObject.getChecked(节点句柄) <a id="winexTreeviewObject.getChecked" href="#winexTreeviewObject.getChecked">&#x23;</a>
返回复选框勾选状态，无状态图像时为false

### winexTreeviewObject.getChildItem(节点句柄) <a id="winexTreeviewObject.getChildItem" href="#winexTreeviewObject.getChildItem">&#x23;</a>
返回第一个子节点

### winexTreeviewObject.getChildren(父节点句柄) <a id="winexTreeviewObject.getChildren" href="#winexTreeviewObject.getChildren">&#x23;</a>
返回直接子节点句柄数组，省略父节点表示根层

### winexTreeviewObject.getFirst() <a id="winexTreeviewObject.getFirst" href="#winexTreeviewObject.getFirst">&#x23;</a>
返回第一个根节点，节点句柄为pointer

### winexTreeviewObject.getFirstVisible() <a id="winexTreeviewObject.getFirstVisible" href="#winexTreeviewObject.getFirstVisible">&#x23;</a>
返回第一个可见节点

### winexTreeviewObject.getItem(节点句柄或TVITEM属性表) <a id="winexTreeviewObject.getItem" href="#winexTreeviewObject.getItem">&#x23;</a>
读取外部节点的基本TVITEMW字段  
默认读取文本，mask=0x7F可读取全部基本字段；返回包含text等字段的结构体

### winexTreeviewObject.getItemData(节点句柄) <a id="winexTreeviewObject.getItemData" href="#winexTreeviewObject.getItemData">&#x23;</a>
获取调用方本地关联数据，并非目标节点原生lParam

### winexTreeviewObject.getItemPath(节点句柄) <a id="winexTreeviewObject.getItemPath" href="#winexTreeviewObject.getItemPath">&#x23;</a>
返回从根到指定节点的文本路径；省略节点使用选中项

### winexTreeviewObject.getItemRect(节点句柄,仅文本区域) <a id="winexTreeviewObject.getItemRect" href="#winexTreeviewObject.getItemRect">&#x23;</a>
返回控件客户区设备像素矩形，失败返回null  

[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### winexTreeviewObject.getItemState(节点句柄,状态掩码) <a id="winexTreeviewObject.getItemState" href="#winexTreeviewObject.getItemState">&#x23;</a>
获取节点状态，默认掩码为0xF000

### winexTreeviewObject.getItemText(节点句柄,缓冲区长度) <a id="winexTreeviewObject.getItemText" href="#winexTreeviewObject.getItemText">&#x23;</a>
读取Unicode节点文本，省略节点使用选中项  
省略长度时自动扩容至最多32768个UTF-16单元；指定长度时允许截断

### winexTreeviewObject.getNextItem(节点句柄,TVGN选项) <a id="winexTreeviewObject.getNextItem" href="#winexTreeviewObject.getNextItem">&#x23;</a>
按TVGN选项返回相关节点，默认后一个兄弟节点

### winexTreeviewObject.getNextSibling(节点句柄) <a id="winexTreeviewObject.getNextSibling" href="#winexTreeviewObject.getNextSibling">&#x23;</a>
返回后一个兄弟节点

### winexTreeviewObject.getNextVisible(节点句柄) <a id="winexTreeviewObject.getNextVisible" href="#winexTreeviewObject.getNextVisible">&#x23;</a>
返回后一个可见节点

### winexTreeviewObject.getParentItem(节点句柄) <a id="winexTreeviewObject.getParentItem" href="#winexTreeviewObject.getParentItem">&#x23;</a>
返回父节点

### winexTreeviewObject.getPrevSibling(节点句柄) <a id="winexTreeviewObject.getPrevSibling" href="#winexTreeviewObject.getPrevSibling">&#x23;</a>
返回前一个兄弟节点

### winexTreeviewObject.getPrevVisible(节点句柄) <a id="winexTreeviewObject.getPrevVisible" href="#winexTreeviewObject.getPrevVisible">&#x23;</a>
返回前一个可见节点

### winexTreeviewObject.getRoot() <a id="winexTreeviewObject.getRoot" href="#winexTreeviewObject.getRoot">&#x23;</a>
返回_TVI_ROOT伪句柄，不是真实节点

### winexTreeviewObject.getSelection() <a id="winexTreeviewObject.getSelection" href="#winexTreeviewObject.getSelection">&#x23;</a>
返回当前选中节点

### winexTreeviewObject.hitTest(x,y,是否屏幕坐标) <a id="winexTreeviewObject.hitTest" href="#winexTreeviewObject.hitTest">&#x23;</a>
返回节点句柄和TVHT标志；坐标使用设备像素，允许0坐标

### winexTreeviewObject.hwnd <a id="winexTreeviewObject.hwnd" href="#winexTreeviewObject.hwnd">&#x23;</a>
外部树控件窗口句柄（数值）

### winexTreeviewObject.insertItem(文本或节点表或数组,父节点,前一兄弟节点) <a id="winexTreeviewObject.insertItem" href="#winexTreeviewObject.insertItem">&#x23;</a>
插入Unicode节点，支持children子树；成功返回新节点句柄

### winexTreeviewObject.isExpanded(节点句柄) <a id="winexTreeviewObject.isExpanded" href="#winexTreeviewObject.isExpanded">&#x23;</a>
返回是否已展开

### winexTreeviewObject.isExpandedOnce(节点句柄) <a id="winexTreeviewObject.isExpandedOnce" href="#winexTreeviewObject.isExpandedOnce">&#x23;</a>
返回是否曾经展开

### winexTreeviewObject.process <a id="winexTreeviewObject.process" href="#winexTreeviewObject.process">&#x23;</a>
目标进程控制对象  

[返回对象:processObject](https://www.aardio.com/zh-cn/docs/library-reference/process/_.html#processObject)

### winexTreeviewObject.setChecked(节点句柄,是否勾选) <a id="winexTreeviewObject.setChecked" href="#winexTreeviewObject.setChecked">&#x23;</a>
设置复选框状态，默认勾选

### winexTreeviewObject.setItem(TVITEM属性表) <a id="winexTreeviewObject.setItem" href="#winexTreeviewObject.setItem">&#x23;</a>
修改外部节点，自动推断mask；成功返回true

### winexTreeviewObject.setItemData(节点句柄,数据) <a id="winexTreeviewObject.setItemData" href="#winexTreeviewObject.setItemData">&#x23;</a>
保存调用方本地关联数据，不向目标进程传递aardio对象

### winexTreeviewObject.setItemState(节点句柄,状态,状态掩码) <a id="winexTreeviewObject.setItemState" href="#winexTreeviewObject.setItemState">&#x23;</a>
修改节点状态，默认掩码为0xF000

### winexTreeviewObject.setItemText(节点句柄,文本) <a id="winexTreeviewObject.setItemText" href="#winexTreeviewObject.setItemText">&#x23;</a>
设置节点文本；也可仅传文本修改当前选中节点

### winexTreeviewObject.setSelected(节点句柄) <a id="winexTreeviewObject.setSelected" href="#winexTreeviewObject.setSelected">&#x23;</a>
选中节点；省略节点清除选中

### winexTreeviewObject.threadId <a id="winexTreeviewObject.threadId" href="#winexTreeviewObject.threadId">&#x23;</a>
目标控件线程ID

### winexTreeviewObject.toggle(节点句柄) <a id="winexTreeviewObject.toggle" href="#winexTreeviewObject.toggle">&#x23;</a>
切换展开或折叠状态

### winexTreeviewObject.visibleCount <a id="winexTreeviewObject.visibleCount" href="#winexTreeviewObject.visibleCount">&#x23;</a>
控件客户区可容纳的可见行数
