找回密码
 加入
搜索
查看: 93|回复: 3

[GUI管理] [已解决]用listview控件实现treeview的例子

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 3131210 于 2026-7-4 11:40 编辑

之前有个大佬就是这样实现的,似乎是跟进程信息列表有关的,今天想起,想研究一下实现的方法,搜索不到,不知道谁还记得,帮一下

treeview数量太多,还是要靠虚表来解决
 楼主| 发表于 6 天前 | 显示全部楼层
让AI写了个listview虚表模拟树形图,速度还可以了
;===============================================================================
; VirtualTreeView.au3 - 虚表模拟 TreeView
; 虚拟列表 + 自绘树形 + 图标 + 选中态切换
;===============================================================================

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WinAPI.au3>
#include <StructureConstants.au3>
#include <SendMessage.au3>
#include <GDIPlus.au3>

Global Const $INDENT = 22
Global Const $BTN_SIZE = 9
Global Const $ICON_SZ = 20
Global Const $MARGIN = 6

Global Const $CLR_TEXT = 0x1A1A1A
Global Const $CLR_LINE = 0xC0C0C0
Global Const $CLR_HIGHLIGHT = 0x3399FF
Global Const $CLR_SELTEXT = 0xFFFFFF
Global Const $CLR_ALT = 0xF5F7FA

Global $g_aTreeData[1][10]
Global $g_iNodeCnt = 0
Global $g_aVisible[1]
Global $g_iVisCnt = 0

Global $g_hListView = 0
Global $g_hListHwnd = 0
Global $g_hImageList = 0
Global $g_hGui = 0
Global $g_tTextBuf = DllStructCreate("wchar Text[512]")

Global $g_hPenLine = 0
Global $g_hSearchInput = 0
Global $g_hSearchBtn = 0
Global $g_hReloadBtn = 0
Global $g_iDataSet = 1


;========== 树管理 ==========
Func _TreeInit()
        ReDim $g_aTreeData[1][10]
        $g_iNodeCnt = 0
EndFunc   ;==>_TreeInit

Func _TreeToggle($iIdx)
        If $iIdx < 0 Or $iIdx >= $g_iNodeCnt Or Not $g_aTreeData[$iIdx][4] Then Return
        $g_aTreeData[$iIdx][3] = Not $g_aTreeData[$iIdx][3]
        _Rebuild()
EndFunc   ;==>_TreeToggle

Func _TreeAdd($iParent, $sText, $iIconN = 0, $iIconS = 0, $iX = 0, $iY = 0, $iOrigIdx = -1)
        $g_iNodeCnt += 1
        If $g_iNodeCnt > UBound($g_aTreeData) Then ReDim $g_aTreeData[$g_iNodeCnt + 32][10]

        Local $id = $g_iNodeCnt - 1
        $g_aTreeData[$id][0] = $iParent
        $g_aTreeData[$id][1] = $sText
        $g_aTreeData[$id][7] = $iX
        $g_aTreeData[$id][8] = $iY
        $g_aTreeData[$id][9] = $iOrigIdx

        If $iParent >= 0 And $iParent < $id Then
                $g_aTreeData[$id][2] = $g_aTreeData[$iParent][2] + 1
        Else
                $g_aTreeData[$id][2] = 0
        EndIf

        $g_aTreeData[$id][3] = False
        $g_aTreeData[$id][4] = False
        $g_aTreeData[$id][5] = $iIconN
        $g_aTreeData[$id][6] = $iIconS

        If $iParent >= 0 And $iParent < $id Then $g_aTreeData[$iParent][4] = True
        Return $id
EndFunc   ;==>_TreeAdd

Func _DFS($iIdx, ByRef $aOut, ByRef $n)
        $aOut[$n] = $iIdx
        $n += 1
        If $g_aTreeData[$iIdx][3] Then
                For $i = 0 To $g_iNodeCnt - 1
                        If $g_aTreeData[$i][0] = $iIdx Then _DFS($i, $aOut, $n)
                Next
        EndIf
EndFunc   ;==>_DFS

Func _Rebuild()
        Local $aT[$g_iNodeCnt]
        Local $c = 0
        For $i = 0 To $g_iNodeCnt - 1
                If $g_aTreeData[$i][0] < 0 Then _DFS($i, $aT, $c)
        Next
        ReDim $aT[$c]
        $g_aVisible = $aT
        $g_iVisCnt = $c
        If $g_hListView Then GUICtrlSendMsg($g_hListView, $LVM_SETITEMCOUNT, $c, 0)
EndFunc   ;==>_Rebuild

Func _V2T($iPos)
        If $iPos >= 0 And $iPos < $g_iVisCnt Then Return $g_aVisible[$iPos]
        Return -1
EndFunc   ;==>_V2T

;========== WM_NOTIFY ==========
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tH = DllStructCreate($tagNMHDR, $lParam)
        If DllStructGetData($tH, "IDFrom") <> $g_hListView Then Return $GUI_RUNDEFMSG

        Local $iCode = DllStructGetData($tH, "Code")

        Switch $iCode
                Case $LVN_GETDISPINFOA, $LVN_GETDISPINFOW
                        Local $tI = DllStructCreate($tagNMLVDISPINFO, $lParam)
                        Local $iItem = DllStructGetData($tI, "Item")
                        Local $iSub = DllStructGetData($tI, "SubItem")
                        If $iSub <> 0 Then Return 0

                        Local $iIdx = _V2T($iItem)
                        If $iIdx < 0 Then Return 0

                        If BitAND(DllStructGetData($tI, "Mask"), 0x0001) Then
                                DllStructSetData($g_tTextBuf, "Text", $g_aTreeData[$iIdx][1])
                                DllStructSetData($tI, "Text", DllStructGetPtr($g_tTextBuf))
                                DllStructSetData($tI, "TextMax", 512)
                        EndIf
                        Return 0

                Case $NM_CUSTOMDRAW
                        Return _OnCD($lParam)

                Case $NM_CLICK
                        Return _OnClick($lParam)

                Case $NM_DBLCLK
                        Return _OnDblClick($lParam)

                Case -101 ; LVN_ITEMCHANGEDW
                        Local $tLV = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;INT Code;" & _
                                        "int Item;int SubItem;uint uNewState;uint uOldState;uint uChanged;" & _
                                        "int X;int Y;int lParam", $lParam)
                        If BitAND(DllStructGetData($tLV, "uChanged"), 8) Then
                                If BitAND(DllStructGetData($tLV, "uNewState"), 2) Then
                                        Local $iVis = DllStructGetData($tLV, "Item")
                                        Local $iIdx = _V2T($iVis)
                                        If $iIdx >= 0 And $g_aTreeData[$iIdx][2] > 0 Then
                                                ConsoleWrite("Sel orig=" & $g_aTreeData[$iIdx][9] & @CRLF)
                                        EndIf
                                EndIf
                        EndIf
                        Return 0

        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

;========== 自绘 (自定义结构避免字段名冲突) ==========
Global Const $tagMYCD = "hwnd hWndFrom;uint_ptr IDFrom;INT Code;" & _
                "dword dwDrawStage;handle hdc;long rcL;long rcT;long rcR;long rcB;" & _
                "dword dwItemSpec;uint uItemState;int lItemlParam"

Func _OnCD($lParam)
        Local $tCD = DllStructCreate($tagMYCD, $lParam)
        Local $dw = DllStructGetData($tCD, "dwDrawStage")

        If $dw = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
        If $dw = $CDDS_POSTPAINT Then Return $CDRF_SKIPDEFAULT

        If BitAND($dw, $CDDS_ITEMPREPAINT) = $CDDS_ITEMPREPAINT Then
                _DrawItem($tCD)
                Return $CDRF_SKIPDEFAULT
        EndIf

        Return $CDRF_DODEFAULT
EndFunc   ;==>_OnCD

