TreeView [v1.0.44+]

목차

소개와 간단한 예제

Tree-View는 계통적 항목들을 부모 아래의 자손들은 한 단계 들여 넣어 보여줍니다. 가장 흔한 예는 익스플로러의 드라이브와 폴더 트리입니다.

A TreeView usually looks like this:

TreeView

TreeView를 생성하는 구문은 다음과 같습니다:

Gui, Add, TreeView, Options

다음 스크립트는 간단한 계통적 항목들을 생성하고 보여줍니다:

Gui, Add, TreeView
P1 := TV_Add("First parent")
P1C1 := TV_Add("Parent 1's first child", P1)  ; P1을 이 항목의 부모로 지정합니다.
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)

Gui, Show  ; 창과 그의 TreeView를 보여줍니다.
return

GuiClose:  ; 사용자가 TreeView의 GUI 창을 닫으면 스크립트를 종료합니다.
ExitApp

Options and Styles for the Options Parameter

AltSubmit: 스크립트에 정상보다 더 많은 유형의 TreeView 이벤트에 대하여 고지합니다. 다른 말로 하면, g-라벨이 더 자주 기동됩니다. 자세한 것은 TreeView Notifications을 참조하십시오.

Background: 단어 Background 다음에 바로 색 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예제: BackgroundSilver, BackgroundFFDD99. 이 옵션이 존재하지 않으면, TreeView는 처음에 기본값이. Gui Color의 마지막 매개변수로 설정된 배경색입니다 (또는 없으면, 시스템의 기본 배경 색입니다). BackgroundDefault를 지정하면 시스템의 기본 배경색에 적용됩니다 (보통 흰색). 예를 들어, GuiControl, +BackgroundDefault, MyTreeView를 통하여 TreeView를 기본값으로 복구할 수 있습니다.

Buttons: -Buttons (마이너스 버튼)을 지정하면 플러스나 마이너스 사인이 자손이 있는 각 항목의 왼쪽에 나타나는 것을 막을 수 있습니다.

C: 텍스트 컬러. 기호 C 다음에 바로 컬러 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예제: cRed, cFF2211, c0xFF2211, cDefault.

Checked: 각 항목의 왼쪽에 체크박스를 제공합니다. 항목을 추가할 때, 단어 Check를 그의 옵션에 지정하면 박스를 체크한 상태로 시작할 수 있습니다. 사용자는 체크박스크를 클릭하거나 스페이스를 바를 눌러 항목을 체크하거나 해제할 수 있습니다. 어느 항목이 현재 TreeView에 체크되어 있는지 알아 보려면, TV_GetNext() 또는 TV_Get()을 호출하십시오.

HScroll: -HScroll (마이너스 HScroll)을 지정하면 수평 스크롤을 불능으로 만들 수 있습니다 (게다가, 콘트롤은 수평 바를 보여주지 않습니다).

ImageList: 이 방법으로 아이콘을 TreeView에 추가합니다. 단어 ImageList 다음에 바로 이전에 IL_Create()를 호출해 돌려 받은 ImageListID를 지정하십시오. 이 옵션은 TreeView를 생성할 때에만 효과가 있습니다 (그렇지만, TV_SetImageList()는 이 제한이 없습니다). 다음은 작동하는 예제입니다:

ImageListID := IL_Create(10)  ; 최초 가용능력이 10개의 아이콘인 ImageList를 생성합니다.
Loop 10  ; ImageList에 표준 시스템 아이콘을 적재합니다.
    IL_Add(ImageListID, "shell32.dll", A_Index)
Gui, Add, TreeView, ImageList%ImageListID%
TV_Add("Name of Item", 0, "Icon4")  ; 항목을 TreeView에 추가하고 거기에 폴더 아이콘을 부여합니다.
Gui Show

Lines: -Lines (마이너스 Lines)를 지정하면 부모 항목을 자손 항목과 연결하는 줄들을 보여주지 않습니다. 그렇지만, 이 줄을 제거하면 최상위 레벨의 항목에 플러스/마이너스 버튼도 보이지 않게 됩니다.

