Написал давно желанную функцию, но она работает как бы наполовину - она должна заменять стандартную функцию
FileSelectFolder, но проблема в том, что у меня не получается -
А) либо создать все вкладки (в TreeView) для всех существующих папок (это также займёт кучу времени на их генерацию),
Б) либо создавать их “находу” (т.е в момент вызова/раскрытия той или иной вкладки) - в принципе, проблема со вторым вариантом такая - нужно узнать как очистить одну выделенную вкладку от её подвкладок (не удаляя её саму).
Для чего нужна такая функция? во-первых для того чтобы можно было прикреплять это окно к другому приложению (или к родительскому гуи) - эта одна из основных причин (даже самая) - далее можно также используя подобную функцию, просто создавать это окно с разными размерами, с разными кнопками и возвращаемой информацией, также будет возможность задать этому окну атрибут “поверх всех окон” и т.д и т.п...
Вот в принципе сам скрипт с примером:
Код:

#include <GUIConstants.au3>
#include <GUITreeView.au3>
#include <File.au3>
$Parent = GUICreate("test", 200, 200)
$Select = GUICtrlCreateButton("Select", 50, 50)
GUISetState()
While 1
$Msg = GUIGetMsg()
If $Msg = -3 Then ExitLoop
If $Msg = $Select Then
GUISetState(@SW_DISABLE)
$Path = _FileSelectFolder("Select Folder", "Choose needed Path:", 300, 300, 1, $Parent)
If Not @error Then MsgBox(64, "Path", "The selected path is: <" & $Path & ">")
GUISetState(@SW_RESTORE)
GUISetState(@SW_ENABLE)
EndIf
WEnd
GUIDelete()
Func _FileSelectFolder($Title, $Dialog_Text, $Width=300, $Heght=300, $OnTop=0, $Hwnd="")
Opt("GuiOnEventMode", 1)
Global $IsExit = 0, $IsCancel = 0, $PathInput, $MainTreeViewID, $TOPMOST
If $OnTop = 1 Then $OnTop = 8
GUICreate($Title, $Width, $Heght, -1, -1, $WS_SYSMENU+$WS_CAPTION+$WS_SIZEBOX, $WS_EX_CONTEXTHELP+$OnTop, $Hwnd)
GUISetOnEvent(-3, "Cancel")
GUICtrlCreateLabel($Dialog_Text, 10, 5)
$ButtonOK = GUICtrlCreateButton("OK", $Width-180, $Heght-25, 70, 20)
GUICtrlSetOnEvent(-1, "OK")
$ButtonCancel = GUICtrlCreateButton("Cancel", $Width-80, $Heght-25, 70, 20)
GUICtrlSetOnEvent(-1, "Cancel")
$PathInput = GUICtrlCreateInput("", 10, $Heght-50, $Width-20)
$MainTreeViewID = GUICtrlCreateTreeView(10, 30, $Width-20, $Heght-90, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
GUISetState()
$DrivesArr = _DrivesListToArray("all")
If IsArray($DrivesArr) Then
Dim $MainDriveID[$DrivesArr[0]+1], $CurrentIcon, $CurrentIcID
For $i = 1 To $DrivesArr[0]
$CurrentDrive = $DrivesArr[$i]
If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
$CurrentIcon = $CurrentDrive & "\" & IniRead($CurrentDrive & "\Autorun.inf", "Autorun", "Icon", "")
$CurrentIcID = 0
EndIf
If Not FileExists($CurrentIcon) Then
$CurrentIcon = "shell32.dll"
$CurrentIcID = 8
EndIf
$MainDriveID[$i] = GUICtrlCreateTreeViewItem(StringUpper($CurrentDrive) & "\", $MainTreeViewID)
GUICtrlSetOnEvent(-1, "GetText")
If $CurrentDrive = "a:" Or $CurrentDrive = "b:" Then
GUICtrlSetImage(-1, "shell32.dll", 6, 0)
ElseIf DriveGetType($CurrentDrive) = "CDROM" Then
GUICtrlSetImage(-1, "shell32.dll", 11, -1)
Else
GUICtrlSetImage(-1, StringStripWS($CurrentIcon, 3), $CurrentIcID, -1)
EndIf
If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
$DirsArr = _FileListToArray($CurrentDrive, "*", 2)
If IsArray($DirsArr) Then
For $j = 1 To $DirsArr[0]
$CurrentDir = $DirsArr[$j]
GUICtrlCreateTreeViewItem($CurrentDir, $MainDriveID[$i])
GUICtrlSetOnEvent(-1, "GetText")
_GUICtrlTreeViewSetIcon($MainTreeViewID, -1, "shell32.dll", 4)
Next
EndIf
EndIf
Next
EndIf
While $IsExit = 0
Sleep(10)
WEnd
$Path = StringReplace(_GUICtrlTreeViewGetTree($MainTreeViewID, "\"), "\\", "\")
GUIDelete()
Opt("GuiOnEventMode", 0)
If $IsCancel = 1 Then
SetError(1)
Return ""
Else
Return $Path
EndIf
EndFunc
Func GetText()
GUICtrlSetData($PathInput, GUICtrlRead(@GUI_CtrlId, 1))
EndFunc
Func OK()
Global $IsExit = 1
EndFunc
Func Cancel()
Global $IsExit = 1, $IsCancel = 1
EndFunc
Func Quit()
Exit
EndFunc
Func _DrivesListToArray($Type)
$DrivesArr = DriveGetDrive($Type)
If IsArray($DrivesArr) Then
Dim $DrivesListArr[$DrivesArr[0]+1]
$DrivesListArr[0] = $DrivesArr[0]
For $iDrive = 1 To $DrivesArr[0]
$CurrentDrive = $DrivesArr[$iDrive]
$DrivesListArr[$iDrive] = $CurrentDrive
Next
EndIf
Return $DrivesListArr
EndFunc
И ещё хотелось бы сделать чтобы можно было задать при вызове функции исходную папку (Init Dir) - но увы я только сегодня начал разбирать основы TreeView, и поэтому не знаю как заставить раскрыться вкладкам на том месте где находится указанное имя (т.е имя вкладки).