Func _DrawItem($tCD)
        Local $hDC = DllStructGetData($tCD, "hdc")
        Local $iVis = DllStructGetData($tCD, "dwItemSpec")
        Local $iIdx = _V2T($iVis)
        If $iIdx < 0 Then Return

        Local $iLvl = $g_aTreeData[$iIdx][2]
        Local $iL = DllStructGetData($tCD, "rcL")
        Local $iT = DllStructGetData($tCD, "rcT")
        Local $iR = DllStructGetData($tCD, "rcR")
        Local $iB = DllStructGetData($tCD, "rcB")
        If $iR <= $iL Or $iB <= $iT Then Return
        Local $iH = $iB - $iT
        Local $iMid = $iT + $iH / 2

        Local $bSel = _GUICtrlListView_GetItemState($g_hListView, $iVis, 2) <> 0

        ; ---- 背景 ----
        Local $tRC = DllStructCreate("long l;long t;long r;long b")
        $tRC.l = $iL
        $tRC.t = $iT
        $tRC.r = $iR
        $tRC.b = $iB

        If $bSel Then
                Local $hB = _WinAPI_CreateSolidBrush($CLR_HIGHLIGHT)
                _WinAPI_FillRect($hDC, DllStructGetPtr($tRC), $hB)
                _WinAPI_DeleteObject($hB)
        ElseIf Mod($iVis, 2) = 1 Then
                Local $hB = _WinAPI_CreateSolidBrush($CLR_ALT)
                _WinAPI_FillRect($hDC, DllStructGetPtr($tRC), $hB)
                _WinAPI_DeleteObject($hB)
        EndIf

        ; ---- 树线 ----
        Local $hOP = _WinAPI_SelectObject($hDC, $g_hPenLine)
        For $i = 0 To $iLvl - 1
                Local $lx = $iL + $MARGIN + $i * $INDENT + $INDENT / 2
                _WinAPI_MoveToEx($hDC, $lx, $iT)
                _WinAPI_LineTo($hDC, $lx, $iB)
        Next

        If $iLvl > 0 Then
                Local $hx = $iL + $MARGIN + ($iLvl - 1) * $INDENT + $INDENT / 2
                _WinAPI_MoveToEx($hDC, $hx, $iMid)
                _WinAPI_LineTo($hDC, $iL + $MARGIN + $iLvl * $INDENT + $BTN_SIZE / 2, $iMid)
        EndIf

        Local $bNext = False
        For $j = $iIdx + 1 To $g_iNodeCnt - 1
                If $g_aTreeData[$j][0] = $g_aTreeData[$iIdx][0] Then
                        $bNext = True
                        ExitLoop
                EndIf
        Next
        If $bNext And $iLvl > 0 Then
                Local $vx = $iL + $MARGIN + ($iLvl - 1) * $INDENT + $INDENT / 2
                _WinAPI_MoveToEx($hDC, $vx, $iMid)
                _WinAPI_LineTo($hDC, $vx, $iB)
        EndIf
        _WinAPI_SelectObject($hDC, $hOP)

        ; ---- +/- 按钮 ----
        Local $bX = $iL + $MARGIN + $iLvl * $INDENT
        Local $bY = $iMid - $BTN_SIZE / 2

        If $g_aTreeData[$iIdx][4] Then
                Local $tBR = DllStructCreate("long l;long t;long r;long b")
                $tBR.l = $bX
                $tBR.t = $bY
                $tBR.r = $bX + $BTN_SIZE
                $tBR.b = $bY + $BTN_SIZE
                Local $hWBrush = _WinAPI_CreateSolidBrush(0xFFFFFF)
                _WinAPI_FillRect($hDC, DllStructGetPtr($tBR), $hWBrush)
                _WinAPI_DeleteObject($hWBrush)

                Local $hBP = _WinAPI_CreatePen(0, 1, 0x808080)
                Local $hOP2 = _WinAPI_SelectObject($hDC, $hBP)
                Local $hOB = _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject(5))
                Local $tRect = DllStructCreate("long l;long t;long r;long b")
                $tRect.l = $bX
                $tRect.t = $bY
                $tRect.r = $bX + $BTN_SIZE
                $tRect.b = $bY + $BTN_SIZE
                _WinAPI_Rectangle($hDC, $tRect)
                _WinAPI_SelectObject($hDC, $hOB)
                _WinAPI_SelectObject($hDC, $hOP2)
                _WinAPI_DeleteObject($hBP)

                Local $hPP = _WinAPI_CreatePen(0, 1, 0x1A1A1A)
                Local $hOP3 = _WinAPI_SelectObject($hDC, $hPP)
                _WinAPI_MoveToEx($hDC, $bX + 2, $iMid)
                _WinAPI_LineTo($hDC, $bX + $BTN_SIZE - 2, $iMid)
                If Not $g_aTreeData[$iIdx][3] Then
                        _WinAPI_MoveToEx($hDC, $bX + $BTN_SIZE / 2, $bY + 2)
                        _WinAPI_LineTo($hDC, $bX + $BTN_SIZE / 2, $bY + $BTN_SIZE - 2)
                EndIf
                _WinAPI_SelectObject($hDC, $hOP3)
                _WinAPI_DeleteObject($hPP)
        EndIf

        ; ---- 图标 (选中态切换) ----
        Local $iIconX = $bX + $BTN_SIZE + 5
        Local $iIconY = $iMid - $ICON_SZ / 2
        Local $iIcon
        If $bSel Then
                $iIcon = $g_aTreeData[$iIdx][6]
        Else
                $iIcon = $g_aTreeData[$iIdx][5]
        EndIf
        If $iIcon >= 0 Then
                If $iIcon > 5 Then $iIcon = 0
                DllCall("comctl32.dll", "int", "ImageList_Draw", _
                                "handle", $g_hImageList, _
                                "int", $iIcon, _
                                "handle", $hDC, _
                                "int", $iIconX, _
                                "int", $iIconY, _
                                "uint", 0)
        EndIf

        ; ---- 文本 ----
        Local $iTxX = $iIconX + $ICON_SZ + 4
        _WinAPI_SetBkMode($hDC, 1)
        If $bSel Then
                _WinAPI_SetTextColor($hDC, $CLR_SELTEXT)
        Else
                _WinAPI_SetTextColor($hDC, $CLR_TEXT)
        EndIf

        ; 头行/主项/子项文本
        Local $sText
        If $g_aTreeData[$iIdx][2] > 0 Then
                $sText = $g_aTreeData[$iIdx][1]
        ElseIf $g_aTreeData[$iIdx][4] Then
                $sText = $g_aTreeData[$iIdx][1] & "(" & $g_aTreeData[$iIdx][7] & "," & $g_aTreeData[$iIdx][8] & ")"
        Else
                $sText = $g_aTreeData[$iIdx][1]
        EndIf

        Local $tTR = DllStructCreate("long l;long t;long r;long b")
        $tTR.l = $iTxX
        $tTR.t = $iT
        $tTR.r = $iR - 4
        $tTR.b = $iB

        DllCall("user32.dll", "int", "DrawTextW", _
                        "handle", $hDC, _
                        "wstr", $sText, _
                        "int", -1, _
                        "struct*", $tTR, _
                        "uint", BitOR(0, 4, 32, 0x8000, 0x1000))
EndFunc   ;==>_DrawItem

;========== NM_CLICK 展开/折叠 ==========
Func _OnClick($lParam)
        Local $tNM = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        Local $iVis = DllStructGetData($tNM, "Index")
        If $iVis < 0 Or $iVis >= $g_iVisCnt Then Return

        Local $iIdx = _V2T($iVis)
        If $iIdx < 0 Then Return

        Local $x = DllStructGetData($tNM, "X")
        Local $y = DllStructGetData($tNM, "Y")

        If $g_aTreeData[$iIdx][2] = 0 And $g_aTreeData[$iIdx][4] Then
                ; 主项且含子: 点击 +/- 按钮才折叠
                Local $iLvl = $g_aTreeData[$iIdx][2]
                Local $aR = _GUICtrlListView_GetItemRect($g_hListView, $iVis)
                If @error Then Return
                Local $bX = $aR[0] + $MARGIN + $iLvl * $INDENT
                Local $iMid = $aR[1] + ($aR[3] - $aR[1]) / 2
                Local $bY = $iMid - $BTN_SIZE / 2
                If $x >= $bX And $x <= $bX + $BTN_SIZE And $y >= $bY And $y <= $bY + $BTN_SIZE Then
                        _TreeToggle($iIdx)
                EndIf
        ElseIf $g_aTreeData[$iIdx][2] > 0 Then
                ; selection output now handled by LVN_ITEMCHANGED
        EndIf
EndFunc   ;==>_OnClick

;========== NM_DBLCLK ==========
Func _OnDblClick($lParam)
        Local $tNM = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        Local $iVis = DllStructGetData($tNM, "Index")
        If $iVis < 0 Or $iVis >= $g_iVisCnt Then Return

        Local $iIdx = _V2T($iVis)
        If $iIdx < 0 Then Return

        If $g_aTreeData[$iIdx][2] = 0 And $g_aTreeData[$iIdx][4] Then
                _TreeToggle($iIdx)
        ElseIf $g_aTreeData[$iIdx][2] > 0 Then
                ConsoleWrite("DblClick orig=" & $g_aTreeData[$iIdx][9] & @CRLF)
        EndIf
EndFunc   ;==>_OnDblClick

;========== 从数组加载数据 (适配你的 CSV 格式) ==========
; $aData 每行: [0]=GroupID [1]=Name [2]=TypeCode [3]=X [4]=Y
;               [5]=Flag [6]=Const [7]=ItemID [8]=DisplayText [9]=HasChildren
; 主项显示 "Name(X,Y)", 子项显示 DisplayText
Func _LoadTreeFromData($aData)
        _TreeInit()
        If UBound($aData, 0) <> 2 Or UBound($aData, 1) = 0 Then Return

        Local $aSeenGid[0]
        For $r = 0 To UBound($aData) - 1
                Local $g = $aData[$r][0]
                Local $bFound = False
                For $s = 0 To UBound($aSeenGid) - 1
                        If $aSeenGid[$s] = $g Then
                                $bFound = True
                                ExitLoop
                        EndIf
                Next
                If Not $bFound Then
                        ReDim $aSeenGid[UBound($aSeenGid) + 1]
                        $aSeenGid[UBound($aSeenGid) - 1] = $g
                EndIf
        Next
        _TreeAdd(-1, "地图 " & $aData[0][6] & " 共有 " & UBound($aSeenGid) & " 个对象", 0, 0)

        Local $iMaxGid = 0
        Local $aSeen[0]
        For $r = 0 To UBound($aData) - 1
                Local $g = $aData[$r][0]
                If $g > $iMaxGid Then $iMaxGid = $g
                Local $bFound = False
                For $s = 0 To UBound($aSeen) - 1
                        If $aSeen[$s] = $g Then
                                $bFound = True
                                ExitLoop
                        EndIf
                Next
                If Not $bFound Then
                        ReDim $aSeen[UBound($aSeen) + 1]
                        $aSeen[UBound($aSeen) - 1] = $g
                EndIf
        Next

        Local $aGroupNode[$iMaxGid + 1]
        For $i = 0 To $iMaxGid
                $aGroupNode[$i] = -1
        Next

        For $s = 0 To UBound($aSeen) - 1
                Local $iGid = $aSeen[$s]
                Local $sName = "", $iX = 0, $iY = 0, $iFlag = 0
                For $r = 0 To UBound($aData) - 1
                        If $aData[$r][0] = $iGid Then
                                $sName = $aData[$r][1]
                                $iX = $aData[$r][3]
                                $iY = $aData[$r][4]
                                $iFlag = $aData[$r][5]
                                ExitLoop
                        EndIf
                Next
                Switch $iFlag
                        Case 0
                                $aGroupNode[$iGid] = _TreeAdd(-1, $sName, 1, 1, $iX, $iY)
                        Case 1
                                $aGroupNode[$iGid] = _TreeAdd(-1, $sName, 2, 2, $iX, $iY)
                        Case 2, 3
                                $aGroupNode[$iGid] = _TreeAdd(-1, $sName, 3, 3, $iX, $iY)
                        Case Else
                                $aGroupNode[$iGid] = _TreeAdd(-1, $sName, 1, 1, $iX, $iY)
                EndSwitch
        Next

        For $r = 0 To UBound($aData) - 1
                If $aData[$r][7] >= 0 Then
                        _TreeAdd($aGroupNode[$aData[$r][0]], $aData[$r][7] & " " & $aData[$r][8], 4, 5, 0, 0, $r)
                EndIf
        Next
EndFunc   ;==>_LoadTreeFromData

;========== 列宽自适应 ==========
Func _AutoSizeColumn()
        Local $hDC = _WinAPI_GetDC($g_hListHwnd)
        If Not $hDC Then Return

        Local $iMaxW = 0, $tSize = DllStructCreate("long cx;long cy")
        For $i = 0 To $g_iNodeCnt - 1
                Local $sTxt
                If $g_aTreeData[$i][2] > 0 Then
                        $sTxt = $g_aTreeData[$i][1]
                ElseIf $g_aTreeData[$i][4] Then
                        $sTxt = $g_aTreeData[$i][1] & "(" & $g_aTreeData[$i][7] & "," & $g_aTreeData[$i][8] & ")"
                Else
                        $sTxt = $g_aTreeData[$i][1]
                EndIf

                Local $aRet = DllCall("gdi32.dll", "bool", "GetTextExtentPoint32W", _
                                "handle", $hDC, _
                                "wstr", $sTxt, _
                                "int", StringLen($sTxt), _
                                "struct*", $tSize)
                If Not @error And $aRet[0] Then
                        Local $iW = DllStructGetData($tSize, 1)
                        Local $iLvl = $g_aTreeData[$i][2]
                        Local $iOff = $MARGIN + $iLvl * $INDENT + $BTN_SIZE + 5 + $ICON_SZ + 3
                        $iW += $iOff + 10
                        If $iW > $iMaxW Then $iMaxW = $iW
                EndIf
        Next

        _WinAPI_ReleaseDC($g_hListHwnd, $hDC)
        If $iMaxW > 0 Then GUICtrlSendMsg($g_hListView, $LVM_SETCOLUMNWIDTH, 0, $iMaxW)
