Yashied, очень много новинок.
- Наконец-то ушли назначения параметров -хорошее решение с _GUICtrlTreeView_ExpandedOnce
- Стали незаметными удаления временных элементов
- Не стал раздуваться ImageList
- Нашлось получение разнообразных иконок почти, как в Explorer'е .
Однако скорость обработки еще более снизилась.Да и код не простой.
Как мыслится использование этих наработок в своем скрипте ?
Не каждый пользователь способен разобраться в сложном коде. Ему бы "Черный ящик" с входными и выходными параметрами.
А тут еще непростая ф-ия обработки ( WM_NOTIFY ) .
Я вот попробовал в качестве "экскримента" : в скрипте со своим алгоритмом создания дерева,
использовать твою ф-ию получения иконок ( _TVAddIcon ), которую залил в виде файла : ExtractIcon_Ex.au3
В результате при более простом коде и с использованием стандартной ф-ии обработки сообщений ( WM_NOTIFY ),
получил практически все прелести ,имеющиеся в твоем коде. Причем скорость : в 1.5-2 раза выше.
Да и замеченных тобой недостатков не наблюдается
- развертывание ветки с помощью клавиатуры : поддерживается
- задержек и подвисания GUI ри быстром переключении между папками, содержащими большое количество файлов : не наблюдается
Я говорю почти, поскольку : ( WinXP SP3 )
- иконки (htm, hml ,mht )-файлов все же не находятся, в отличие от Explorer'а .
- иконки url- файлов определяются как линк текстового файла и элемент показывается соответственно без расширения .
Откуда все же Explorer да и Total Commander берет правильные иконки ?
Реестр я свой поправил : Дефолтную иконку теперь дает правильно.
	
	
		
			
	
	
	
	
  
    
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
		
	
Скачать : ExtractIcon_Ex.au3  (6.89 kb)
Добавлено:
Только сейчас подумал :
Если я нарушил нереднамеренно авторские права, просьба удалить файл.
			
			- Наконец-то ушли назначения параметров -хорошее решение с _GUICtrlTreeView_ExpandedOnce
