- Сообщения
 - 5,379
 
- Репутация
 - 2,724
 
AutoIt: 3.3.8.1
Версия: 1.3
Категория: Элементы GUI
Описание: Данная библиотека является логическим продолжением этой темы и предназначена для создания дерева папок и файлов (TreeView) и обеспечения взаимодействия с ним. Создается TreeView Explorer всего одной фунуцией, а для регистрации необходимых событий используется пользовательская callback функция, в которую TreeView Explorer посылает соответствующие сообщения (аналогично WM-функциям). Как все это работает, наглядно показано в нижеследующем примере. TreeView Explorer может работать как в "OnEvent", так и в "Loop" режимах. В случае последнего, необходимо будет вместо функции GUIGetMsg() использовать _GUICtrlTVExplorer_GetMsg(), которая с точки зрения пользователя ничем не отличается от первой.UDF на данный момент имеет статус Beta, поэтому, просьба ко всем заинтересованным пользователям нашего форума хорошенько потестить библиотеку и отписаться в этой ветке с пожеланиями и багами. И еще, TVExplorer.au3 требует наличия WinAPIEx.au3 версии 3.2 и выше. Если у вас его нет (а у вас его точно нет), то временно используйте дополнение к версии 3.1 (файл [email protected] в архиве). И последнее, на данный момент библиотека имеет ряд следующих ограничений:
Файл(ы): TVExplorer.zip
Пример:
	
	
		
			
	
	
	
	
  
    
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
		
	
Скриншот:
		
		
	
	
		
	
Источник: TVExplorer UDF (оффициальный форум)
Автор: Yashied
			
			Версия: 1.3
Категория: Элементы GUI
Описание: Данная библиотека является логическим продолжением этой темы и предназначена для создания дерева папок и файлов (TreeView) и обеспечения взаимодействия с ним. Создается TreeView Explorer всего одной фунуцией, а для регистрации необходимых событий используется пользовательская callback функция, в которую TreeView Explorer посылает соответствующие сообщения (аналогично WM-функциям). Как все это работает, наглядно показано в нижеследующем примере. TreeView Explorer может работать как в "OnEvent", так и в "Loop" режимах. В случае последнего, необходимо будет вместо функции GUIGetMsg() использовать _GUICtrlTVExplorer_GetMsg(), которая с точки зрения пользователя ничем не отличается от первой.
Одновременно можно создать только один элемент TreeView Explorer.- Могут быть существенные задержки, если в папках присутствует очень большое количество файлов/подпапок.
 Невозможно заранее открыть произвольную папку в пределах корневой папки.Не реализованы все возможности алгоритма (использованы не все $TV_FLAG_... флаги).Регистрация ограниченного числа событий ($TV_NOTIFY_...).
Файл(ы): TVExplorer.zip
Пример:
			
				Код:
			
		
		
		#Include <GUIConstantsEx.au3>
#Include <GUITreeView.au3>
#Include <TVExplorer.au3>
#Include <TreeViewConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global $hForm, $hTV[3], $Input[3], $hFocus = 0, $Dummy, $Path, $Style
If Not _WinAPI_DwmIsCompositionEnabled() Then
	$Style = $WS_EX_COMPOSITED
Else
	$Style = -1
EndIf
$hForm = GUICreate('TVExplorer UDF Example', 700, 736, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $Style)
GUISetIcon(@WindowsDir & '\explorer.exe')
$Input[0] = GUICtrlCreateInput('', 20, 20, 320, 19)
GUICtrlSetState(-1, $GUI_DISABLE)
$hTV[0] = _GUICtrlTVExplorer_Create(@ProgramFilesDir, 20, 48, 320, 310, -1, $WS_EX_CLIENTEDGE, -1, '_TVEvent')
$Input[1] = GUICtrlCreateInput('', 360, 20, 320, 19)
GUICtrlSetState(-1, $GUI_DISABLE)
$hTV[1] = _GUICtrlTVExplorer_Create(@UserProfileDir, 360, 48, 320, 310, -1, $WS_EX_CLIENTEDGE, -1, '_TVEvent')
$Input[2] = GUICtrlCreateInput('', 20, 378, 660, 19)
GUICtrlSetState(-1, $GUI_DISABLE)
$hTV[2] = _GUICtrlTVExplorer_Create('', 20, 406, 660, 310, -1, $WS_EX_CLIENTEDGE, -1, '_TVEvent')
For $i = 0 To 2
	_TVSetPath($Input[$i], _GUICtrlTVExplorer_GetSelected($hTV[$i]))
	_GUICtrlTVExplorer_SetExplorerStyle($hTV[$i])