EndFunc   ;==>_AutoSizeColumn

;========== 入口 ==========
Example()

Func Example()
        _GDIPlus_Startup()
        $g_hGui = GUICreate("Virtual TreeView", 680, 520)
        $g_hListView = GUICtrlCreateListView("名称", 0, 0, 240, 300, BitOR($LVS_OWNERDATA, $LVS_REPORT, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_NOCOLUMNHEADER))
        $g_hListHwnd = GUICtrlGetHandle($g_hListView)
        _GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT))

        $g_hImageList = _GUIImageList_Create(20, 20, 5, 1, 0)
        AddIcon($g_hImageList, _ICO0()) ; 0 目录 (头行)
        AddIcon($g_hImageList, _ICO1()) ; 1 进入点
        AddIcon($g_hImageList, _ICO2()) ; 2 战斗
        AddIcon($g_hImageList, _ICO3()) ; 3 NPC
        AddIcon($g_hImageList, _ICO4()) ; 4 未选中 (子项普通)
        AddIcon($g_hImageList, _ICO5()) ; 5 选中 (子项选中)

        _Rebuild()
        _AutoSizeColumn()

        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        $g_hPenLine = _WinAPI_CreatePen(0, 1, $CLR_LINE)

        GUICtrlCreateLabel("搜索:", 0, 306, 40, 20)
        $g_hSearchInput = GUICtrlCreateInput("", 40, 305, 120, 22)
        $g_hSearchBtn = GUICtrlCreateButton("搜索", 165, 305, 50, 22)
        $g_hReloadBtn = GUICtrlCreateButton("重新载入", 225, 305, 80, 22)

        Local $aAccel[1][2] = [["{ENTER}", $g_hSearchBtn]]
        GUISetAccelerators($aAccel)

        ; --- 你的数据 (模拟数组) ---
        _ReloadData()

        GUISetState(@SW_SHOW)

        While 1
                Local $iMsg = GUIGetMsg()
                Switch $iMsg
                        Case -3
                                ExitLoop
                        Case $g_hSearchBtn
                                _Search()
                        Case $g_hReloadBtn
                                _ReloadData()
                EndSwitch
        WEnd

        _WinAPI_DeleteObject($g_hPenLine)
        _GDIPlus_Shutdown()
        GUIDelete($g_hGui)
EndFunc   ;==>Example

;========== 搜索 ==========
Func _Search()
        Local $sQuery = GUICtrlRead($g_hSearchInput)
        If $sQuery = "" Then Return

        Local $aOrder[0]
        For $i = 0 To $g_iNodeCnt - 1
                If $g_aTreeData[$i][0] < 0 Then
                        Local $c = UBound($aOrder)
                        _DFSFull($i, $aOrder, $c)
                EndIf
        Next

        Local $iSelVis = _GUICtrlListView_GetNextItem($g_hListView, -1)
        Local $iCurIdx = -1
        If $iSelVis >= 0 Then $iCurIdx = $g_aVisible[$iSelVis]

        Local $iStart = -1
        For $i = 0 To UBound($aOrder) - 1
                If $aOrder[$i] = $iCurIdx Then
                        $iStart = $i + 1
                        ExitLoop
                EndIf
        Next
        If $iStart < 0 Then $iStart = 1

        For $i = $iStart To UBound($aOrder) - 1
                Local $iIdx = $aOrder[$i]
                If $iIdx = 0 Then ContinueLoop
                If Not StringInStr($g_aTreeData[$iIdx][1], $sQuery) Then ContinueLoop
                _SelectIdx($iIdx)
                Return
        Next

        For $i = 1 To $iStart - 1
                Local $iIdx = $aOrder[$i]
                If $iIdx = 0 Then ContinueLoop
                If Not StringInStr($g_aTreeData[$iIdx][1], $sQuery) Then ContinueLoop
                _SelectIdx($iIdx)
                Return
        Next
EndFunc   ;==>_Search

Func _DFSFull($iIdx, ByRef $aOut, ByRef $n)
        ReDim $aOut[$n + 1]
        $aOut[$n] = $iIdx
        $n += 1
        For $i = 0 To $g_iNodeCnt - 1
                If $g_aTreeData[$i][0] = $iIdx Then _DFSFull($i, $aOut, $n)
        Next
EndFunc   ;==>_DFSFull

Func _SelectIdx($iIdx)
        Local $iVis = _VisOf($iIdx)
        If $iVis >= 0 Then
                _GUICtrlListView_SetItemSelected($g_hListView, $iVis, True, True)
                _GUICtrlListView_EnsureVisible($g_hListView, $iVis)
                Return
        EndIf

        _ExpandPath($iIdx)
        _Rebuild()
        GUICtrlSendMsg($g_hListView, $LVM_SETITEMCOUNT, $g_iVisCnt, 0)
        _AutoSizeColumn()

        $iVis = _VisOf($iIdx)
        If $iVis >= 0 Then
                _GUICtrlListView_SetItemSelected($g_hListView, $iVis, True, True)
                _GUICtrlListView_EnsureVisible($g_hListView, $iVis)
        EndIf
EndFunc   ;==>_SelectIdx

Func _VisOf($iIdx)
        For $v = 0 To $g_iVisCnt - 1
                If $g_aVisible[$v] = $iIdx Then Return $v
        Next
        Return -1
EndFunc   ;==>_VisOf

Func _ExpandPath($iIdx)
        Local $iP = $g_aTreeData[$iIdx][0]
        While $iP >= 0 And $iP < $g_iNodeCnt
                $g_aTreeData[$iP][3] = True
                $iP = $g_aTreeData[$iP][0]
        WEnd
EndFunc   ;==>_ExpandPath

;========== 重新载入 ==========
Func _ReloadData()
        $g_iDataSet = Mod($g_iDataSet + 1, 2)
        Switch $g_iDataSet
                Case 0
                        Local $aAlt[13][9]
                        $aAlt[0][0] = 1
                        $aAlt[0][1] = "张三"
                        $aAlt[0][2] = 10001
                        $aAlt[0][3] = 100
                        $aAlt[0][4] = 200
                        $aAlt[0][5] = 0
                        $aAlt[0][6] = 66
                        $aAlt[0][7] = 10
                        $aAlt[0][8] = "打招呼"
                        $aAlt[1][0] = 1
                        $aAlt[1][1] = "张三"
                        $aAlt[1][2] = 10001
                        $aAlt[1][3] = 100
                        $aAlt[1][4] = 200
                        $aAlt[1][5] = 0
                        $aAlt[1][6] = 66
                        $aAlt[1][7] = 11
                        $aAlt[1][8] = "给东西"
                        $aAlt[2][0] = 1
                        $aAlt[2][1] = "张三"
                        $aAlt[2][2] = 10001
                        $aAlt[2][3] = 100
                        $aAlt[2][4] = 200
                        $aAlt[2][5] = 0
                        $aAlt[2][6] = 66
                        $aAlt[2][7] = 12
                        $aAlt[2][8] = "完成"
                        $aAlt[3][0] = 2
                        $aAlt[3][1] = "李四"
                        $aAlt[3][2] = 10002
                        $aAlt[3][3] = 300
                        $aAlt[3][4] = 400
                        $aAlt[3][5] = 1
                        $aAlt[3][6] = 66
                        $aAlt[3][7] = 20
                        $aAlt[3][8] = "战斗1"
                        $aAlt[4][0] = 2
                        $aAlt[4][1] = "李四"
                        $aAlt[4][2] = 10002
                        $aAlt[4][3] = 300
                        $aAlt[4][4] = 400
                        $aAlt[4][5] = 1
                        $aAlt[4][6] = 66
                        $aAlt[4][7] = 21
                        $aAlt[4][8] = "战斗2"
                        $aAlt[5][0] = 2
                        $aAlt[5][1] = "李四"
                        $aAlt[5][2] = 10002
                        $aAlt[5][3] = 300
                        $aAlt[5][4] = 400
                        $aAlt[5][5] = 1
                        $aAlt[5][6] = 66
                        $aAlt[5][7] = 22
                        $aAlt[5][8] = "战斗3"
                        $aAlt[6][0] = 3
                        $aAlt[6][1] = "王五"
                        $aAlt[6][2] = 10003
                        $aAlt[6][3] = 500
                        $aAlt[6][4] = 600
                        $aAlt[6][5] = 2
                        $aAlt[6][6] = 66
                        $aAlt[6][7] = 30
                        $aAlt[6][8] = "对话"
                        $aAlt[7][0] = 3
                        $aAlt[7][1] = "王五"
                        $aAlt[7][2] = 10003
                        $aAlt[7][3] = 500
                        $aAlt[7][4] = 600
                        $aAlt[7][5] = 2
                        $aAlt[7][6] = 66
                        $aAlt[7][7] = 31
                        $aAlt[7][8] = "交任务"
                        $aAlt[8][0] = 3
                        $aAlt[8][1] = "王五"
                        $aAlt[8][2] = 10003
                        $aAlt[8][3] = 500
                        $aAlt[8][4] = 600
                        $aAlt[8][5] = 2
                        $aAlt[8][6] = 66
                        $aAlt[8][7] = 32
                        $aAlt[8][8] = "接任务"
                        $aAlt[9][0] = 4
                        $aAlt[9][1] = "赵六"
                        $aAlt[9][2] = 10004
                        $aAlt[9][3] = 700
                        $aAlt[9][4] = 800
                        $aAlt[9][5] = 3
                        $aAlt[9][6] = 66
                        $aAlt[9][7] = 40
                        $aAlt[9][8] = "商店"
                        $aAlt[10][0] = 4
                        $aAlt[10][1] = "赵六"
                        $aAlt[10][2] = 10004
                        $aAlt[10][3] = 700
                        $aAlt[10][4] = 800
                        $aAlt[10][5] = 3
                        $aAlt[10][6] = 66
                        $aAlt[10][7] = 41
                        $aAlt[10][8] = "买卖"
                        $aAlt[11][0] = 4
                        $aAlt[11][1] = "赵六"
                        $aAlt[11][2] = 10004
                        $aAlt[11][3] = 700
                        $aAlt[11][4] = 800
                        $aAlt[11][5] = 3
                        $aAlt[11][6] = 66
                        $aAlt[11][7] = 42
                        $aAlt[11][8] = "修理"
                        $aAlt[12][0] = 4
                        $aAlt[12][1] = "赵六"
                        $aAlt[12][2] = 10004
                        $aAlt[12][3] = 700
                        $aAlt[12][4] = 800
                        $aAlt[12][5] = 3
                        $aAlt[12][6] = 66
                        $aAlt[12][7] = 43
                        $aAlt[12][8] = "离开"
                        _LoadTreeFromData($aAlt)
                Case 1
                        Local $aEmpty[0][0]
                        _LoadTreeFromData($aEmpty)
        EndSwitch

        _Rebuild()
        $g_iVisCnt = UBound($g_aVisible)
        GUICtrlSendMsg($g_hListView, $LVM_SETITEMCOUNT, $g_iVisCnt, 0)
        _AutoSizeColumn()