ReadOnly: -ReadOnly (마이너스 ReadOnly)를 지정하면 각 항목의 텍스트/이름의 편집을 허용합니다. To edit an item, select it then press F2 (see the WantF2 option below). 다른 방법으로, 항목을 한 번 클릭하여 선택할 수 있습니다. 약 반초 기다린 다음, 같은 항목을 다시 클릭해 편집할 수 있습니다. 편집이 끝난 후, 항목은 다음 예제를 통하여 그의 형제들 사이에 알파벳 순서로 재배치됩니다:

Gui, Add, TreeView, -ReadOnly gMyTree  ; For gMyTree, see TreeView's g-label.
; ...
MyTree:
if (A_GuiEvent == "e")  ; 사용자가 항목 편집을 마쳤습니다 (대소문자를 구분해 비교합니다).
    TV_Modify(TV_GetParent(A_EventInfo), "Sort")  ; 이것은 편집 항목에 부모가 없더라도 작동합니다.
return

R: 행의 높이 (생성시). 기호 R 다음에 바로 콘트롤 안에 여유를 주기 위해 허용할 행의 개수를 지정하십시오. 예를 들어, R10이면 콘트롤을 10개의 항목 높이로 만듭니다.

WantF2: -WantF2 (마이너스 WantF2)를 지정하면 F2 키눌림으로 현재 선택된 항목을 편집하지 못하도록 막습니다. 이 설정은 -ReadOnly도 켜져 있지 않는 한 무시됩니다. 이 설정에 상관없이, g-라벨은 여전히 F2 고지를 받습니다.

(이름 없는 번호 스타일): 위의 스타일 말고는 자주 사용되지 않기 때문에, 나머지 스타일은 이름이 없습니다. 리스트는 TreeView 스타일 테이블을 참조하십시오.

TreeViews용 내장 함수

모든 TreeView 함수는 현재 쓰레드의 기본 GUI 창에 작동합니다 (기본 구이 창은 Gui, 2:Default를 통하여 바꿀 수 있습니다). 기본 창이 존재하지 않거나 TreeView 콘트롤이 없다면, 모든 함수는 0을 돌려주어 문제를 나타냅니다.

창에 여러 TreeView 콘트롤이 있다면, 기본값으로 함수들은 가장 최근에 추가된 콘트롤에 작동합니다. 이를 바꾸려면, Gui, TreeView, TreeViewName를 지정하십시오. 여기에서 TreeViewName는 TreeView의 연관 변수이름이거나, Window Spy로 노출되는 ClassNN이거나, 또는 ([v1.1.04+]에서) 그의 HWND입니다. 일단 바뀌면, 기존의 모든 그리고 미래의 쓰레드는 지시한 TreeView를 사용합니다. [v1.1.23+]: A_DefaultTreeView contains the current setting.

Item functions:

Retrieval functions:

Other functions:

TV_Add

TreeView에 새 항목을 추가하고 그의 유일한 Item ID 번호를 돌려줍니다 (또는 실패시 0을 돌려줍니다).

TV_Add(Name, ParentItemID, Options)

Name은 항목을 보여주는 텍스트이며, 텍스트이거나 숫자일 수 있습니다 (숫치 표현식의 결과도 포함). ParentItemID는 새 항목의 부모 ID 번호입니다 (생략하거나 0을 지정하면 그 항목을 최상위 레벨에 추가합니다). 방대한 개수의 항목을 추가할 때, 수행성능을 개선할 수 있습니다. 항목을 추가하기 전에 GuiControl, -Redraw, MyTreeView를 사용하고 끝난 후에 GuiControl, +Redraw, MyTreeView를 사용하면 됩니다.

TV_Add() 그리고 TV_Modify()용 옵션

Options 매개변수는아래 리스트의 단어로 구성되는 문자열입니다 (대소문자 구문 없음). 다음 단어와 스페이스나 탭으로 분리하십시오. 옵션을 제거하려면, 앞에 마이너스 사인을 추가하십시오. 옵션을 추가하려면, 플러스 사인을 허용하지만 필수는 아닙니다.

