Local $Str = _
'一、第一个大标题' & @CRLF & _
'1、一大第一个小标题1' & @CRLF & _
'1.1、一大一小test第一个小标题1' & @CRLF & _
'1.2、一大一小test第一个小标题1' & @CRLF & _
'1.3、一大一小test第一个小标题1' & @CRLF & _
'2、一大第二个小标题1' & @CRLF & _
'2.1、一大二小test第一个小标题2' & @CRLF & _
'2.2、一大二小test第一个小标题2' & @CRLF & _
'2.3、一大二小test第一个小标题2' & @CRLF & @CRLF & _
'二、第二个大标题' & @CRLF & _
'1、二大第一个小标题1' & @CRLF & _
'1.1、二大一小test第一个小标题1' & @CRLF & _
'1.2、二大一小test第一个小标题1' & @CRLF & _
'1.3、二大一小test第一个小标题1' & @CRLF & _
'1.4、二大一小test第一个小标题1' & @CRLF & _
'2、二大第二个小标题1' & @CRLF & _
'2.1、二大二小test第一个小标题2' & @CRLF & _
'2.2、二大二小test第一个小标题2' & @CRLF & _
'2.3、二大二小test第一个小标题2' & @CRLF & _
'2.4、二大二小test第一个小标题2' & @CRLF & @CRLF & _
'三、第三个大标题' & @CRLF & _
'1、三大第一个小标题1' & @CRLF & _
'1.1、三大一小test第一个小标题1' & @CRLF & _
'1.2、三大一小test第一个小标题1' & @CRLF & _
'1.3、三大一小test第一个小标题1' & @CRLF & _
'2、三大第二个小标题1' & @CRLF & _
'2.1、三大二小test第一个小标题2' & @CRLF & _
'2.2、三大二小test第一个小标题2' & @CRLF & _
'2.3、三大二小test第一个小标题2' & @CRLF & _
'2.4、三大二小test第一个小标题2' & @CRLF & _
'2.5、三大二小test第一个小标题2'
;~MsgBox(0, '原字符串', $Str)
#include <GuiTreeView.au3>
Local $hGui = GUICreate('TreeView 逐级载入')
Local $iTreeView = GUICtrlCreateTreeView(10, 10, 350, 300)
Local $aTree = _2DArrayCreat($Str)
_TreeLoad($aTree)
GUISetState()
GUIRegisterMsg(0x4E, '_WM_NOTIFY')
While GUIGetMsg() <> -3
WEnd
Func _TreeLoad($aTree)
If Not IsArray($aTree) Or UBound($aTree, 0) <> 2 Then Return
Local $i, $iItem
For $i = 0 To UBound($aTree) - 1
$iItem = GUICtrlCreateTreeViewItem($aTree[$i][0], $iTreeView)
If IsArray($aTree[$i][1]) Then _GUICtrlTreeView_SetChildren($iTreeView, $iItem, 1)
Next
EndFunc ;==>_TreeLoad
Func _WM_NOTIFY($hWnd, $msg, $wParam, $lParam)
Local $tNMHdr = DllStructCreate($tagNMHDR, $lParam), $tNM_TREEVIEW
Local $hWndFrom = DllStructGetData($tNMHdr, 'hWndFrom')
Local $iIDFrom = DllStructGetData($tNMHdr, 'IDFrom')
Local $iCode = DllStructGetData($tNMHdr, 'Code')
If $iIDFrom = $iTreeView Then
Switch $iCode
Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
_TreeLoadAdd()
EndSwitch
EndIf
Return 'GUI_RUNDEFMSG'
EndFunc ;==>_WM_NOTIFY
Func _TreeLoadAdd()
Local $iT = _GetHitTestItem()
If _GUICtrlTreeView_ExpandedOnce($iTreeView, $iT) Then Return
Local $hParent = _GUICtrlTreeView_GetParentHandle($iTreeView, $iT)
Local $hItem
If Not $hParent Then ;---- 没有上级,即为第0级
Local $Index = _GUICtrlTreeView_Index($iTreeView, $iT)
If IsArray($aTree[$Index][1]) Then
Local $aTmp = $aTree[$Index][1]
For $i = 0 To UBound($aTmp) - 1
$hItem = _GUICtrlTreeView_AddChild($iTreeView, $iT, $aTmp[$i][0])
If IsArray($aTmp[$i][1]) Then _GUICtrlTreeView_SetChildren($iTreeView, $hItem, 1)
Next
EndIf
Else
Local $hParent1 = _GUICtrlTreeView_GetParentHandle($iTreeView, $hParent)
If Not $hParent1 Then ;---- 第1级
Local $Index0 = _GUICtrlTreeView_Index($iTreeView, $hParent) ;---- 0级索引
Local $Index1 = _GUICtrlTreeView_Index($iTreeView, $iT) ;---- 1级索引
Local $aTreeXm = $aTree[$Index0][1]
If IsArray($aTreeXm) And IsArray($aTreeXm[$Index1][1]) Then
Local $aTmp1 = $aTreeXm[$Index1][1]
For $ii = 0 To UBound($aTmp1) - 1
$hItem = _GUICtrlTreeView_AddChild($iTreeView, $iT, $aTmp1[$ii])
Next
EndIf
EndIf
EndIf
EndFunc ;==>_TreeLoadAdd
Func _GetHitTestItem()
Local $aW = _ControlGetPos($hGui, '', $iTreeView)
Local $iX = MouseGetPos(0) - $aW[0]
Local $iY = MouseGetPos(1) - $aW[1]
Local $iT = _GUICtrlTreeView_HitTestItem($iTreeView, $iX, $iY)
Return $iT
EndFunc ;==>_GetHitTestItem
Func _ControlGetPos($hWnd, $text, $Ctrlid)
Local $ControlPos = ControlGetPos($hWnd, $text, $Ctrlid)
If @error Then Return SetError(1)
If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd, $text)
Local $tPoint = DllStructCreate('int X;int Y')
DllStructSetData($tPoint, 'X', $ControlPos[0])
DllStructSetData($tPoint, 'Y', $ControlPos[1])
DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tPoint))
If @error Then Return SetError(2)
Local $xy[6] = [DllStructGetData($tPoint, 'X'), DllStructGetData($tPoint, 'Y'), $ControlPos[2], $ControlPos[3], $ControlPos[0], $ControlPos[1]]
Return $xy
EndFunc ;==>_ControlGetPos
Func _2DArrayCreat($Str)
Local $aSR1 = StringRegExp($Str, '(?m)^([^\x00-\xff]+\V+)([\S\s]*?)(?=\r\n[^\x00-\xff]|\Z)', 3) ;---- 一、大标题
If @error Then Return SetError(1)
Local $a2D1[UBound($aSR1) / 2][2], $x = 0, $i
;$a2D1[n] = 大标题; $a2D1[n + 1] = 为数组则有下级
For $i = 0 To UBound($aSR1) - 1 Step 2
$a2D1[$x][0] = $aSR1[$i]
$a2D1[$x][1] = $aSR1[$i + 1]
Local $aSR2 = StringRegExp($a2D1[$x][1], '(?m)^(\d+、\V+)((?:\v+\d+\.\d+、\V+)*)', 3) ;---- 1、第x个小标题
If Not @error Then
Local $a2D2[UBound($aSR2) / 2][2], $xx = 0, $ii
For $ii = 0 To UBound($aSR2) - 1 Step 2
$a2D2[$xx][0] = $aSR2[$ii]
$a2D2[$xx][1] = $aSR2[$ii + 1]
$a2D2[$xx][1] = StringRegExp($a2D2[$xx][1], '(?m)^\d+\.\d+、\V+', 3) ;---- 1.1、test第x个小标题
$xx += 1
Next
$a2D1[$x][1] = $a2D2 ;---- 赋值为数组
EndIf
$x += 1
Next
Return $a2D1
EndFunc ;==>_2DArrayCreat