EndFunc   ;==>_ReloadData

;========== 自定义图标 (Base64 PNG → Icon) ==========
Func AddIcon($hIL, $bBytes)
        Local $hBmp = _GDIPlus_BitmapCreateFromMemory($bBytes)
        Local $hIco = _GDIPlus_HICONCreateFromBitmap($hBmp)
        _GUIImageList_ReplaceIcon($hIL, -1, $hIco)
        _WinAPI_DestroyIcon($hIco)
        _GDIPlus_BitmapDispose($hBmp)
EndFunc   ;==>AddIcon

Func _ICO0()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAADblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEg3blhIg25YSDtuWEgDblhIA25YSDtuWEiHblhIh25YSIduWEiHblhIh25YSIduWEiDblhIN25YSANuWEg3blhKi25YS5tuWEqfblhIM25YSDtuWEqfblhLk25YS4tuWEuLblhLi25YS4tuWEuLblhLk25YSoNuWEgzblhIf25YS39uWEv/blhLk25YSHNuWEhzblhLk25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtzblhIc25YSC9uWEpXblhLZ25YSmduWEgrblhIK25YSmduWEtfblhLW25YS1tuWEtbblhLW25YS1tuWEtfblhKS25YSCtuWEgDblhIH25YSE9uWEgfblhIA25YSANuWEgfblhIT25YSFNuWEhTblhIU25YSFNuWEhTblhIT25YSBtuWEgDblhIA25YSDtuWEiDblhIO25YSANuWEgDblhIO25YSIduWEiHblhIh25YSIduWEiHblhIh25YSINuWEg3blhIA25YSDduWEqPblhLn25YSqNuWEg3blhIN25YSqNuWEuXblhLj25YS49uWEuPblhLj25YS49uWEuXblhKh25YSDNuWEh/blhLf25YS/9uWEuTblhIc25YSHNuWEuTblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS3NuWEhzblhIL25YSk9uWEtjblhKY25YSCtuWEgrblhKY25YS1tuWEtXblhLU25YS1NuWEtTblhLV25YS1tuWEpHblhIK25YSANuWEgbblhIS25YSBtuWEgDblhIA25YSBtuWEhLblhIS25YSEtuWEhLblhIS'
        $s &= '25YSEtuWEhLblhIG25YSANuWEgDblhIQ25YSJNuWEhDblhIA25YSANuWEhDblhIk25YSJNuWEiTblhIk25YSJNuWEiXblhIk25YSD9uWEgDblhIO25YSp9uWEurblhKs25YSDduWEg3blhKs25YS6NuWEubblhLm25YS5tuWEubblhLm25YS6NuWEqTblhIN25YSH9uWEt/blhL/25YS5NuWEhzblhIc25YS5NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLc25YSHNuWEgrblhKP25YS0tuWEpTblhIK25YSCtuWEpTblhLR25YSz9uWEs/blhLP25YSz9uWEs/blhLR25YSjduWEgnblhIA25YSB9uWEhTblhIH25YSANuWEgDblhIH25YSFNuWEhXblhIV25YSFduWEhXblhIV25YSFNuWEgbblhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO0

Func _ICO1()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAABKMvUASjL1AEoy9QBKMvUASjL1AEsz9QBLM/UAAADrAmhV969/bvjLWkT2ZiwQ8xv08v8ATTb1AEox9QBKMvUASjL1AEoy9QxKMvUbSjL1L0kw9TBGLfUwQin0LzUa9DOLe/nB6eb+/8vE/PmbjfnQblv3g0019T1KMvUjSjL1Ikoy9QBKMvUWSjL1M0cu9V1iTfbBhHT48LWr++2yp/vunI/6+vn4////////+/v//9zV/f94ZvjMQyr1Skoy9UJKMvUASjL1AEoy9QAUAPILjH35qK6j+//+/v//+/r//7Op+//39v/////////////6+f//lYf5twAA6gRKMvUASjL1AEoy9QBLM/UAQyr1OYd4+Ni7svv//v3///n4//+yqPv/9/b/////////////+Pj//5SF+bcAAO4GSTL1AEAm9CQ4HfQkNRr0IU019V6Thfn5tKv7//v6///5+f//sqj7//j4//////////////j4//+Uhfm3AADuBkky9QCDcvjlrqP75a6j++Wsofrs49/9/sW9/P+8tPv/9vX//7Ko+//i3v3/+fj////////4+P//lIX5twAA7gZJMvUAsqj7///////////////////////+/v//tq37/7+3+/+1rPv/tqz7/+He/f//////+Pj//5SF+bcAAO4GSTL1AKyh+v/498//9vX///f2///+/v//9fT+/62i+v/Qyvz/tav7/7as+//h3v3///////j4//+Uhfm3AADuBkky9QBvXPe5jHz5uYt8+biIefjLzsf8/bOp+//Qyvz/+vr//7Ko+//i3v3/+fj////////4+P//5SF+bcAAO4GSTL1ADwDxBwAA7wcAAOYDSC/1SIV1+PfNxvz///////n4//+yqPv/+Pj/////////////'
        $s &= '+Pj//5SF+bcAAO4GSTL1AEoy9QBKMvUASjL1AD0j9DCWifnF0Mr8///////6+f//sqj7//f2//////////////j4//+Uhfm3AADuBkky9QAAAAAAAAAAAEoy9QAAAPAGhnb4q5uN+f+2rPv/s6n7/52Q+v/4+P/////////////6+f//lYf5uAAA7gZJMvUAAAAAAAAAAABJMvQAAADuA3Bd96KbjfnwmIv57JOF+e2Thfn5+vn////////7+///29b9/39u+K8AAO8FSjL1AAAAAAAAAAAASjL0AFI79QFHL/UfSC/1L0kx9S47IfQyjHz5wenm/v/Kw/z5mo350W5a94RON/UuAADvAEoy9QAAAAAAAAAAAEoy9ABJMfQASjL1AEsz9QBLM/UAAADrAmhU969/bvjKWUP2Zi0R8xv49/8ATzf1ACkM8wBKMvUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO1

Func _ICO2()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAznf8AM53/ADOd/wAznf8ASH/yAEeB8wBHgfMAP4P9AP9UAAD+WxcA/lsXAP5aFgD/kVoA/5FaAP+RWgD/kVoAM53/ADOd/wIznf8nM53/Hj2P+QBHgfMLR4HzGj6D/QH/VQAA/lsXGf5bFwz+djkA/5FaHv+RWif/kVoC/5FaADOd/wAznf8qM53/2zOd/803l/xGR4HzmkeB87U+g/4M/1cCCf5bF67+Whaf/4RJSP+SW83/kVrb/5FaKv+RWgAznf8AM53/IzOd/9U0m/7/QIv38EeA8+9HgfNkM5X/AZ5xjgD+Wxde/loW7v5tLfH/jVX//5Jb1f+RWiP/kVoADtH/AD2P+QA3l/xQQIv39ESD9P84evnuL3H9XAC4/wD/AAAA/1oXW/9dF+3+YBj//m0u9P+FS1D+dTcA///kAEeB8wBHgfMGR4DzmEaC8/EerPnwGJ39/y1z/fAzcfh68Vwnev9dFvD+liX//qQo8P5dF/D+Whaa/lsWB/5bFwBHgfMAR4HzCEeB84RHgfNbAM7+ZgDL//MYnf7+L3P7/INooPzukzb+/9Yy8/7aNWb+Wxdb/lsXh/5bFwn+WxcAR4HzAEeB8wBIgvEBO5bqAAD//wEewOOUBsj6/xqc/P8tc/3/bZDB/8nAaJX//wAB8YYvAP1cGQH+WxcA/lsXAEeC9ADzXiYA2mNDAP5bGQD/WBI78GEkzF+iqP8Ayv//G537/yxz/v8ucf3NLHH/PDBw+gBdbckAOXHwAP5aFgD/WxcA/1sXAP9bFwH/WxdX/1oX4f9cFv/lmzt8Q9DI/wHK//8Znf38LXP9/y5y/eEucv1XLnL9AS5y/QAucv0A/1sXAP9bFwn/Wxd1/1oX8P9dF//+liX8/9Uy/8vXXd0JzvbcAcr+/xid/fwtc/3/'
        $s &= 'LnL98C5y/XUucv0JLnL9AP9bFwD/Wxdv/1oX+/9dF///liX8/tU0//7aNej/2SxFAM3/QwDO/ucByv7/GJ39/C1z/f8ucv37LnL9by5y/QD/WRcA/1oXkv9dF///liX8/tU0//7aNfX+2TVj4NdNAB3O5wAAzf5gAM7+9AHK/v8Ynf38LXP9/y5x/ZIvcf4A/4AgAP9hGJL/liX//tU0//7aNf7+2TWB/tk1A//ZMgAAzf8AAM3+AwDN/n4Azf79Acr+/xid/f8sd/2SII3+AP3/SAD/lyVU/tAzmf7aNZn+2TV5/tk1Df7ZNQD+2TUAAM3+AADN/gAAzf4MAM3+dwDO/poDxv6ZGJ39VAD//wD/AAAA/wAAAP9qGwD+3TYA/tk1AP7ZNQD+2TUAAAAAAAAAAAAAzf4AAM3+AADM/gAAz/4AJ339AKIA+gD/APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO2