Bold: 항목의 이름을 볼드체로 보여줍니다. 나중에 해제하려면, TV_Modify(ItemID, "-Bold")를 사용하십시오. [v1.1.30.01+]: 단어 Bold는 선택적으로 다음에 즉시 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다.

Check: (TreeView에 체크박스가 있다면) 체크 표식을 항목의 왼쪽에 보여줍니다. 나중에 해제하려면, TV_Modify(ItemID, "-Check")을 사용하십시오. 단어 Check는 선택적으로 다음에 즉시 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다. 다른 말로, "Check""Check" . VarContainingOne 모두 같습니다 (여기에서 점은 결합 연산자입니다).

Expand: 항목을 확대해 (있다면) 그의 자손을 노출시킵니다. 나중에 항목을 축소하려면, TV_Modify(ItemID, "-Expand")를 사용하십시오. 자손이 없다면, TV_Modify()는 그 항목의 ID 대신에 0을 돌려줍니다. 대조적으로, TV_Add()는 항목에 자손이 나중에 거기에 추가될 경우 확대 표식을 합니다. (아래의) "Select"와 다르게, 항목이 확대되더라도 그의 부모가 자동으로 확대되지는 않습니다. 마지막으로, 단어 Expand 다음에 선택적으로 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다. 다른 말로, "Expand""Expand" . VarContainingOne는 같습니다.

First | Sort | N: 이 옵션들은 TV_Add()에만 적용됩니다. 새 항목의 위치를 그의 형제에 상대적으로 지정합니다 (형제(sibling)란 같은 레벨에 있는 다른 항목들입니다). 이 옵션들 모두 존재하지 않으면, 마지막/막내 형제로 새 항목이 추가됩니다. 그렇지 않으면, First를 추가해 그 항목을 첫째/장남 형제로 추가할 수 있습니다. 또는Sort를 지정하면 그 항목을 그의 형제들 사이에 알파벳 순서로 삽입할 수 있습니다. 평범한 정수가 (N) 지정되면, 그 다음에 새 항목을 추가할 형제의 ID 번호로 간주됩니다 (정수 N이 유일한 옵션이라면, 따옴표로 둘러쌀 필요가 없습니다).

Icon: 단어 Icon 다음에 이 항목의 아이콘 번호를 지정하십시오. 이 아이콘은 항목의 이름 왼쪽에 보여집니다. 이 옵션이 없으면, ImageList에서 첫 번째 아이콘이 사용됩니다. 빈 아이콘을 보여주려면, ImageList의 아이콘의 번호보다 더 큰 번호를 지정하십시오. 콘트롤에 ImageList가 없으면, 아이콘도 보이지 않고 아이콘을 위한 스페이스도 보존되지 않습니다.

Select: 항목을 선택합니다. 한 번에 오직 하나의 항목만 선택할 수 있기 때문에, 이전에 선택된 항목은 자동으로 해제됩니다. 게다가, 이 옵션은 필요하면 그의 부모를 확대해서 새로 선택된 항목을 노출시킵니다. 현재 선택을 알아 내려면, TV_GetSelection()를 호출하십시오.

Sort: TV_Modify()에 대하여, 이 옵션은 알파벳 순서로 지정된 항목의 자손들을 정렬합니다. 대신에 모든 최상위 레벨의 항목들을 정렬하려면, TV_Modify(0, "Sort")를 사용하십시오. 자손이 없다면, 변경된 항목의 ID 대신에 0을 돌려줍니다.

Vis: TreeView를 스크롤하거나 필요하면 그의 부모를 확대해서 항목이 완전히 보이도록 확인합니다.

VisFirst: 위와 같지만 TreeView도 스크롤되어 가능하면 그 항목이 항상 위에 보이도록 합니다. 이 옵션은 전형적으로 TV_Add() 보다 TV_Modify()와 사용할 때 더 효율적입니다.

