<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1632085368384154" crossorigin="anonymous"></script><script src="https://autohotkey.top/gtag.js"></script></head> <body> <h1>TreeView</h1> <h2 id="toc">目录</h2> <ul> <li><a href="#Intro">入门和简单示例</a></li> <li><a href="#Options">选项参数的选项和样式</a></li> <li><a href="#BuiltIn">TreeView 的内置方法</a></li> <li><a href="#Events">事件</a></li> <li><a href="#Remarks">备注</a></li> <li><a href="#Examples">示例</a></li> </ul> <h2 id="Intro">入门和简单示例</h2> <p>TreeView 通过缩进父项目下的子项目来显示出层级关系. 最常见的例子是资源管理器的驱动器和文件夹树.</p> <p>TreeView 通常看起来像这样:</p> <img src="../static/ctrl_treeview.png" alt="TreeView" /> <p>创建 TreeView 的语法为:</p> <pre class="Syntax" id="GuiAdd">TV := GuiObj.<span class="func">Add</span>("TreeView", Options)</pre> <p>或:</p> <pre class="Syntax">TV := GuiObj.<span class="func">AddTreeView</span>(Options)</pre> <p>这是一个创建和显示简单项目层次结构的可运行脚本:</p> <pre>MyGui := Gui() TV := MyGui.Add("TreeView") <span class="red">P1</span> := <a href="#Add">TV.Add</a>("First parent") P1C1 := TV.Add("Parent 1's first child", <span class="red">P1</span>) <em>; 指定 P1 为此项目的父项目.</em> P2 := TV.Add("Second parent") P2C1 := TV.Add("Parent 2's first child", P2) P2C2 := TV.Add("Parent 2's second child", P2) P2C2C1 := TV.Add("Child 2's first child", P2C2) MyGui.Show <em>; 显示窗口和 TreeView.</em></pre> <h2 id="Options">Options 参数的选项和样式</h2> <p><strong>Background:</strong> 指定单词 <em>Background</em> 后面紧跟着颜色名称(请参阅<a href="../misc/Colors.htm">颜色图表</a>) 或 RGB 值(0x 前缀可以省略). 例如: <code>BackgroundSilver</code>, <code>BackgroundFFDD99</code>. 如果此选项不存在, 则 TreeView 初始的背景颜色默认为系统默认的背景颜色. 指定 <code>BackgroundDefault</code> 或 <code>-Background</code> 来应用系统的默认背景颜色(通常为白色). 例如, 使用 <code>TV.Opt("+BackgroundDefault")</code> 可以把 TreeView 恢复为默认的颜色.</p> <p><strong>Buttons:</strong> 指定 <code>-Buttons</code>(负 Buttons) 来避免在每个含有子项目的项目左边显示加号或减号按钮.</p> <p><strong>C:</strong> 文本颜色. 指定字母 C 后面紧跟着颜色名称(请参阅<a href="../misc/Colors.htm">颜色图表</a>) 或 RGB 值(0x 前缀可以省略). 例如: <code>cRed</code>, <code>cFF2211</code>, <code>c0xFF2211</code>, <code>cDefault</code>.</p> <p id="Checked"><strong>Checked:</strong> 在每项的左边提供一个复选框. 当<a href="#Add">添加</a>项目时, 在其选项中指定单词 <em>Check</em> 来让复选框初始为选中而不是未选中状态. 用户可以点击复选框或按下空格键来选中或取消选中项目. 要找出 TreeView 中当前选中了哪些项目, 请调用 <a href="#GetNext">GetNext 方法</a>或 <a href="#Get">Get 方法</a>.</p> <p><strong>HScroll:</strong> 指定 <code>-HScroll</code>(负 HScroll) 来禁用控件中的水平滚动(而且控件将不显示任何水平滚动条).</p> <p id="ImageList"><strong>ImageList:</strong> 这是把图标添加到 TreeView 的方法. 指定单词 <em>ImageList</em> 后紧跟着由之前调用 <a href="ListView.htm#IL_Create">IL_Create</a>. 返回的 ImageListID. 此选项仅在创建 TreeView 时才有效果(但是, <a href="#SetImageList">SetImageList 方法</a>没有此限制). 这里是一个可运行示例:</p> <pre>MyGui := Gui() ImageListID := <a href="ListView.htm#IL_Create">IL_Create</a>(10) <em>; 创建初始容量为 10 个图标的图像列表.</em> Loop 10 <em>; 加载一些标准系统图标到图像列表中.</em> <a href="ListView.htm#IL_Add">IL_Add</a>(ImageListID, "shell32.dll", A_Index) TV := MyGui.Add("TreeView", "ImageList" . ImageListID) <a href="#Add">TV.Add</a>("Name of Item", 0, "Icon4") <em>; 添加项目到 TreeView 并给它分配文件夹图标.</em> MyGui.Show</pre> <p><strong>Lines:</strong> 指定 <code>-Lines</code>(负 Lines) 来避免显示连接父项目和它们的子项目之间的网状线. 但是, 移除这些线也阻止了顶级项目坐标加号/减号按钮的显示.</p> <p id="ReadOnly"><strong>ReadOnly:</strong> 指定 <code>-ReadOnly</code>(负 ReadOnly) 来允许编辑每项的文本/名称. 要编辑某项, 请选择它接着按下 <kbd>F2</kbd>(请参阅下面的 <a href="#WantF2">WantF2</a> 选项). 或者, 您可以对某个项目点击一次来选择它, 至少等半秒, 然后再次点击同一项目进行编辑. 编辑后, 可以对一个项目在其同级项目之间按字母顺序进行重新定位, 请参考下面的例子:</p> <pre>TV := MyGui.Add("TreeView", "-ReadOnly") TV.OnEvent("ItemEdit", MyTree_Edit) <em>; 每当用户完成一个项目的编辑后, 调用 MyTree_Edit.</em> <em>; ...</em> MyTree_Edit(TV, Item) { TV.Modify(TV.GetParent(Item), "Sort") <em>; 即使该项目没有父项目, 该功能也可以使用.</em> }</pre> <p><strong>R:</strong> 行高(创建时). 指定字母 R 后面紧跟着要在控件中留出空间的行数. 例如, <code>R10</code> 会设置控件为 10 个项目的高度.</p> <p id="WantF2"><strong>WantF2:</strong> 指定 <code>-WantF2</code>(负 WantF2) 来禁止使用 <kbd>F2</kbd> 来<a href="#ReadOnly">编辑</a>当前选择的项目. 仅当 <a href="#ReadOnly">-ReadOnly</a> 也有效时, 此设置才不会被忽略.</p> <p><strong>(未命名的数值样式):</strong> 由于上述以外的其他样式很少使用, 所以没有为它们命名. 请参阅 <a href="../misc/Styles.htm#TreeView">TreeView 样式表</a>了解这些样式.</p> <h2 id="BuiltIn">TreeViews 的内置方法</h2> <p>除了<a href="GuiControl.htm">GUI 控件的默认方法/属性</a>外, TreeView 还拥有以下方法(在 Gui.TreeView 类中定义).</p> <p>项目方法:</p> <ul> <li><a href="#Add">Add</a>: 添加新的项目到 TreeView.</li> <li><a href="#Modify">Modify</a>: 修改项目的属性和/或名称.</li> <li><a href="#Delete">Delete</a>: 删除指定项目或所有项目.</li> </ul> <p>检索方法:</p> <ul> <li><a href="#GetSelection">GetSelection</a>: 返回选择项目的 ID 号.</li> <li><a href="#GetCount">GetCount</a>: 返回控件中项目的总数.</li> <li><a href="#GetParent">GetParent</a>: 返回指定项目的父项目的 ID.</li> <li><a href="#GetChild">GetChild</a>: 返回指定项目的第一个/最上面的子项目的 ID.</li> <li><a href="#GetPrev">GetPrev</a>: 返回指定项目上面一个的同级项目的 ID 号.</li> <li><a href="#GetNext">GetNext</a>: 返回指定项目下面一个项目的 ID 号.</li> <li><a href="#GetText">GetText</a>: 检索指定项目的文本/名称.</li> <li><a href="#Get">Get</a>: 如果指定项目含有指定的属性, 则返回项目的 ID.</li> </ul> <p>其他方法:</p> <ul> <li><a href="#SetImageList">SetImageList</a>: 设置或替换用于显示图标的 ImageList.</li> </ul> <div class="methodShort" id="Add"> <h3>Add</h3> <p>添加新的项目到 TreeView.</p> <pre class="Syntax">ItemID := TV.<span class="func">Add</span>(Name, <span class="optional">ParentItemID, Options</span>)</pre> <h4 id="Add_Parameters">参数</h4> <dl> <dt>Name</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>项目显示的文本, 它可以为文本或数值(包括数值<a href="../Variables.htm#Expressions">表达式</a>的结果).</p> </dd> <dt>ParentItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>如果未设置或省略, 默认为 0, 这意味着项目将被添加到顶级. 否则, 请指定新项目的父项的 ID.</p> </dd> <dt id="Options_for_Add_and_Modify">Options</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>包含下表中零个或多个选项(不区分大小写). 如果未设置或省略, 默认为无选项. 否则, 请指定下面的列表中的一个或多个选项(不区分大小写). 选项间使用空格或 tab 分隔. 要移除某个选项, 请在该选项前加上负号. 要添加选项, 选项前允许使用正号, 但不是必须的(可以省略).</p> <p id="Bold"><strong>Bold:</strong> 用粗体显示项目的名称. 以后要取消项目名称的粗体显示, 请使用 <code>TV.Modify(ItemID, "-Bold")</code>. 单词 <em>Bold</em> 后可以可选地紧跟着 0 或 1 以指示起始状态.</p> <p id="Check"><strong>Check:</strong> 在项目的坐标显示一个复选标记(需要 TreeView 含有<a href="#Checked">复选框</a>). 以后要取消选中, 请使用 <code>TV.Modify(ItemID, "-Check")</code>. 在单词 <em>Check</em> 后可以紧跟着 0 或 1 来表示初始状态. 换句话说, <code>"Check"</code> 和 <code>"Check" <strong>.</strong> VarContainingOne</code> 是等同的(这里中间使用的是<a href="../Variables.htm#concat">连接运算符</a>).</p> <p id="Expand"><strong>Expand:</strong> 展开此项以让其子项目显示出来(如果有). 以后要折叠项目, 请使用 <code>TV.Modify(ItemID, "-Expand")</code>. 如果没有子项目, 那么 <a href="#Modify">Modify 方法</a>返回 0 而不是它的项目 ID. 与之相比, <a href="#Add">Add 方法</a>标记项目为展开, 以备以后添加子项目时使用. 与下面的 <a href="#Select">Select</a> 选项不同, 展开一个项目不会自动展开其父项目. 最后, 在单词 <em>Expand</em> 后可以紧跟着 0 或 1 来表示初始状态. 换句话说, <code>"Expand"</code> 和 <code>"Expand" <strong>.</strong> VarContainingOne</code> 是等同的.</p> <p><strong>First | Sort | N:</strong> 这些选项仅适用于 <a href="#Add">Add 方法</a>. 它们指定新项目相对于 其同级项目的位置(<em>同级项目</em> 是同一级别的其他任何项目). 如果这些选项都不存在, 则新项目被添加到同级项目的最后/底部. 否则, 请指定单词 <em>First</em> 来添加项目到同级项目的第一个/顶部, 或指定单词 <em>Sort</em> 来按字母顺序插入新项目到同级项目中间. 如果指定一个纯整数 <em>N</em>, 则假定它为同级项目的 ID 号, 新项目会被插入到它的后面(如果 <em>N</em> 是唯一使用的选项, 则它不需要括在引号中).</p> <p><strong>Icon:</strong> 指定单词 <em>Icon</em> 后紧跟着此项目图标的编号, 项目图标显示在项目名称的左边. 如果此选项不存在, 则使用<a href="#ImageList">图像列表</a>中的首个图标. 要显示空白图标, 请指定一个大于图像列表中图标数目的数字. 如果控件没有图像列表, 则既不显示图标也不为图标保留空间.</p> <p id="Select"><strong>Select:</strong> 选择项目. 因为一次只能选择一个项目, 此时任何原来选择的项目会自动取消选择. 此外, 如果有必要此选项会展开其父项目以显示新选择的项目. 要找出当前选择的项目, 请调用 <a href="#GetSelection">GetSelection 方法</a>.</p> <p><strong>Sort:</strong> 对于 <a href="#Modify">Modify 方法</a>, 此选项按字母顺序排列指定项目的子项目. 要对所有顶级项目进行排序, 请使用 <code>TV.Modify(0, "Sort")</code>. 如果不含子项目, 则返回 0 而不是所修改项目的 ID.</p> <p><strong>Vis:</strong> 在需要时, 通过滚动 TreeView 和/或展开其父项目来确保此项目完全可见.</p> <p><strong>VisFirst:</strong> 和上面一样, 不过在可行时它还会滚动 TreeView 使得此项显示在顶部. 此选项与 <a href="#Modify">Modify 方法</a>比与 <a href="#Add">Add 方法</a>一起使用通常更有效.</p> </dd> </dl> <h4 id="Add_Return_Value">返回值</h4> <p>成功时, 函数返回新添加项目的唯一 ID 号. 失败时, 返回 0.</p> <h4 id="Add_Remarks">备注</h4> <p>当添加大量项目时, 可以在添加项目之前使用 <code>TV.Opt("-Redraw")</code>, 之后使用 <code>TV.Opt("+Redraw")</code> 来提高性能. 有关详情, 请参阅 <a href="GuiControl.htm#redraw-remarks">Redraw</a>.</p> </div> <div class="methodShort" id="Modify"> <h3>Modify</h3> <p>修改项目的属性和/或名称.</p> <pre class="Syntax">ItemID := TV.<span class="func">Modify</span>(ItemID <span class="optional">, Options, NewName</span>)</pre> <h4 id="Modify_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要修改的项目.</p> </dd> <dt>Options</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果未设置或省略, 则选择项目. 否则, 请指定<a href="#Options_for_Add_and_Modify">上表</a>中的一个或多个选项.</p> </dd> <dt>NewName</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果未设置或省略, 则保持当前名称不变. 否则, 请指定项目的新名称.</p> </dd> </dl> <h4 id="Modify_Return_Value">返回值</h4> <p>方法返回项目自己的 ID.</p> </div> <div class="methodShort" id="Delete"> <h3>Delete</h3> <p>删除指定项目或所有项目.</p> <pre class="Syntax">TV.<span class="func">Delete</span>(<span class="optional">ItemID</span>)</pre> <h4 id="Delete_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>如果未设置或省略, 则删除 TreeView 中的 <u>所有</u> 项目. 否则, 请指定要删除项目的 ID 号.</p> </dd> </dl> </div> <div class="methodShort" id="GetSelection"> <h3>GetSelection</h3> <p>返回选择项目的 ID 号.</p> <pre class="Syntax">ItemID := TV.<span class="func">GetSelection</span>()</pre> <h4 id="GetSelection_Return_Value">返回值</h4> <p>此方法返回选择项目的 ID 号.</p> </div> <div class="methodShort" id="GetCount"> <h3>GetCount</h3> <p>返回控件中项目的总数.</p> <pre class="Syntax">Count := TV.<span class="func">GetCount</span>()</pre> <h4 id="GetCount_Return_Value">返回值</h4> <p>此方法返回控件中项目的总数. 此返回值总是即时检索的, 因为控件会一直跟踪此计数.</p> </div> <div class="methodShort" id="GetParent"> <h3>GetParent</h3> <p>返回指定项目的父项目的 ID.</p> <pre class="Syntax">ParentItemID := TV.<span class="func">GetParent</span>(ItemID)</pre> <h4 id="GetParent_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检查的项目.</p> </dd> </dl> <h4 id="GetParent_Return_Value">返回值</h4> <p>此方法返回指定项目的父项目的 ID 号. 如果项目没有父项目, 返回 0, 这适用于所有顶级项目.</p> </div> <div class="methodShort" id="GetChild"> <h3>GetChild</h3> <p>返回指定项目的第一个/最上面的子项目的 ID.</p> <pre class="Syntax">ChildItemID := TV.<span class="func">GetChild</span>(ItemID)</pre> <h4 id="GetChild_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检查项目的 ID. 如果为 0, 返回 TreeView 中首个/顶部项目的 ID 号.</p> </dd> </dl> <h4 id="GetChild_Return_Value">返回值</h4> <p>此方法返回指定项目的第一个/最上面的子项目的 ID 号. 如果没有子项目, 返回 0.</p> </div> <div class="methodShort" id="GetPrev"> <h3>GetPrev</h3> <p>返回指定项目上面一个的同级项目的 ID 号.</p> <pre class="Syntax">PrevItemID := TV.<span class="func">GetPrev</span>(ItemID)</pre> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检查的项目.</p> </dd> </dl> <h4 id="GetPrev_Return_Value">返回值</h4> <p>此方法返回指定项目上一个同级项目的 ID 号. 如果没有同级项目, 返回 0.</p> </div> <div class="methodShort" id="GetNext"> <h3>GetNext</h3> <p>返回指定项目下面一个项目的 ID 号.</p> <pre class="Syntax">NextItemID := TV.<span class="func">GetNext</span>(<span class="optional">ItemID, ItemType</span>)</pre> <h4 id="GetNext_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检查的项目. 如果该参数为 0 或省略, 则返回 TreeView 中第一个/顶部项目的 ID 号.</p> </dd> <dt>ItemType</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果未设置或省略, 将检索指定项目下面一个同级项目的 ID 号. 否则, 请指定以下字符串之一:</p> <p><strong>Full</strong> 或 <strong>F</strong>: 检索下一个项目, 不论它是否为指定项目的同级项目. 这使得脚本可以容易地逐项遍历整个树. 请参阅下面的示例.</p> <p><strong>Check</strong>, <strong>Checked</strong> 或 <strong>C</strong>: 仅获取下一个带复选标记的项目.</p> </dd> </dl> <h4 id="GetNext_Return_Value">返回值</h4> <p>此方法返回指定项目下一个项目的 ID 号. 如果没有下一个项目, 返回 0.</p> <h4 id="GetNext_Remarks">备注</h4> <p>下面的例子逐项遍历整个树:</p> <pre>ItemID := 0 <em>; 这样使得首次循环从树的顶部开始搜索.</em> Loop { ItemID := TV.GetNext(ItemID, "Full") <em>; 把 "Full" 替换为 "Checked" 来找出所有含复选标记的项目.</em> if not ItemID <em>; 没有更多项目了.</em> break ItemText := TV.GetText(ItemID) MsgBox('The next Item is ' ItemID ', whose text is "' ItemText '".') }</pre> </div> <div class="methodShort" id="GetText"> <h3>GetText</h3> <p>检索指定项目的文本/名称.</p> <pre class="Syntax">Text := TV.<span class="func">GetText</span>(ItemID)</pre> <h4 id="GetText_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检索文本的项目的 ID 号.</p> </dd> </dl> <h4 id="GetText_Return_Value">返回值</h4> <p>此方法返回检索到的文本. 最多只能检索 8191 个字符.</p> </div> <div class="methodShort" id="Get"> <h3>Get</h3> <p>如果指定项目含有指定的属性, 则返回一个项目的 ID.</p> <pre class="Syntax">ItemID := TV.<span class="func">Get</span>(ItemID, Attribute)</pre> <h4 id="Get_Parameters">参数</h4> <dl> <dt>ItemID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>要检查的项目的 ID 号.</p> </dd> <dt>Attribute</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>指定以下字符串之一:</p> <p><strong>E</strong>, <strong>Expand</strong> 或 <strong>Expanded</strong>: 当前<a href="#Expand">展开</a>的项目(即它的子项目是显示的).</p> <p><strong>C</strong>, <strong>Check</strong> 或 <strong>Checked</strong>: 具有<a href="#Check">复选标记</a>的项目.</p> <p><strong>B</strong> 或 <strong>Bold</strong>: 当前字体为<a href="#Bold">粗体</a>的项目.</p> </dd> </dl> <h4 id="Get_Return_Value">返回值</h4> <p>如果指定的项目具有指定的属性, 则返回它自己的 ID. 否则, 返回 0.</p> <h4 id="Get_Remarks">备注</h4> <p>因为在 IF 语句中把任何非零值视为 "true", <code>if TV.Get(ItemID, "Checked") = ItemID</code> 和 <code>if TV.Get(ItemID, "Checked")</code> 在功能上是相同的.</p> </div> <div class="methodShort" id="SetImageList"> <h3>SetImageList</h3> <p>设置或替换用于显示图标的 <a href="ListView.htm#IL">ImageList</a>, 并返回之前与该控件关联的 ImageListID(如果没有, 则返回 0).</p> <pre class="Syntax">PrevImageListID := TV.<span class="func">SetImageList</span>(ImageListID <span class="optional">, IconType</span>)</pre> <h4 id="SetImageList_Parameters">参数</h4> <dl> <dt>ImageListID</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>上次调用 <a href="ListView.htm#IL_Create">IL_Create</a> 后返回的 ID 数字.</p> </dd> <dt>IconType</dt> <dd> <p>类型: <a href="../Concepts.htm#numbers">整数</a></p> <p>如果未设置或省略, 则默认为 0. 否则, 为状态图标指定 2(状态图标还没有被直接支持, 但可以通过 <a href="SendMessage.htm">SendMessage</a> 使用).</p> </dd> </dl> <h4 id="SetImageList_Return_Value">返回值</h4> <p>成功时, 此方法返回先前与 TreeView 关联的 ImageList ID. 失败时, 返回 0. 任何这样的分离的 ImageList 通常应该通过 <a href="ListView.htm#IL_Destroy">IL_Destroy</a> 来销毁.</p> </div> <h2 id="Events">事件</h2> <p>通过调用 <a href="GuiOnEvent.htm">OnEvent</a> 来注册一个回调函数或方法, 可以检测到以下事件:</p> <table class="info"> <tr><th>事件</th><th>当...触发</th></tr> <tr><td><a href="GuiOnEvent.htm#Click">Click</a></td><td>控件被点击.</td></tr> <tr><td><a href="GuiOnEvent.htm#DoubleClick">DoubleClick</a></td><td>控件被双击.</td></tr> <tr><td><a href="GuiOnEvent.htm#Ctrl-ContextMenu">ContextMenu</a></td><td>当控件拥有键盘焦点时, 用户右键单击控件或按下 <kbd>Menu</kbd> 或 <kbd>Shift</kbd>+<kbd>F10</kbd>.</td></tr> <tr><td><a href="GuiOnEvent.htm#Focus">Focus</a></td><td>控件获得键盘焦点.</td></tr> <tr><td><a href="GuiOnEvent.htm#LoseFocus">LoseFocus</a></td><td>控件失去键盘焦点.</td></tr> <tr><td><a href="GuiOnEvent.htm#ItemCheck">ItemCheck</a></td><td>一个项目被选中或取消选中.</td></tr> <tr><td><a href="GuiOnEvent.htm#ItemEdit">ItemEdit</a></td><td>一个项目的标签被用户编辑.</td></tr> <tr><td><a href="GuiOnEvent.htm#ItemExpand">ItemExpand</a></td><td>一个项目被展开或折叠.</td></tr> <tr><td><a href="GuiOnEvent.htm#ItemSelect">ItemSelect</a></td><td>一个项目被选中或取消选中.</td></tr> </table> <p>额外的(很少使用的) 通知可以通过使用 <a href="GuiOnNotify.htm">OnNotify</a> 来检测. 这些通知在 <a href="https://learn.microsoft.com/windows/win32/controls/bumper-tree-view-control-reference-notifications">Microsoft Docs 上都有文档</a>. Microsoft Docs 没有显示每个通知代码的数值; 这些可以在 Windows SDK 中找到, 或者在互联网上搜索.</p> <h2 id="Remarks">备注</h2> <p id="Enter">当 TreeView 拥有焦点时如果要检测到用户按下的 <kbd>Enter</kbd> 键, 请使用<a href="GuiControls.htm#DefaultButton">默认按钮</a>(如果需要可以隐藏它). 例如:</p> <pre>MyGui.Add("Button", "Hidden Default", "OK").OnEvent("Click", ButtonOK) ... ButtonOK(*) { global if MyGui.FocusedCtrl != TV return MsgBox("Enter was pressed. The selected item ID is " TV.GetSelection()) }</pre> <p>使用键盘除了在项与项之间导航外, 用户还可以通过输入一个项目名称的前几个字符来进行增量搜索. 这使得选择对象跳转到最近匹配的项目.</p> <p>尽管 TreeView 中的每个项目可以存储任意长度的文本, 但仅显示开始的 260 个字符.</p> <p>尽管理论上 TreeView 中的项目数可以多达 65536, 然而接近此数目时添加项的性能将显著降低. 通过使用 <a href="#Add">Add 方法</a>中描述的重绘提示可以稍微减轻这种情况.</p> <p id="ILremarks">与 <a href="ListView.htm">ListViews</a>, 不同, 当 TreeView 销毁时它的图像列表不会自动被销毁. 因此, 如果 TreeView 中使用的图像列表以后不再用于其他地方, 则在销毁 TreeView 所在的窗口后脚本应调用 <a href="ListView.htm#IL_Destroy">IL_Destroy</a> 来销毁此图像列表. 然而, 如果脚本很快将退出, 这样做是没必要的, 因为那时所有的图像列表会自动被销毁.</p> <p>脚本可以在每个窗口中创建多个 TreeView.</p> <p>要执行一些操作, 例如调整大小, 隐藏或改变 TreeView 的字体, 请参阅 <a href="GuiControl.htm">GuiControl 对象</a>.</p> <p>Tree View eXtension(TVX) 扩展了 TreeView 的功能, 增加对移动, 插入和删除的支持. 演示的例子请参阅 <a href="https://www.autohotkey.com/forum/topic19021.html">www.autohotkey.com/forum/topic19021.html</a></p> <h2 id="Related">相关</h2> <p><a href="ListView.htm">ListView</a>, <a href="GuiControls.htm">其他控件类型</a>, <a href="Gui.htm#Call">Gui()</a>, <a href="GuiOnEvent.htm#ContextMenu">ContextMenu 事件</a>, <a href="GuiControl.htm">Gui 对象</a>, <a href="GuiControl.htm">GuiControl 对象</a>, <a href="../misc/Styles.htm#TreeView">TreeView 样式表</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExAdvanced"> <p><a class="ex_number" href="#ExAdvanced"></a> 下面是一个比页面顶部的脚本更复杂的可工作的脚本. 它创建并显示一个 TreeView, 其中包含所有用户开始菜单中的所有文件夹. 当用户选择一个文件夹时, 它的内容会显示在右边的 ListView 中(类似于 Windows 资源管理器). 此外, <a href="GuiControls.htm#StatusBar">StatusBar</a> 控件会显示当前选择文件夹的信息.</p> <pre><em>; 下面的文件夹为 TreeView 的根文件夹. 请注意, 如果指定整个驱动器例如 C:\ ; 那么可能需要很长加载时间:</em> TreeRoot := A_MyDocuments TreeViewWidth := 280 ListViewWidth := A_ScreenWidth/2 - TreeViewWidth - 30 <em>; 创建 Gui 窗口并在标题栏中显示源目录(TreeRoot):</em> MyGui := Gui("+Resize", TreeRoot) <em>; 让用户可以最大化或拖动调整窗口大小.</em> <em>; 创建图像列表并在其中放入一些标准的系统图标:</em> ImageListID := <a href="ListView.htm#IL_Create">IL_Create</a>(5) Loop 5 <a href="ListView.htm#IL_Add">IL_Add</a>(ImageListID, "shell32.dll", A_Index) <em>; 创建 <a href="#GuiAdd">TreeView</a> 和 ListView, 让它们像在 Windows 资源管理器中那样靠在一起:</em> TV := <a href="#GuiAdd">MyGui.Add</a>("TreeView", "r20 w" TreeViewWidth " <a href="#ImageList">ImageList</a>" ImageListID) LV := MyGui.Add("ListView", "r20 w" ListViewWidth " x+10", ["Name","Modified"]) <em>; 创建<a href="GuiControls.htm#StatusBar">状态栏</a>/, 显示文件夹数及其总大小的信息:</em> SB := MyGui.Add("StatusBar") <a href="GuiControls.htm#SB_SetParts">SB.SetParts</a>(60, 85) <em>; 在状态栏中创建三个部分(第三部分占用所有剩余宽度).</em> <em>; 添加文件夹及其子文件夹到树中. 如果加载需要很长时间, 则显示提示信息:</em> M := Gui("ToolWindow -SysMenu Disabled AlwaysOnTop", "Loading the tree..."), M.Show("w200 h0") DirList := AddSubFoldersToTree(TreeRoot, Map()) M.Hide() <em>; 每当有新的项目被选中时, 调用 TV_ItemSelect:</em> TV.OnEvent("ItemSelect", TV_ItemSelect) <em>; 每当窗口被调整大小时, 调用 Gui_Size:</em> MyGui.OnEvent("Size", Gui_Size) <em>; 设置 ListView 的列宽(这是可选的):</em> Col2Width := 70 <em>; 缩小到只显示 YYYYMMDD 部分.</em> LV.ModifyCol(1, ListViewWidth - Col2Width - 30) <em>; 允许垂直滚动条.</em> LV.ModifyCol(2, Col2Width) <em>; 显示窗口并返回. 每当用户执行符合条件的动作时, 操作系统会通知脚本:</em> MyGui.Show AddSubFoldersToTree(Folder, DirList, ParentItemID := 0) { <em>; 该函数将指定文件夹中的所有子文件夹添加到 TreeView 中, ; 并将它们与 ID 相关联的路径保存到一个对象中, 供以后使用. ; 它还可以递归地调用自己来收集任意深度的嵌套文件夹.</em> Loop Files, Folder "\*.*", "D" <em>; 获取所有文件夹的子文件夹.</em> { ItemID := <a href="#Add">TV.Add</a>(A_LoopFileName, ParentItemID, "Icon4") DirList[ItemID] := A_LoopFilePath DirList := AddSubFoldersToTree(A_LoopFilePath, DirList, ItemID) } return DirList } TV_ItemSelect(thisCtrl, Item) <em>; 当选择一个新的项目时, 该函数被调用.</em> { <em>; 将文件放入 ListView 中:</em> LV.Delete <em>; 清除所有行.</em> LV.Opt("-Redraw") <em>; 通过在加载过程中禁止重绘来提高性能.</em> TotalSize := 0 <em>; 在下面循环之前初始化.</em> Loop Files, DirList[Item] "\*.*" <em>; 为了简化, 这里省略了文件夹, 所以只在 ListView 中显示文件.</em> { LV.Add(, A_LoopFileName, A_LoopFileTimeModified) TotalSize += A_LoopFileSize } LV.Opt("+Redraw") <em>; 更新状态栏的三个部分, 让它们显示当前选择的文件夹的信息:</em> <a href="GuiControls.htm#SB_SetText">SB.SetText</a>(LV.GetCount() " files", 1) SB.SetText(Round(TotalSize / 1024, 1) " KB", 2) SB.SetText(DirList[Item], 3) } Gui_Size(thisGui, MinMax, Width, Height) <em>; 当用户改变窗口大小时扩展/收缩 ListView 和 TreeView.</em> { if MinMax = -1 <em>; 窗口被最小化了. 无需进行操作.</em> return <em>; 否则, 窗口的大小被调整过或被最大化了. 调整控件大小以适应.</em> TV.GetPos(,, &amp;TV_W) TV.Move(,,, Height - 30) <em>; -30 用于状态栏和边距.</em> TV.Move(,, Width - TV_W - 30, Height - 30) }</pre> </div> <a href="https://dftg.net">dftg</a><!-- Cloudflare Pages Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "d5a9c4fcb9b6482fa53ce820d892f969"}'></script><!-- Cloudflare Pages Analytics --><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"rayId":"93a4c2da1ea9dd00","version":"2025.4.0-1-g37f21b1","r":1,"serverTiming":{"name":{"cfExtPri":true,"cfL4":true,"cfSpeedBrain":true,"cfCacheStatus":true}},"token":"51750bb5dc4f40cc91a5ec55c63bbc01","b":1}' crossorigin="anonymous"></script> </body> </html>