Func _ICO3()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAzMzMAICUnABgaGxAcJCgkHSYqJB0mKiQdJiokHSYqJB0mKiQdJiokHSYqJB0mKiQcJSokGCMoECAoKwAzMzMAMzMzABgcHg50bmunpH1q4aR2X9+kd2Dfpnhh36d5Yd+neWHfpnhh36R3YN+kd2Dfo3Zg4XNZTKcYIygOMzMzADMzMwAVGRwaoJiT3vy5l//7qoH//ayD/9KScv+Wblr/lm5a/9KScv/9rIP/+6uC//urg/+ec17eFSEnGjMzMwAzMzMAAAAACoiGhb71wKb/+qmA//yrg//QkXH/lG1a/5RtWv/QkXH//KuD//qqgv/zpn//hmVUvgAFFAozMzMAMzMzAJ6engBaXF1y0r2y//2zjf/7qoL//q2E//+thP//rYT//qyE//urgv/9rIP/0JFx/1hJQnKbcVwAMzMzADMzMwAyMjIAHR4eF4SDg8DnxLP/5KB+/76GavaoeWLlqHli5b6GavbknXn/5Z16/4JiUsAdJioXMjIzADMzMwAAAAAAPT09AEhISQA4OTotdnNyt29gWJo+ODVCHSMiIB0jIiA+OTdCblZKmnRaTbc3NjUtRz87ADw5NwAAAAAAAAAAADMzMwDKysoASUpLAAAAAAsAAAAINTY7N0NHXXJDR11xNTY7OAAAAAgAEh4LSEA8AMWLbQAzMzMAAAAAAAAAAAAAAAAAMzMzACopKQAMCAAGUlRggGh0se9zhd3/c4Xe/2Nvse9ESGCAHBYABi8uKQAzMzMAAAAAAAAAAAAAAAAAAAAAADU1NQBdXV4ATk1KVIWOvPiDmP//gZb//4GW//+Blv//Z3W89zw+SlRDR14ANDQ0AAAAAAAAAAAAAAAAAAAAAAAzMzMAAAAAAXR0dqKbqfD/f5T//4CV//+Alf//gJX//3qO7/9MU3ah'
        $s &= 'AAAAATMzMwAAAAAAAAAAAAAAAAAAAAAAMzMzAAAAAAR/gIGxprP2/36T//+Alf//gJX//4CV//98kPb/UFiBsAAAAAQzMzMAAAAAAAAAAAAAAAAAAAAAADMzMwDy8vIAZmVjgre93v+Jnf//fpP//3+U//+Alv//dofe/0ZLY4J9j+0AMzMzAAAAAAAAAAAAAAAAAAAAAAAzMzMAOjo6ADAvLiWMjI7PusHo/5yt//+SpP//j57o/2dujs8xMS4lODo6ADMzMwAAAAAAAAAAAAAAAAAAAAAANTU1ALGxsQBcW1oANzc2LnV1c6CVl57XjpGe12xtc6A9OzYuVVVaAHeAqQAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMA////AEJCQgAAAAAEFhURHBoZERwAAAAEQkJCAP///wAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAA4AcAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO3

Func _ICO4()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwFLCwsSywsLKksLCzVLCws3CwsLNwsLCzVLCwsqSwsLEssLCwFLCwsACwsLAArKysALCwsACwsLAAsLCwYLCwskywsLMMsLCx9LCwsPiwsLCUsLCwlLCwsPiwsLH0sLCzDLCwskywsLBgsLCwALCwsACwsLAAsLCwYLCwsriwsLJ8sLCwgLCwsACwsLAAsLCwALCwsACwsLAAsLCwALCwsICwsLJ8sLCyuLCwsGCwsLAAsLCwFLCwskywsLJ8sLCwMLCwsAC0tLQAsLCwAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwMLCwsnywsLJMsLCwFLCwsSywsLMMsLCwgLCwsACwsLAArKysAAAAAAAAAAAAAAAAAAAAAAC0tLQAsLCwALCwsACwsLCAsLCzDLCwsSywsLKksLCx9LCwsACwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tACsrKwAsLCwALCwsfSwsLKksLCzVLCwsPiwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLD4sLCzVLCws3CwsLCUsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAAsLCwlLCws3CwsLNwsLCwlLCwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsJSwsLNwsLCzVLCwsPiwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLD4sLCzVLCwsqSwsLH0sLCwALi4uACsrKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArKysA'
        $s &= 'LCwsACwsLAAsLCx9LCwsqSwsLEssLCzDLCwsICwsLAAsLCwAKysrAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwgLCwswywsLEssLCwFLCwskywsLJ8sLCwMLCwsAC0tLQAsLCwAAAAAAAAAAAAsLCwAKysrACwsLAAsLCwMLCwsnywsLJMsLCwFLCwsACwsLBgsLCyuLCwsnywsLCAsLCwALCwsACwsLAAsLCwALCwsACwsLAAsLCwgLCwsnywsLK4sLCwYLCwsACwsLAAsLCwALCwsACwsLBgsLCyTLCwswywsLH0sLCw+LCwsJSwsLCUsLCw+LCwsfCwsLMMsLCyTLCwsGCwsLAAsLCwALCwsACwsLAAsLCwALCwsBSwsLEssLCypLCws1SwsLNwsLCzcLCws1SwsLKosLCxMLCwsBSwsLAAsLCwALCwsAAAAAAAAAAAAAAAAAAGAAAADwAAAB+AAAA/wAAAf+AAAH/gAAA/wAAAH4AAAA8AAAAGAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO4

Func _ICO5()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAABIW/oAR1v5AEdb+QBHW/kFR1v5S0db+alHW/nVR1v53Edb+dxHW/nVR1v5qUdb+UtHW/kFR1v5AEdb+QBHW/oAR1v5AEdb+QBHW/kYR1v5k0db+cNHW/l9R1v5Pkdb+SVHW/klR1v5Pkdb+X1HW/nDR1v5k0db+RhHW/kAR1v5AEdb+QBHW/kYR1v5rkdb+Z9HW/kgR1v5AEdb+QBHW/kAR1v5AEdb+QBHW/kAR1v5IEdb+Z9HW/muR1v5GEdb+QBHW/kFR1v5k0db+Z9HW/kMR1v5AEdb+QBHW/kFR1v5GUdb+RlHW/kFR1v5AEdb+QBHW/kMR1v5n0db+ZNHW/kFR1v5S0db+cNHW/kgR1v5AEdb+QBHW/k3R1v5pkdb+dlHW/nZR1v5p0db+TdHW/kAR1v5AEdb+SBHW/nDR1v5S0db+alHW/l9R1v5AEdb+QBHW/k3R1v53Edb+f9HW/n/R1v5/0db+f9HW/ncR1v5N0db+QBHW/kAR1v5fUdb+alHW/nVR1v5Pkdb+QBHW/kFR1v5p0db+f9HW/n/R1v5/0db+f9HW/n/R1v5/0db+aZHW/kFR1v5AEdb+T5HW/nVR1v53Edb+SVHW/kAR1v5GUdb+dlHW/n/R1v5/0db+f9HW/n/R1v5/0db+f9HW/nZR1v5GUdb+QBHW/klR1v53Edb+dxHW/klR1v5AEdb+RlHW/nZR1v5/0db+f9HW/n/R1v5/0db+f9HW/n/R1v52Udb+RlHW/kAR1v5JUdb+dxHW/nVR1v5Pkdb+QBHW/kFR1v5p0db+f9HW/n/R1v5/0db+f9HW/n/R1v5/0db+adHW/kFR1v5AEdb+T5HW/nVR1v5qUdb+X1HW/kAR1v5AEdb+TdHW/ncR1v5/0db+f9HW/n/R1v5/0db+dxHW/k3'
        $s &= 'R1v5AEdb+QBHW/l9R1v5qUdb+UtHW/nDR1v5IEdb+QBHW/kAR1v5N0db+adHW/nZR1v52Udb+adHW/k3R1v5AEdb+QBHW/kgR1v5w0db+UtHW/kFR1v5k0db+Z9HW/kMR1v5AEdb+QBHW/kFR1v5GUdb+RlHW/kFR1v5AEdb+QBHW/kMR1v5n0db+ZNHW/kFR1v5AEdb+RhHW/muR1v5n0db+SBHW/kAR1v5AEdb+QBHW/kAR1v5AEdb+QBHW/kgR1v5n0db+a5HW/kYR1v5AEdb+QBHW/kAR1v5GEdb+ZNHW/nDR1v5fUdb+T5HW/klR1v5JUdb+T5HW/l8R1v5w0db+ZNHW/kYR1v5AEdb+QBHWvoAR1v5AEdb+QBHW/kFR1v5S0db+alHW/nVR1v53Edb+dxHW/nVR1v5qkdb+UxHW/kFR1v5AEdb+QBIWvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO5

Func _WinAPI_Base64Decode($sB64String)
        Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
        Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
        $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
        Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

 楼主| 发表于 6 天前 | 显示全部楼层
测了下,数据大的情况下,这样模拟的效果,还不如直接用树形图的控件
 楼主| 发表于 前天 20:14 | 显示全部楼层
搞了个树形图 懒加载,支持搜索功能,多大的数据都无所谓了

#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <TreeViewConstants.au3>
#include <WindowsNotifsConstants.au3>

Opt('TrayIconHide', 1)