- Стали незаметными удаления временных элементов
- Не стал раздуваться ImageList
- Нашлось получение разнообразных иконок почти, как в Explorer'е .
Однако скорость обработки еще более снизилась.Да и код не простой.
Как мыслится использование этих наработок в своем скрипте ?
Не каждый пользователь способен разобраться в сложном коде. Ему бы "Черный ящик" с входными и выходными параметрами.
А тут еще непростая ф-ия обработки ( WM_NOTIFY ) .
Я вот попробовал в качестве "экскримента" : в скрипте со своим алгоритмом создания дерева,
использовать твою ф-ию получения иконок ( _TVAddIcon ), которую залил в виде файла : ExtractIcon_Ex.au3
В результате при более простом коде и с использованием стандартной ф-ии обработки сообщений ( WM_NOTIFY ),
получил практически все прелести ,имеющиеся в твоем коде. Причем скорость : в 1.5-2 раза выше.
Да и замеченных тобой недостатков не наблюдается
- развертывание ветки с помощью клавиатуры : поддерживается
- задержек и подвисания GUI ри быстром переключении между папками, содержащими большое количество файлов : не наблюдается
Я говорю почти, поскольку : ( WinXP SP3 )
- иконки (htm, hml ,mht )-файлов все же не находятся, в отличие от Explorer'а .
- иконки url- файлов определяются как линк текстового файла и элемент показывается соответственно без расширения .
Откуда все же Explorer да и Total Commander берет правильные иконки ?
Реестр я свой поправил : Дефолтную иконку теперь дает правильно.
			
				Код:
			
		
		
		#region *** INCLUDES ***
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#Include "ExtractIcon_Ex.au3"
#endregion
Global $iIndexIcon
$hForm = GUICreate('PC_TreeView', 600, 600)
GUISetBkColor(0xC0C0B0)
$Input_Time = GUICtrlCreateInput('', 260, 10, 60, 19,1);1-$ES_CENTER
$Input = GUICtrlCreateInput('', 20, 30, 560, 19)
$hTreeView=GUICtrlCreateTreeView(20, 50, 560, 530, -1, $WS_EX_CLIENTEDGE)
$hImageList = _GUIImageList_Create(_WinAPI_GetSystemMetrics($SM_CXSMICON), _WinAPI_GetSystemMetrics($SM_CYSMICON), 5, 1)
_GUICtrlTreeView_SetNormalImageList($hTreeView, $hImageList)
$aDisk=DriveGetDrive("ALL")
$begin=TimerInit()
$iIndexIcon = _TVAddIcon($hTreeView, $aDisk[1]&'\')
For $i=1 To UBound($aDisk)-1
   $aDisk[$i]=StringUpper ( $aDisk[$i] )
   $hItem= _GUICtrlTreeView_Add($hTreeView, 0, $aDisk[$i],$iIndexIcon,$iIndexIcon)
   If  FileFindFirstFile($aDisk[$i] & '\*')<> -1 Then _GUICtrlTreeView_SetChildren($hTreeView,  $hItem)
Next
GUICtrlSetData($Input_Time,StringFormat("%.2f",TimerDiff($begin)))
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY_1')
GUISetState()
Do
Until GUIGetMsg()= -3
Func TreeView_UpDate_Ex($hTV,$hItem)
   If $hItem=0 Then Return -1
   If Not IsHWnd($hTV) Then $hTV=GUICtrlGetHandle($hTV)
   $sPath=StringReplace(_GUICtrlTreeView_GetTree($hTV, $hItem) ,'|','\')
   If Not FileExists($sPath) Then Return SetError(1, 1, 0)
   GUICtrlSetData($Input,StringRegExpReplace ( $sPath ,'(.:)$','\1\\' ,1))
   If  _GUICtrlTreeView_ExpandedOnce($hTV, $hItem) Then Return  -1
   Local $hSearch = FileFindFirstFile($sPath & '\*')
   Local $hFolder
   While 1
	  $sFile = FileFindNextFile($hSearch)
	  If @error Then ExitLoop
	  $iIndexIcon = _TVAddIcon($hTV, $sPath & '\' & $sFile); *** 1-й вариант поиска Иконок ***
	  If StringInStr(FileGetAttrib($sPath & '\' & $sFile), 'D')  Then
		 $hFolder= _GUICtrlTreeView_InsertItem($hTV, $sFile,$hItem,$hFolder,$iIndexIcon,$iIndexIcon)
		 If FileFindFirstFile($sPath & '\' & $sFile & '\*')<> -1 Then _GUICtrlTreeView_SetChildren($hTV,  $hFolder)
	  Else
		 $hChild= _GUICtrlTreeView_AddChild($hTV,$hItem,$sFile,$iIndexIcon,$iIndexIcon)
	  EndIf
   WEnd
   Return 1
EndFunc ;==> TreeView_UpDate_Ex
Func WM_NOTIFY_1($hWnd, $iMsg, $iwParam, $ilParam)
   #forceref $hWnd, $iMsg, $iwParam
   Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
   $hWndTreeview = $hTreeView
   If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
   $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
   $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   $iCode = DllStructGetData($tNMHDR, "Code")
   Switch $hWndFrom
	  Case $hWndTreeview
		 Switch $iCode
			Case  $NM_CLICK 
			   $hClickedItemTV=ScreenToClient($hWndTreeview); ===>
			   $begin=TimerInit()
			   If Not TreeView_UpDate_Ex($hTreeView, $hClickedItemTV) Then _GUICtrlTreeView_Delete($hTreeView, $hClickedItemTV); ===>
			   GUICtrlSetData($Input_Time,StringFormat("%.2f",TimerDiff($begin)))
		EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==> WM_NOTIFY
Func ScreenToClient($hWnd)
   Local $tPOINT = DllStructCreate("int X;int Y"),$hPointed
   DllStructSetData($tPOINT, "X", MouseGetPos(0))
   DllStructSetData($tPOINT, "Y", MouseGetPos(1))
   DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($tPOINT)) 
   Local $iX = DllStructGetData($tPOINT, "X"),$iY = DllStructGetData($tPOINT, "Y")
   $hPointed = _GUICtrlTreeView_HitTestItem($hWnd, $iX, $iY)
   Return $hPointed
EndFunc ;==> ScreenToClient
	Добавлено:
	Сообщение автоматически объединено: 
Только сейчас подумал :
Если я нарушил нереднамеренно авторские права, просьба удалить файл.
	            