TV_Modify

항목의 이름과 속성을 변경합니다.

TV_Modify(ItemID , Options, NewName)

성공하면 항목 자신의 ID를 돌려줍니다. 실패시 (또는 부분적 실패시) 0을 돌려줍니다. 첫 매개변수만 있으면, 지정된 항목이 선택됩니다. NewName을 생략하면, 현재 이름을 바꾸지 않고 그대로 둡니다. Options에 관해서는 위의 리스트를 참조하십시오.

TV_Delete

Deletes the specified item or all items.

TV_Delete(ItemID)

ItemID을 생략하면, TreeView 안의 모든 항목이 삭제됩니다. 그렇지 않으면, 오직 지정된 ItemID만 삭제됩니다. 성공하면 1 실패하면 0을 돌려줍니다.

TV_GetSelection

선택된 항목의 ID 번호를 돌려줍니다.

TV_GetSelection()

TV_GetCount

콘트롤에 있는 항목의 총 개수를 돌려줍니다.

TV_GetCount()

이 함수는 언제나 순간적입니다. 왜냐하면 콘트롤의 개수를 추적관리하기 때문입니다.

TV_GetParent

지정된 항목의 부모를 항목 ID로 돌려줍니다.

TV_GetParent(ItemID)

최상위 레벨의 항목들은 부모가 없으므로 0을 돌려줍니다.

TV_GetChild

지정된 항목의 첫째/최상위 자손의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).

TV_GetChild(ParentItemID)

TV_GetPrev

지정된 항목 위의 형제의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).

TV_GetPrev(ItemID)

TV_GetNext

Returns the ID number of the next item below the specified item (or 0 if none).

TV_GetNext(ItemID, ItemType)

다음 모드가 있습니다:

TV_GetText

지정된 ItemID의 텍스트/이름을 열람하고 그것을 OutputVar에 저장합니다.

TV_GetText(OutputVar, ItemID)

텍스트가 8191자 보다 길면, 앞쪽 8191 글자만 열람됩니다. 성공하면, 함수는 그 항목의 ID를 돌려줍니다. 실패하면, 0을 돌려줍니다 (그리고 OutputVar도 비워집니다).

TV_Get

Returns the ID number of the specified item if it has the specified attribute.

TV_Get(ItemID, Attribute)

지정된 항목에 지정된 속성이 없으면, 그 자신의 ItemID가 반환됩니다. 그렇지 않으면 0이 반환됩니다. For Attribute, specify "E", "Expand", or "Expanded" to determine if the item is currently expanded (that is, its children are being displayed); specify "C", "Check", or "Checked" to determine if the item has a checkmark; or specify "B" or "Bold" to determine if the item is currently bold in font.

주의: IF-서술문은 0 아닌 값을 참("true")으로 간주하므로, 다음의 두 줄은 기능적으로 동일합니다: if TV_Get(ItemID, "Checked") = ItemID and if TV_Get(ItemID, "Checked").

TV_SetImageList [v1.1.02+]

Sets or replaces an ImageList for displaying icons.

TV_SetImageList(ImageListID , IconType)

ImageListID는 이전에 IL_Create()를 호출해 반환된 번호입니다. IconType is normally omitted, in which case it defaults to 0. 그렇지 않으면, 2를 상태 아이콘에 지정하십시오 (아직 직접적으로 지원하지는 않지만, SendMessage를 통하여 사용할 수 있습니다). 성공하면, TV_SetImageList()는 이전에 TreeView에 연관되어 있는 ImageListID를 돌려줍니다 (연관된게 없으면 0을 돌려줍니다). 그렇게 떼어낸 ImageList는 IL_Destroy(ImageListID)를 통하여 정상적으로 파괴됩니다.

G-라벨 고지 (Primary)