Global $TreeViewArray[][] = [ _
                [0, "进入点", 0, 30, 810, 0, 66, 3, "双手A-62361提示"], _
                [0, "进入点", 0, 30, 810, 0, 66, 55, "55-去"], _
                [0, "进入点", 0, 30, 810, 0, 66, 56, "55-去"], _
                [0, "进入点", 0, 30, 810, 0, 66, 57, "55-不去"], _
                [0, "进入点", 0, 30, 810, 0, 66, 27, "作东宴黄蓉(F-60704)"], _
                [0, "进入点", 0, 30, 810, 0, 66, 21, "到小破庙"], _
                [0, "进入点", 0, 30, 810, 0, 66, 48, "桃木镯O>得桃木镯"], _
                [1, "造船司", 39028, 570, 470, 2, 66, 1, "新事件"], _
                [2, "港务司", 39028, 930, 330, 2, 66, 2, "新事件"], _
                [3, "流浪商人", 39014, 610, 730, 2, 66, 4, "新事件"], _
                [3, "流浪商人", 39014, 610, 730, 2, 66, 5, "新事件"], _
                [3, "流浪商人", 39014, 610, 730, 2, 66, 6, "新事件"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 7, "新事件"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 14, "乱说话"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 15, "a"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 16, "b"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 17, "c"], _
                [4, "强力船帆领取处", 39028, 250, 590, 2, 66, 18, "d"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 8, "换宝物"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 9, "乱说话"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 10, "a"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 11, "b"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 12, "c"], _
                [5, "霹雳弹兑换处", 39028, 310, 570, 2, 66, 13, "d"], _
                [6, "进入点", 0, 30, 310, 0, 66, 23, "新事件"], _
                [7, "富豪", 39035, 670, 690, 2, 66, 28, "新事件"], _
                [8, "船商", 39080, 510, 670, 2, 66, 30, "新事件"], _
                [8, "船商", 39080, 510, 670, 2, 66, 31, "快艇"], _
                [8, "船商", 39080, 510, 670, 2, 66, 32, "龙级"], _
                [8, "船商", 39080, 510, 670, 2, 66, 33, "铁甲"], _
                [8, "船商", 39080, 510, 670, 2, 66, 22, "幽灵船"], _
                [8, "船商", 39080, 510, 670, 2, 66, 34, "离开"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 35, "Q宝服务-1"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 38, "医疗Q宝(副)"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 39, "寄养Q宝(副)"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 40, "提领Q宝(副)"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 41, "购买Q宝用品(副)"], _
                [9, "码头Q宝商人", 39002, 890, 630, 2, 66, 42, "Q宝休息(副)"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 36, "丐.10>"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 37, "副事件"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 43, "副事件"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 44, "丐.10<"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 45, "新事件"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 46, "新事件"], _
                [10, "鱼贩", 39016, 770, 770, 2, 66, 47, "新事件"], _
                [11, "查小镛", 39031, 430, 670, 2, 66, 19, "新事件"], _
                [11, "查小镛", 39031, 430, 670, 2, 66, 20, "新事件"], _
                [11, "查小镛", 39031, 430, 670, 2, 66, 24, "新事件"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 25, "7完成提示"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 26, "6换奖励"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 29, "5领地图"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 49, "4得端午粽"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 50, "3端午粽提示"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 58, "2得雄黄酒"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 59, "1雄黄酒提示"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 70, "0起头"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 71, "报名"], _
                [12, "端午活动大使", 60913, 750, 510, 2, 66, 72, "了解"], _
                [13, "朝廷讨逆使", 38708, 630, 530, 2, 66, 73, "炸弹超人"], _
                [13, "朝廷讨逆使", 38708, 630, 530, 2, 66, 74, "要"], _
                [13, "朝廷讨逆使", 38708, 630, 530, 2, 66, 75, "新事件"], _
                [14, "码头工人", 39784, 350, 730, 2, 66, 51, "进出点"], _
                [14, "码头工人", 39784, 350, 730, 2, 66, 52, "离开"], _
                [14, "码头工人", 39784, 350, 730, 2, 66, 53, "一般对话"], _
                [15, "海上总坛管理员", 39028, 1070, 390, 2, 66, 0, "新事件"], _
                [15, "海上总坛管理员", 39028, 1070, 390, 2, 66, 54, "新事件"], _
                [16, "城市传送员", 60937, 170, 770, 2, 66, 76, "传"], _
                [16, "城市传送员", 60937, 170, 770, 2, 66, 77, "大理"], _
                [16, "城市传送员", 60937, 170, 770, 2, 66, 78, "西夏"], _
                [16, "城市传送员", 60937, 170, 770, 2, 66, 79, "京城"], _
                [16, "城市传送员", 60937, 170, 770, 2, 66, 80, "扬州"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 60, "换宝物"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 61, "乱说话"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 62, "a"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 63, "b"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 64, "c"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 65, "d"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 66, "新事件"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 67, "新事件"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 68, "新事件"], _
                [17, "宝物布政司", 39028, 690, 770, 2, 66, 69, "新事件"], _
                [18, "于小夫", 39020, 410, 570, 2, 66, 81, "已取货提示"], _
                [18, "于小夫", 39020, 410, 570, 2, 66, 82, "寻菜香3-2采买"], _
                [18, "于小夫", 39020, 410, 570, 2, 66, 83, "一般对话"] _
                ]

; ---- 全局 ----
Global $g_hGui, $evtTreeView, $g_hImageList
Global $g_idSearchInput, $g_idSearchBtn
Global $TreeViewArrayMap[], $NullMap[]
; ============== 入口 ==============
_Init()

While 1
        Switch GUIGetMsg()
                Case -3 ; $GUI_EVENT_CLOSE
                        ExitLoop
                Case $g_idSearchBtn
                        TreeView_SearchAndSelect($evtTreeView, GUICtrlRead($g_idSearchInput))
        EndSwitch
WEnd
_GDIPlus_Shutdown()
GUIDelete()

