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
Добавлено:
Сообщение автоматически объединено:
Только сейчас подумал :
Если я нарушил нереднамеренно авторские права, просьба удалить файл.