gMySubroutine과 같은 g-label은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 콘트롤에 어떤 조치를 수행할 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 이 서브루틴은 내장 함수 A_Gui 그리고 A_GuiControl 을 참고해 어느 창과 어느 TreeView가 이벤트를 발생시켰는지 알아냅니다. 더 중요한 것은, A_GuiEvent를 참고할 수 있다는 것인데, 여기에 다음 문자열이나 기호 중 하나가 담겨 있습니다 (미래 버전과의 호환을 위해, 스크립트는 이것만이 가능한 유일한 값들이라고 간주하면 안됩니다):

DoubleClick: 사용자가 항목을 더블클릭했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

D: 사용자가 항목을 끌려고 시도했습니다 (현재 이를 내부적으로 지원하지 않습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

d (소문자 D): 왼클릭 끌기가 아니라 우클릭 끌기라는 점만 제외하면 위와 같습니다.

e (소문자 E): 사용자가 항목 편집을 끝마쳤습니다 (사용자는 TreeView 옵션에 -ReadOnly일 경우에만 항목을 편집할 수 있습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

S: 사용자 또는 스크립트 자체에서 새 항목을 선택했습니다. 변수 A_EventInfo에 새로 선택된 그 항목의 ID가 담깁니다.

G-라벨 고지 (Secondary)

TreeView의 옵션에 단어 AltSubmit이 있다면, 그의g-라벨은 더 자주 기동되고 A_GuiEvent에는 다음의 값이 추가로 담길 수 있습니다:

Normal: 사용자가 항목을 왼클릭 했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

RightClick: 사용자가 항목을 우클릭했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다. 대부분의 경우, 이에 응답하여 메뉴를 보여주는 것이 좋습니다. 대신에, GuiContextMenu label를 사용하십시오. 왜냐하면 Apps 키도 인지하기 때문입니다. 예를 들어:

GuiContextMenu:  ; 우클릭 또는 Apps 키의 누름에 응답하여 기동됩니다.
if (A_GuiControl != "MyTreeView")  ; 이 점검은 선택적입니다. TreeView 안에 클릭할 때만 메뉴를 보여줍니다.
    return
; 메뉴를 주어진 A_GuiX 그리고 A_GuiY 좌표에 보여줍니다. 이것을 사용해야 합니다
; 왜냐하면 사용자가 Apps 키를 누르더라도 올바른 좌표를 제공하기 때문입니다:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return

E: 사용자가 항목 편집을 시작했습니다 (사용자는 TreeView 옵션에 -ReadOnly이 있을 경우에만 항목을 편집할 수 있습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

F: TreeView가 키보드 초점을 받았습니다.

f (소문자 F): TreeView 가 키보드 초점을 잃어버렸습니다.

K: TreeView가 초점이 있는 동안 사용자가 키를 눌렀습니다. A_EventInfo에 그 키의 가상 키코드가 담깁니다. 이 숫자는 범위가 1과 255 사이입니다. 키가 알파벳이면, 대부분의 키보드 레이아웃에서 Chr(A_EventInfo)를 통하여 상응하는 문자로 변환할 수 있습니다. F2 is received regardless of WantF2. 그렇지만, Enter 키눌림은 받지 않습니다; 그를 받으려면, 아래에 기술하는 것처럼 기본 버튼을 사용하십시오.

+ (플러스 사인): 항목이 확대되어 그의 자손을 보여줍니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

- (마이너스 사인): 항목이 축소되어 그의 자손을 감춥니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

논평

Gui Submit 명령어는 TreeView 콘트롤에 아무 효과가 없습니다. 그러므로, 스크립트는 (있다면) TreeView의 연관 변수를 사용해 기타 데이터를 저장할 수 있습니다. 덮어쓸까봐 걱정할 필요가 없습니다.

TreeView에 초점이 있는 동안 사용자가 Enter를 눌렀는지 탐지하려면, 기본 버튼을 사용하십시오 (원하면 감출 수 있습니다). 예를 들어:

Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FocusedControl, FocusV
if (FocusedControl != "MyTreeView")
    return
MsgBox % "Enter was pressed. The selected item ID is " . TV_GetSelection()
return

키보드로 한 항목에서 다른 항목으로 항해하는 것 말고도, 사용자는 한 항목의 이름의 첫 문자를 타자하여 점진 검색을 수행할 수도 있습니다. 이렇게 하면 선택이 부합하는 가장 가까운 항목으로 점프합니다.

길이에 상관없이 텍스트를 TreeView의 각 항목에 저장할 수 있지만, 오직 앞쪽 260 글자만 보여줍니다.

이론적으로 TreeView에서 항목의 개수는 최대 65536이지만, 항목을 추가할 수록 얼마 가지 않아 수행성능이 눈에 띄게 줄어듭니다. TV_Add()에 기술된 다시 그리기 팁을 사용하면 이를 약간 줄일 수 있습니다.

ListViews와 다르게, TreeView의 ImageList는 TreeView가 파괴될 때 자동으로 파괴되지 않습니다. 그러므로, 스크립트는 TreeView의 창을 파괴하고 나면 반드시 IL_Destroy(ImageListID)를 호출해야 합니다. ImageList를 다른 곳에 사용할 생각이 없다면 말입니다. 그렇지만, 스크립트가 곧 끝날 경우라면 불필요합니다. 왜냐하면 그 때 모든 ImageLists도 자동으로 파괴되기 때문입니다.

스크립트는 창 당 하나 이상의 TreeView를 생성할 수 있습니다. 기본 말고 다른 TreeView를 처리하려면, 내장 함수를 참조하십시오.

TreeView의 글꼴을 바꾸거나 크기를 바꾸거나 숨기려면 GuiControl을 사용하십시오.

트리뷰 확장(Tree View eXtension (TVX))으로 TreeViews를 이동하고 삽입하고 제거할 수 있습니다. 다음 데모를 참조하십시오: www.autohotkey.com/forum/topic19021.html

ListView, Other Control Types, Gui, GuiContextMenu, GuiControl, GuiControlGet, TreeView 스타일 테이블

예제

다음 스크립트는 이 페이지 위에 있는 예제에 비해 더 정교합니다. 모든-사용자 시작 메뉴의 모든 폴더를 담은 TreeView를 생성하고 부여줍니다. 사용자가 폴더를 선택하면, 그의 내용이 ListView 오른쪽에 나타납니다 (윈도우즈의 탐색기처럼). 게다가, StatusBar 콘트롤에 현재 선택된 폴더에 관한 정보를 보여줍니다.

; 다음 폴더는 TreeView에 대하여 루트 폴더가 됩니다.
; C:\와 같이 전체 드라이브를 지정하면 약간 적재 시간이 걸립니다:
TreeRoot := A_StartMenuCommon
TreeViewWidth := 280
ListViewWidth := A_ScreenWidth - TreeViewWidth - 30

; 사용자에게 창을 끌어 크기를 변경하도록 허용합니다:
Gui +Resize

; ImageList를 만들고 거기에 표준 시스템 아이콘을 배정합니다:
ImageListID := IL_Create(5)
Loop 5 
    IL_Add(ImageListID, "shell32.dll", A_Index)
; TreeView와 ListView를 나란히 만들어 마치 윈도우즈의 탐색기처럼 행위합니다:
Gui, Add, TreeView, vMyTreeView r20 w%TreeViewWidth% gMyTreeView ImageList%ImageListID%
Gui, Add, ListView, vMyListView r20 w%ListViewWidth% x+10, Name|Modified

; ListView의 컬럼 너비를 설정합니다 (이것은 선택적입니다):
Col2Width := 70  ; 오직 YYYYMMDD 부분만 보이도록 너비를 줄입니다.
LV_ModifyCol(1, ListViewWidth - Col2Width - 30)  ; 수직 스크롤바를 위해 공간을 허용합니다.
LV_ModifyCol(2, Col2Width)

; 파일의 개수와 그의 총 크기에 관한 정보를 보여줄 상태 바를 생성합니다:
Gui, Add, StatusBar
SB_SetParts(60, 85)  ; 바를 세 부분으로 생성합니다 (세 번째 부분에 나머지 너비를 모두 채웁니다).

; 폴더와 그의 부폴더덜을 트리에 추가합니다. 적재 시간이 걸릴 경우는 현재 상태를 보여줍니다:
SplashTextOn, 200, 25, TreeView and StatusBar Example, Loading the tree...
AddSubFoldersToTree(TreeRoot)
SplashTextOff

; 창을 보여주고 돌아갑니다. OS는 스크립트에게 사용자가 적절한 행위를 수행할 때마다 고지합니다:
Gui, Show,, %TreeRoot%  ; 제목 바에 소스 디렉토리를 보여줍니다 (TreeRoot).
return

AddSubFoldersToTree(Folder, ParentItemID = 0)
{
    ; 이 함수는 지정된 폴더의 모든 부폴더를 TreeView에 추가합니다..
    ; 또한 깊이에 상관없이 자기 자신을 재귀해 내포된 폴더들을 수집합니다.
    Loop %Folder%\*.*, 2  ; 모든 폴더의 부폴더들을 열람합니다.
        AddSubFoldersToTree(A_LoopFileFullPath, TV_Add(A_LoopFileName, ParentItemID, "Icon4"))
}

MyTreeView:  ; 이 서브루틴은 사용자 행위를 처리합니다 (예를 들어 클릭).
if (A_GuiEvent != "S")  ; 즉, "새로운 트리 항목 선택"이 아닌 이벤트.
    return  ; 아무것도 하지 않습니다.
; 그렇지 않으면, ListView 내용을 선택된 폴더로 채웁니다.
; 먼처 선택된 폴더의 완전한 경로를 알아냅니다:
TV_GetText(SelectedItemText, A_EventInfo)
ParentID := A_EventInfo
Loop  ; 선택된 폴더에 대한 전체 경로를 구성합니다.
{
    ParentID := TV_GetParent(ParentID)
    if not ParentID  ; 더 이상 조상 없음.
        break
    TV_GetText(ParentText, ParentID)
    SelectedItemText := ParentText "\" SelectedItemText
}
SelectedFullPath := TreeRoot "\" SelectedItemText

; 파일들을 ListView 안에 삽입합니다:
LV_Delete()  ; 모든 행들을 지웁니다.
GuiControl, -Redraw, MyListView  ; 적재하는 동안 다시 그리기를 꺼서 수행성능을 향상시킵니다.
FileCount := 0  ; 아래 회돌이를 시작하기 전에 초기화합니다.
TotalSize := 0
Loop %SelectedFullPath%\*.*  ; 간단하게 처리하기 위해, 폴더를 생략하고 ListView에 있는 파일들만 보입니다.
{
    LV_Add("", A_LoopFileName, A_LoopFileTimeModified)
    FileCount += 1
    TotalSize += A_LoopFileSize
}
GuiControl, +Redraw, MyListView

; 상태 바의 세 부분을 업데이트해 현재 선택된 폴더에 관한 정보를 보여줍니다:
SB_SetText(FileCount . " files", 1)
SB_SetText(Round(TotalSize / 1024, 1) . " KB", 2)
SB_SetText(SelectedFullPath, 3)
return

GuiSize:  ; 사용자의 창 크기 변경에 응답하여 ListView와 TreeView 크기를 조절합니다.
if (A_EventInfo = 1)  ; 창은 최소화되어 있습니다. 아무 필요도 없습니다.
    return
; 그렇지 않으면, 창은 크기가 변경되거나 최대화되었습니다. 부합하는 콘트롤들의 크기를 조절합니다.
GuiControl, Move, MyTreeView, % "H" . (A_GuiHeight - 30)  ; StatusBar와 여백에 -30을 지정합니다.
GuiControl, Move, MyListView, % "H" . (A_GuiHeight - 30) . " W" . (A_GuiWidth - TreeViewWidth - 30)
return

GuiClose:  ; 사용자가 TreeView의 GUI 창을 닫으면 스크립트를 종료합니다.
ExitApp