Next
$Dummy = GUICtrlCreateDummy()
GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')
GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
HotKeySet('{F5}', '_TVRefresh')
GUISetState()
_GUICtrlTVExplorer_Expand($hTV[0], @ProgramFilesDir & '\AutoIt3')
_GUICtrlTVExplorer_Expand($hTV[1])
While 1
	Switch _GUICtrlTVExplorer_GetMsg()
		Case $GUI_EVENT_CLOSE
			GUIDelete()
			_GUICtrlTVExplorer_DestroyAll()
			Exit
		Case $Dummy
			$Path = _GUICtrlTVExplorer_GetSelected($hFocus)
			_GUICtrlTVExplorer_AttachFolder($hFocus)
			_GUICtrlTVExplorer_Expand($hFocus, $Path, 0)
			$hFocus = 0
	EndSwitch
WEnd
Func _TVEvent($hWnd, $iMsg, $sPath, $hItem)
	Switch $iMsg
		Case $TV_NOTIFY_BEGINUPDATE
			GUISetCursor(1, 1)
		Case $TV_NOTIFY_ENDUPDATE
			GUISetCursor(2)
		Case $TV_NOTIFY_SELCHANGED
			For $i = 0 To 2
				If $hTV[$i] = $hWnd Then
					_TVSetPath($Input[$i], $sPath)
					ExitLoop
				EndIf
			Next
		Case $TV_NOTIFY_DBLCLK
			; Nothing
		Case $TV_NOTIFY_RCLICK
			; Nothing
		Case $TV_NOTIFY_DELETINGITEM
			; Nothing
		Case $TV_NOTIFY_DISKMOUNTED
			; Nothing
		Case $TV_NOTIFY_DISKUNMOUNTED
			; Nothing
	EndSwitch
EndFunc   ;==>_TVEvent
Func _TVSetPath($iInput, $sPath)
	Local $Text = _WinAPI_PathCompactPath(GUICtrlGetHandle($iInput), $sPath, -2)
	If GUICtrlRead($iInput) <> $Text Then
		GUICtrlSetData($iInput, $Text)
	EndIf
EndFunc   ;==>_TVSetPath
Func _TVRefresh()
	Local $hWnd = _WinAPI_GetFocus()
	For $i = 0 To 2
		If $hTV[$i] = $hWnd Then
			If Not $hFocus Then
				$hFocus = $hWnd
				GUICtrlSendToDummy($Dummy)
			EndIf
			Return
		EndIf
	Next
	HotKeySet('{F5}')
	Send('{F5}')
	HotKeySet('{F5}', '_TVRefresh')
EndFunc   ;==>_TVRefresh
Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
	Local $tMMI = DllStructCreate('long Reserved[2];long MaxSize[2];long MaxPosition[2];long MinTrackSize[2];long MaxTrackSize[2]', $lParam)
	Switch $hWnd
		Case $hForm
			DllStructSetData($tMMI, 'MinTrackSize', 428, 1)
			DllStructSetData($tMMI, 'MinTrackSize', 450, 2)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO
Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
	Local $WC, $HC, $WT, $HT
	Switch $hWnd
		Case $hForm
			$WC = _WinAPI_LoWord($lParam)
			$HC = _WinAPI_HiWord($lParam)
			$WT = Floor(($WC - 60) / 2)
			$HT = Floor(($HC - 116) / 2)
			GUICtrlSetPos(_WinAPI_GetDlgCtrlID($hTV[0]), 20, 48, $WT, $HT)
			GUICtrlSetPos(_WinAPI_GetDlgCtrlID($hTV[1]), $WT + 40, 48, $WC - $WT - 60, $HT)
			GUICtrlSetPos(_WinAPI_GetDlgCtrlID($hTV[2]), 20, $HT + 96, $WC - 40, $HC - $HT - 116)
			GUICtrlSetPos($Input[0], 20, 20, $WT)
			GUICtrlSetPos($Input[1], $WT + 40, 20, $WC - $WT - 60)
			GUICtrlSetPos($Input[2], 20, $HT + 68, $WC - 40)
			For $i = 0 To 2
				_TVSetPath($Input[$i], _GUICtrlTVExplorer_GetSelected($hTV[$i]))
			Next
			Return 0
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
	Скриншот:
	Источник: TVExplorer UDF (оффициальный форум)
Автор: Yashied
	            