; ============== 初始化 ==============
Func _Init()
        _GDIPlus_Startup()
        $g_hGui = GUICreate("懒加载 TreeView Demo", 440, 560)

        ; 搜索栏
        GUICtrlCreateLabel("搜索:", 8, 8, 32, 20)
        $g_idSearchInput = GUICtrlCreateInput("", 42, 6, 300, 22, 0x88) ; BitOR($ES_AUTOHSCROLL, $ES_WANTRETURN) 阻止 Enter 走默认按钮路径
        $g_idSearchBtn = GUICtrlCreateButton("查找", 348, 5, 80, 24)

        ; 用加速键处理 Enter,避免默认按钮机制产生重复 BN_CLICKED
        Local $aAccel[1][2] = [["{ENTER}", $g_idSearchBtn]]
        GUISetAccelerators($aAccel)

        ; 树控件
        $evtTreeView = GUICtrlCreateTreeView(8, 34, 420, 490, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
        ; 用与虚表相同的图标布局(0=目录 1=进入点 2=战斗 3=NPC 4=子项未选 5=子项选中)
        $g_hImageList = _GUIImageList_Create(20, 20, 5, 1, 0)
        AddIcon($g_hImageList, _ICO0())
        AddIcon($g_hImageList, _ICO1())
        AddIcon($g_hImageList, _ICO2())
        AddIcon($g_hImageList, _ICO3())
        AddIcon($g_hImageList, _ICO4())
        AddIcon($g_hImageList, _ICO5())
        _GUICtrlTreeView_SetNormalImageList($evtTreeView, $g_hImageList)

        _BuildTreeLazy($TreeViewArray)

        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        GUISetState(@SW_SHOW)
EndFunc   ;==>_Init

; ============== 构建懒加载树 ==============
Func _BuildTreeLazy($arr)
        $TreeViewArrayMap = $NullMap ;清空地图
        _GUICtrlTreeView_BeginUpdate($evtTreeView)
        _GUICtrlTreeView_DeleteAll($evtTreeView)
        If UBound($arr) = 0 Then Return _GUICtrlTreeView_EndUpdate($evtTreeView)
        _GUICtrlTreeView_Add($evtTreeView, 0, "地图 " & $arr[0][6] & " 共有 " & $arr[UBound($arr) - 1][0] + 1 & " 个对象", 0, 0) ; 添加标题主项信息

        Local $Lastgid = -1, $gid, $iIcon, $hItem
        For $r = 0 To UBound($arr) - 1
                $gid = $arr[$r][0]
                If $Lastgid <> $gid Then  ;判断是不是新的主项
                        $Lastgid = $gid
                        Switch $arr[$r][5]
                                Case 0
                                        $iIcon = 1
                                Case 1
                                        $iIcon = 2
                                Case 2, 3
                                        $iIcon = 3
                                Case Else
                                        $iIcon = 0
                        EndSwitch

                        $hItem = _GUICtrlTreeView_Add($evtTreeView, 0, $arr[$r][1] & " (" & $arr[$r][3] & "," & $arr[$r][4] & ")", $iIcon, $iIcon)     ; 添加主项
                        $TreeViewArrayMap[$hItem & '-h'] = $Lastgid
                        If $arr[$r][7] >= 0 Then _GUICtrlTreeView_AddChild($evtTreeView, $hItem, "Loading...")      ; 添加待加载子项
                        $TreeViewArrayMap[$Lastgid] = $hItem
                        $TreeViewArrayMap[$Lastgid & '-n'] = (StringLen($arr[$r][7]) > 0) ? 1 : 0
                        $TreeViewArrayMap[$Lastgid & '-s'] = $r
                Else
                        If StringLen($arr[$r][7]) > 0 Then $TreeViewArrayMap[$Lastgid & '-n'] += 1
                EndIf
        Next
        _GUICtrlTreeView_EndUpdate($evtTreeView)
EndFunc   ;==>_BuildTreeLazy

Func _LoadChildren($hParent, $gid)
        Local $hChild, $hOffset = $TreeViewArrayMap[$gid & '-s'], $hCount = $TreeViewArrayMap[$gid & '-n']
        If $hCount > 0 Then
                Local $hFirst = _GUICtrlTreeView_GetFirstChild($evtTreeView, $hParent)
                If $hFirst <> 0 And _GUICtrlTreeView_GetText($evtTreeView, $hFirst) = "Loading..." Then
                        _GUICtrlTreeView_BeginUpdate($evtTreeView)
                        _GUICtrlTreeView_Delete($evtTreeView, $hFirst)

                        For $i = 0 To $hCount - 1
                                $hChild = _GUICtrlTreeView_AddChild($evtTreeView, $hParent, $TreeViewArray[$i + $hOffset][7] & " " & $TreeViewArray[$i + $hOffset][8], 4, 5)
                                $TreeViewArrayMap[$hChild & '-h'] = $i + $hOffset
                                $TreeViewArrayMap[$i + $hOffset & '-c'] = $hChild
                        Next

                        _GUICtrlTreeView_EndUpdate($evtTreeView)
                EndIf
        EndIf
EndFunc   ;==>_LoadChildren

; ============== 搜索 ==============
Func TreeView_SearchAndSelect($hTree, $sFind)
        Local $iStart = 0, $gidCurrent = -1, $iCurrentRow = -1
        Local $hSel = _GUICtrlTreeView_GetSelection($hTree)
        If $hSel <> 0 Then
                Local $hSelParent = _GUICtrlTreeView_GetParentHandle($hTree, $hSel)
                If $hSelParent = 0 Then
                        $gidCurrent = $TreeViewArrayMap[$hSel & '-h']
                        $iStart = $TreeViewArrayMap[$gidCurrent & '-s']
                Else
                        $iCurrentRow = $TreeViewArrayMap[$hSel & '-h']
                        $iStart = $iCurrentRow + 1
                        $gidCurrent = $TreeViewArrayMap[$hSelParent & '-h']
                EndIf
        EndIf

        Local $hRet = _SearchDataForward($hTree, $sFind, $iStart, UBound($TreeViewArray) - 1, $gidCurrent, -1)
        If $hRet Then Return 1

        If $iStart > 0 Then
                $hRet = _SearchDataForward($hTree, $sFind, 0, $iStart - 1, -1, $iCurrentRow)
                If $hRet Then Return 1
        EndIf

        Return 0
EndFunc   ;==>TreeView_SearchAndSelect

Func _SearchDataForward($hTree, $sFind, $iFrom, $iTo, $gidSkipCol1 = -1, $iSkipRow = -1)
        Local $gid, $hParent, $hChild
        For $i = $iFrom To $iTo
                If $i = $iSkipRow Then ContinueLoop
                If StringInStr($TreeViewArray[$i][1], $sFind) Then
                        $gid = $TreeViewArray[$i][0]
                        If $gid <> $gidSkipCol1 Then
                                $hParent = $TreeViewArrayMap[$gid]
                                If $hParent Then
                                        _GUICtrlTreeView_SelectItem($hTree, $hParent)
                                        If _GUICtrlTreeView_GetChildren($hTree, $hParent) Then _GUICtrlTreeView_Expand($hTree, $hParent, True)
                                        Return 1
                                EndIf
                        EndIf
                EndIf
                If String($TreeViewArray[$i][7]) = $sFind Or StringInStr($TreeViewArray[$i][8], $sFind) Then
                        $gid = $TreeViewArray[$i][0]
                        $hParent = $TreeViewArrayMap[$gid]
                        If $hParent Then
                                _LoadChildren($hParent, $gid)
                                _GUICtrlTreeView_Expand($hTree, $hParent, True)
                                $hChild = $TreeViewArrayMap[$i & '-c']
                                If $hChild Then _GUICtrlTreeView_SelectItem($hTree, $hChild)
                                Return 1
                        EndIf
                EndIf
        Next
        Return 0
EndFunc   ;==>_SearchDataForward


; ============== WM_NOTIFY ==============
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        If @error Then Return $GUI_RUNDEFMSG
        Local $IDFrom = DllStructGetData($tNMHDR, 2)
        Local $Event = DllStructGetData($tNMHDR, 3)
        $tNMHDR = 0
        Switch $IDFrom
                Case $evtTreeView
                        Switch $Event
                                Case $NM_DBLCLK
                                        Local $hItem = _GUICtrlTreeView_GetSelection($evtTreeView)
                                        If $hItem = 0 Then Return $GUI_RUNDEFMSG
                                        Local $hParent = _GUICtrlTreeView_GetParentHandle($evtTreeView, $hItem)
                                        If $hParent <> 0 Then
                                                Local $iRow = $TreeViewArrayMap[$hItem & '-h']
                                                If $iRow >= 0 And $iRow < UBound($TreeViewArray) Then
                                                        ConsoleWrite("双击子项 数据行=" & $iRow & " EventID=" & $TreeViewArray[$iRow][7] & " Text=" & $TreeViewArray[$iRow][8] & @CRLF)
                                                EndIf
                                        EndIf

                                Case $TVN_SELCHANGEDW ; 选择变化
                                        Local $tN = DllStructCreate($tagNMTREEVIEW, $lParam)
                                        Local $hNewItem = DllStructGetData($tN, "NewhItem")
                                        Local $hParent = _GUICtrlTreeView_GetParentHandle($evtTreeView, $hNewItem)
                                        If $hParent <> 0 Then
                                                Local $iRow = $TreeViewArrayMap[$hNewItem & '-h']
                                                If $iRow >= 0 And $iRow < UBound($TreeViewArray) Then
                                                        ConsoleWrite("选择子项 数据行=" & $iRow & " EventID=" & $TreeViewArray[$iRow][7] & " Text=" & $TreeViewArray[$iRow][8] & @CRLF)
                                                EndIf
                                        EndIf
                                        Return 1         ; 阻止 AutoIt 默认处理(避免触发默认按钮)

                                Case $TVN_ITEMEXPANDINGW ; 懒加载
                                        Local $tN = DllStructCreate($tagNMTREEVIEW, $lParam)
                                        If DllStructGetData($tN, "Action") = $TVE_EXPAND Then
                                                _LoadChildren(DllStructGetData($tN, "NewhItem"), $TreeViewArrayMap[DllStructGetData($tN, "NewhItem") & '-h'])
                                        EndIf
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

; ============== 辅助:图标解码 ==============
Func AddIcon($hIL, $bBytes)
        Local $hBmp = _GDIPlus_BitmapCreateFromMemory($bBytes)
        Local $hIco = _GDIPlus_HICONCreateFromBitmap($hBmp)
        _GUIImageList_ReplaceIcon($hIL, -1, $hIco)
        _WinAPI_DestroyIcon($hIco)
        _GDIPlus_BitmapDispose($hBmp)
EndFunc   ;==>AddIcon

Func _WinAPI_Base64Decode($sB64String)
        Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
        Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
        $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
        Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

Func _ICO0()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAADblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEgDblhIA25YSANuWEg3blhIg25YSDtuWEgDblhIA25YSDtuWEiHblhIh25YSIduWEiHblhIh25YSIduWEiDblhIN25YSANuWEg3blhKi25YS5tuWEqfblhIM25YSDtuWEqfblhLk25YS4tuWEuLblhLi25YS4tuWEuLblhLk25YSoNuWEgzblhIf25YS39uWEv/blhLk25YSHNuWEhzblhLk25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtzblhIc25YSC9uWEpXblhLZ25YSmduWEgrblhIK25YSmduWEtfblhLW25YS1tuWEtbblhLW25YS1tuWEtfblhKS25YSCtuWEgDblhIH25YSE9uWEgfblhIA25YSANuWEgfblhIT25YSFNuWEhTblhIU25YSFNuWEhTblhIT25YSBtuWEgDblhIA25YSDtuWEiDblhIO25YSANuWEgDblhIO25YSIduWEiHblhIh25YSIduWEiHblhIh25YSINuWEg3blhIA25YSDduWEqPblhLn25YSqNuWEg3blhIN25YSqNuWEuXblhLj25YS49uWEuPblhLj25YS49uWEuXblhKh25YSDNuWEh/blhLf25YS/9uWEuTblhIc25YSHNuWEuTblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS3NuWEhzblhIL25YSk9uWEtjblhKY25YSCtuWEgrblhKY25YS1tuWEtXblhLU25YS1NuWEtTblhLV25YS1tuWEpHblhIK25YSANuWEgbblhIS25YSBtuWEgDblhIA25YSBtuWEhLblhIS25YSEtuWEhLblhIS25YSEtuWEhLblhIG25YSANuWEgDblhIQ25YSJNuWEhDblhIA25YSANuWEhDblhIk25YSJNuWEiTblhIk25YSJNuWEiXblhIk25YSD9uWEgDblhIO25YSp9uWEurblhKs25YSDduWEg3blhKs25YS6NuWEubblhLm25YS5tuWEubblhLm25YS6NuWEqTblhIN25YSH9uWEt/blhL/25YS5NuWEhzblhIc25YS5NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLc25YSHNuWEgrblhKP25YS0tuWEpTblhIK25YSCtuWEpTblhLR25YSz9uWEs/blhLP25YSz9uWEs/blhLR25YSjduWEgnblhIA25YSB9uWEhTblhIH25YSANuWEgDblhIH25YSFNuWEhXblhIV25YSFduWEhXblhIV25YSFNuWEgbblhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO0

Func _ICO1()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAABKMvUASjL1AEoy9QBKMvUASjL1AEsz9QBLM/UAAADrAmhV969/bvjLWkT2ZiwQ8xv08v8ATTb1AEox9QBKMvUASjL1AEoy9QxKMvUbSjL1L0kw9TBGLfUwQin0LzUa9DOLe/nB6eb+/8vE/PmbjfnQblv3g0019T1KMvUjSjL1Ikoy9QBKMvUWSjL1M0cu9V1iTfbBhHT48LWr++2yp/vunI/6+vn4////////+/v//9zV/f94ZvjMQyr1Skoy9UJKMvUASjL1AEoy9QAUAPILjH35qK6j+//+/v//+/r//7Op+//39v/////////////6+f//lYf5twAA6gRKMvUASjL1AEoy9QBLM/UAQyr1OYd4+Ni7svv//v3///n4//+yqPv/9/b/////////////+Pj//5SF+bcAAO4GSTL1AEAm9CQ4HfQkNRr0IU019V6Thfn5tKv7//v6///5+f//sqj7//j4//////////////j4//+Uhfm3AADuBkky9QCDcvjlrqP75a6j++Wsofrs49/9/sW9/P+8tPv/9vX//7Ko+//i3v3/+fj////////4+P//lIX5twAA7gZJMvUAsqj7///////////////////////+/v//tq37/7+3+/+1rPv/tqz7/+He/f//////+Pj//5SF+bcAAO4GSTL1AKyh+v/498//9vX///f2///+/v//9fT+/62i+v/Qyvz/tav7/7as+//h3v3///////j4//+Uhfm3AADuBkky9QBvXPe5jHz5uYt8+biIefjLzsf8/bOp+//Qyvz/+vr//7Ko+//i3v3/+fj////////4+P//5SF+bcAAO4GSTL1ADwDxBwAA7wcAAOYDSC/1SIV1+PfNxvz///////n4//+yqPv/+Pj/////////////+Pj//5SF+bcAAO4GSTL1AEoy9QBKMvUASjL1AD0j9DCWifnF0Mr8///////6+f//sqj7//f2//////////////j4//+Uhfm3AADuBkky9QAAAAAAAAAAAEoy9QAAAPAGhnb4q5uN+f+2rPv/s6n7/52Q+v/4+P/////////////6+f//lYf5uAAA7gZJMvUAAAAAAAAAAABJMvQAAADuA3Bd96KbjfnwmIv57JOF+e2Thfn5+vn////////7+///29b9/39u+K8AAO8FSjL1AAAAAAAAAAAASjL0AFI79QFHL/UfSC/1L0kx9S47IfQyjHz5wenm/v/Kw/z5mo350W5a94RON/UuAADvAEoy9QAAAAAAAAAAAEoy9ABJMfQASjL1AEsz9QBLM/UAAADrAmhU969/bvjKWUP2Zi0R8xv49/8ATzf1ACkM8wBKMvUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO1

Func _ICO2()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAznf8AM53/ADOd/wAznf8ASH/yAEeB8wBHgfMAP4P9AP9UAAD+WxcA/lsXAP5aFgD/kVoA/5FaAP+RWgD/kVoAM53/ADOd/wIznf8nM53/Hj2P+QBHgfMLR4HzGj6D/QH/VQAA/lsXGf5bFwz+djkA/5FaHv+RWif/kVoC/5FaADOd/wAznf8qM53/2zOd/803l/xGR4HzmkeB87U+g/4M/1cCCf5bF67+Whaf/4RJSP+SW83/kVrb/5FaKv+RWgAznf8AM53/IzOd/9U0m/7/QIv38EeA8+9HgfNkM5X/AZ5xjgD+Wxde/loW7v5tLfH/jVX//5Jb1f+RWiP/kVoADtH/AD2P+QA3l/xQQIv39ESD9P84evnuL3H9XAC4/wD/AAAA/1oXW/9dF+3+YBj//m0u9P+FS1D+dTcA///kAEeB8wBHgfMGR4DzmEaC8/EerPnwGJ39/y1z/fAzcfh68Vwnev9dFvD+liX//qQo8P5dF/D+Whaa/lsWB/5bFwBHgfMAR4HzCEeB84RHgfNbAM7+ZgDL//MYnf7+L3P7/INooPzukzb+/9Yy8/7aNWb+Wxdb/lsXh/5bFwn+WxcAR4HzAEeB8wBIgvEBO5bqAAD//wEewOOUBsj6/xqc/P8tc/3/bZDB/8nAaJX//wAB8YYvAP1cGQH+WxcA/lsXAEeC9ADzXiYA2mNDAP5bGQD/WBI78GEkzF+iqP8Ayv//G537/yxz/v8ucf3NLHH/PDBw+gBdbckAOXHwAP5aFgD/WxcA/1sXAP9bFwH/WxdX/1oX4f9cFv/lmzt8Q9DI/wHK//8Znf38LXP9/y5y/eEucv1XLnL9AS5y/QAucv0A/1sXAP9bFwn/Wxd1/1oX8P9dF//+liX8/9Uy/8vXXd0JzvbcAcr+/xid/fwtc/3/LnL98C5y/XUucv0JLnL9AP9bFwD/Wxdv/1oX+/9dF///liX8/tU0//7aNej/2SxFAM3/QwDO/ucByv7/GJ39/C1z/f8ucv37LnL9by5y/QD/WRcA/1oXkv9dF///liX8/tU0//7aNfX+2TVj4NdNAB3O5wAAzf5gAM7+9AHK/v8Ynf38LXP9/y5x/ZIvcf4A/4AgAP9hGJL/liX//tU0//7aNf7+2TWB/tk1A//ZMgAAzf8AAM3+AwDN/n4Azf79Acr+/xid/f8sd/2SII3+AP3/SAD/lyVU/tAzmf7aNZn+2TV5/tk1Df7ZNQD+2TUAAM3+AADN/gAAzf4MAM3+dwDO/poDxv6ZGJ39VAD//wD/AAAA/wAAAP9qGwD+3TYA/tk1AP7ZNQD+2TUAAAAAAAAAAAAAzf4AAM3+AADM/gAAz/4AJ339AKIA+gD/APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO2

Func _ICO3()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAzMzMAICUnABgaGxAcJCgkHSYqJB0mKiQdJiokHSYqJB0mKiQdJiokHSYqJB0mKiQcJSokGCMoECAoKwAzMzMAMzMzABgcHg50bmunpH1q4aR2X9+kd2Dfpnhh36d5Yd+neWHfpnhh36R3YN+kd2Dfo3Zg4XNZTKcYIygOMzMzADMzMwAVGRwaoJiT3vy5l//7qoH//ayD/9KScv+Wblr/lm5a/9KScv/9rIP/+6uC//urg/+ec17eFSEnGjMzMwAzMzMAAAAACoiGhb71wKb/+qmA//yrg//QkXH/lG1a/5RtWv/QkXH//KuD//qqgv/zpn//hmVUvgAFFAozMzMAMzMzAJ6engBaXF1y0r2y//2zjf/7qoL//q2E//+thP//rYT//qyE//urgv/9rIP/0JFx/1hJQnKbcVwAMzMzADMzMwAyMjIAHR4eF4SDg8DnxLP/5KB+/76GavaoeWLlqHli5b6GavbknXn/5Z16/4JiUsAdJioXMjIzADMzMwAAAAAAPT09AEhISQA4OTotdnNyt29gWJo+ODVCHSMiIB0jIiA+OTdCblZKmnRaTbc3NjUtRz87ADw5NwAAAAAAAAAAADMzMwDKysoASUpLAAAAAAsAAAAINTY7N0NHXXJDR11xNTY7OAAAAAgAEh4LSEA8AMWLbQAzMzMAAAAAAAAAAAAAAAAAMzMzACopKQAMCAAGUlRggGh0se9zhd3/c4Xe/2Nvse9ESGCAHBYABi8uKQAzMzMAAAAAAAAAAAAAAAAAAAAAADU1NQBdXV4ATk1KVIWOvPiDmP//gZb//4GW//+Blv//Z3W89zw+SlRDR14ANDQ0AAAAAAAAAAAAAAAAAAAAAAAzMzMAAAAAAXR0dqKbqfD/f5T//4CV//+Alf//gJX//3qO7/9MU3ahAAAAATMzMwAAAAAAAAAAAAAAAAAAAAAAMzMzAAAAAAR/gIGxprP2/36T//+Alf//gJX//4CV//98kPb/UFiBsAAAAAQzMzMAAAAAAAAAAAAAAAAAAAAAADMzMwDy8vIAZmVjgre93v+Jnf//fpP//3+U//+Alv//dofe/0ZLY4J9j+0AMzMzAAAAAAAAAAAAAAAAAAAAAAAzMzMAOjo6ADAvLiWMjI7PusHo/5yt//+SpP//j57o/2dujs8xMS4lODo6ADMzMwAAAAAAAAAAAAAAAAAAAAAANTU1ALGxsQBcW1oANzc2LnV1c6CVl57XjpGe12xtc6A9OzYuVVVaAHeAqQAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMA////AEJCQgAAAAAEFhURHBoZERwAAAAEQkJCAP///wAzMzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAA4AcAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO3

Func _ICO4()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwFLCwsSywsLKksLCzVLCws3CwsLNwsLCzVLCwsqSwsLEssLCwFLCwsACwsLAArKysALCwsACwsLAAsLCwYLCwskywsLMMsLCx9LCwsPiwsLCUsLCwlLCwsPiwsLH0sLCzDLCwskywsLBgsLCwALCwsACwsLAAsLCwYLCwsriwsLJ8sLCwgLCwsACwsLAAsLCwALCwsACwsLAAsLCwALCwsICwsLJ8sLCyuLCwsGCwsLAAsLCwFLCwskywsLJ8sLCwMLCwsAC0tLQAsLCwAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwMLCwsnywsLJMsLCwFLCwsSywsLMMsLCwgLCwsACwsLAArKysAAAAAAAAAAAAAAAAAAAAAAC0tLQAsLCwALCwsACwsLCAsLCzDLCwsSywsLKksLCx9LCwsACwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tACsrKwAsLCwALCwsfSwsLKksLCzVLCwsPiwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLD4sLCzVLCws3CwsLCUsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAAsLCwlLCws3CwsLNwsLCwlLCwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsJSwsLNwsLCzVLCwsPiwsLAAsLCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLD4sLCzVLCwsqSwsLH0sLCwALi4uACsrKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArKysALS0tACwsLAAsLCx9LCwsqSwsLEssLCzDLCwsICwsLAAsLCwAKysrAAAAAAAAAAAAAAAAAAAAAAAsLCwALCwsACwsLAAsLCwgLCwswywsLEssLCwFLCwskywsLJ8sLCwMLCwsAC0tLQAsLCwAAAAAAAAAAAAsLCwAKysrACwsLAAsLCwMLCwsnywsLJMsLCwFLCwsACwsLBgsLCyuLCwsnywsLCAsLCwALCwsACwsLAAsLCwALCwsACwsLAAsLCwgLCwsnywsLK4sLCwYLCwsACwsLAAsLCwALCwsACwsLBgsLCyTLCwswywsLH0sLCw+LCwsJSwsLCUsLCw+LCwsfCwsLMMsLCyTLCwsGCwsLAAsLCwALCwsACwsLAAsLCwALCwsBSwsLEssLCypLCws1SwsLNwsLCzcLCws1SwsLKosLCxMLCwsBSwsLAAsLCwALCwsAAAAAAAAAAAAAAAAAAGAAAADwAAAB+AAAA/wAAAf+AAAH/gAAA/wAAAH4AAAA8AAAAGAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO4

Func _ICO5()
        Local $s
        $s &= 'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMMOAADDDgAAAAAAAAAAAABIW/oAR1v5AEdb+QBHW/kFR1v5S0db+alHW/nVR1v53Edb+dxHW/nVR1v5qUdb+UtHW/kFR1v5AEdb+QBHW/oAR1v5AEdb+QBHW/kYR1v5k0db+cNHW/l9R1v5Pkdb+SVHW/klR1v5Pkdb+X1HW/nDR1v5k0db+RhHW/kAR1v5AEdb+QBHW/kYR1v5rkdb+Z9HW/kgR1v5AEdb+QBHW/kAR1v5AEdb+QBHW/kAR1v5IEdb+Z9HW/muR1v5GEdb+QBHW/kFR1v5k0db+Z9HW/kMR1v5AEdb+QBHW/kFR1v5GUdb+RlHW/kFR1v5AEdb+QBHW/kMR1v5n0db+ZNHW/kFR1v5S0db+cNHW/kgR1v5AEdb+QBHW/k3R1v5pkdb+dlHW/nZR1v5p0db+TdHW/kAR1v5AEdb+SBHW/nDR1v5S0db+alHW/l9R1v5AEdb+QBHW/k3R1v53Edb+f9HW/n/R1v5/0db+f9HW/ncR1v5N0db+QBHW/kAR1v5fUdb+alHW/nVR1v5Pkdb+QBHW/kFR1v5p0db+f9HW/n/R1v5/0db+f9HW/n/R1v5/0db+aZHW/kFR1v5AEdb+T5HW/nVR1v53Edb+SVHW/kAR1v5GUdb+dlHW/n/R1v5/0db+f9HW/n/R1v5/0db+f9HW/nZR1v5GUdb+QBHW/klR1v53Edb+dxHW/klR1v5AEdb+RlHW/nZR1v5/0db+f9HW/n/R1v5/0db+f9HW/n/R1v52Udb+RlHW/kAR1v5JUdb+dxHW/nVR1v5Pkdb+QBHW/kFR1v5p0db+f9HW/n/R1v5/0db+f9HW/n/R1v5/0db+adHW/kFR1v5AEdb+T5HW/nVR1v5qUdb+X1HW/kAR1v5AEdb+TdHW/ncR1v5/0db+f9HW/n/R1v5/0db+dxHW/k3R1v5AEdb+QBHW/l9R1v5qUdb+UtHW/nDR1v5IEdb+QBHW/kAR1v5N0db+adHW/nZR1v52Udb+adHW/k3R1v5AEdb+QBHW/kgR1v5w0db+UtHW/kFR1v5k0db+Z9HW/kMR1v5AEdb+QBHW/kFR1v5GUdb+RlHW/kFR1v5AEdb+QBHW/kMR1v5n0db+ZNHW/kFR1v5AEdb+RhHW/muR1v5n0db+SBHW/kAR1v5AEdb+QBHW/kAR1v5AEdb+QBHW/kgR1v5n0db+a5HW/kYR1v5AEdb+QBHW/kAR1v5GEdb+ZNHW/nDR1v5fUdb+T5HW/klR1v5JUdb+T5HW/l8R1v5w0db+ZNHW/kYR1v5AEdb+QBHWvoAR1v5AEdb+QBHW/kFR1v5S0db+alHW/nVR1v53Edb+dxHW/nVR1v5qkdb+UxHW/kFR1v5AEdb+QBIWvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
        Local $b = _WinAPI_Base64Decode($s)
        If @error Then Return SetError(1, 0, 0)
        Return Binary($b)
EndFunc   ;==>_ICO5

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-7-10 16:44 , Processed in 0.091571 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表