Что нового

TreeView - как каталог

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Как можно сделать TreeView как на скрине:


просто я не знаю как обьяснить

нужно сделать типа слева TreeView, справа - элементы управления (любые), и при смене TreeViewItem менялись эти самые элементы управления под выбранную категорию.

Я находил примеры, но они мне совершенно не помогли
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
Усовершенствованный пример из справки:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
;

$hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

$TreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

#Region General TVItem
$General_TVItem = GUICtrlCreateTreeViewItem("General", $TreeView)
GUICtrlSetColor(-1, 0x0000C0)

$TVDemo_Label = GUICtrlCreateLabel("TreeView Demo", 190, 90, 100, 20)

$iGeneral_Last_Item = GUICtrlCreateDummy()
#EndRegion General TVItem
;

#Region About TVItem
$About_TVItem = GUICtrlCreateTreeViewItem("About", $General_TVItem)

$About_Label = GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.", 190, 70, 100, 60)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "aboutlabel"-text during initialization

$Some_Button = GUICtrlCreateButton("My Button", 190, 135, 70, 20)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "My Button"-button during initialization

$iAbout_Last_Item = GUICtrlCreateDummy()
#EndRegion About TVItem
;

#Region Computer TVItem
$Computer_TVItem = GUICtrlCreateTreeViewItem("Computer", $General_TVItem)

$ComputerInfo_Label = GUICtrlCreateLabel( _
	StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "compinfo"-text during initialization

$iComputer_Last_Item = GUICtrlCreateDummy()
#EndRegion Computer TVItem
;

#Region User TVItem
$User_TVItem = GUICtrlCreateTreeViewItem("User", $General_TVItem)

$UserInfo_Label = GUICtrlCreateLabel("User Name: " & @CRLF & @TAB & @TAB & @UserName, 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "UserInfo"-text during initialization

$iUser_Last_Item = GUICtrlCreateDummy()
#EndRegion User TVItem
;

#Region Display TVItem
$Display_TVItem = GUICtrlCreateTreeViewItem("Display", $TreeView)
GUICtrlSetColor(-1, 0x0000C0)

$iDisplay_Last_Item = GUICtrlCreateDummy()
#EndRegion Display TVItem
;

#Region Resolution TVItem
$Resolution_TVItem = GUICtrlCreateTreeViewItem("Resolution", $Display_TVItem)

$iResolution_Last_Item = GUICtrlCreateDummy()
#EndRegion Resolution TVItem
;

#Region Other TVItem
$Other_TVItem = GUICtrlCreateTreeViewItem("Other", $Display_TVItem)

$iOther_Last_Item = GUICtrlCreateDummy()
#EndRegion Other TVItem
;

;Last ItemID - to hide all controls when showing other (current)
$iLast_TVItemsID = GUICtrlCreateDummy()

GUICtrlCreateLabel("", 0, 180, 350, 2, $SS_SUNKEN)

$Toggle_Button = GUICtrlCreateButton("&Toggle", 35, 185, 70, 20)
$Info_Button = GUICtrlCreateButton("&Info", 105, 185, 70, 20)
$ColExp_Button = GUICtrlCreateButton("Col./Exp.", 175, 185, 70, 20)
$Cancel_Button = GUICtrlCreateButton("&Cancel", 245, 185, 70, 20)

GUICtrlSetState($General_TVItem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold
GUICtrlSetState($Display_TVItem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $Cancel_Button, $GUI_EVENT_CLOSE
			Exit
		Case $Toggle_Button ; Toggle the bold painting
			If BitAND(GUICtrlRead($General_TVItem), $GUI_DEFBUTTON) Then
				GUICtrlSetState($General_TVItem, 0)
				GUICtrlSetState($Display_TVItem, 0)
			Else
				GUICtrlSetState($General_TVItem, $GUI_DEFBUTTON)
				GUICtrlSetState($Display_TVItem, $GUI_DEFBUTTON)
			EndIf
		Case $Info_Button
			$iItem_CtrlID = GUICtrlRead($TreeView) ; Get the controlID of the current selected treeview item
			
			If $iItem_CtrlID = 0 Then
				MsgBox(64, "TreeView Demo", "No item currently selected.", 0, $hGUI)
			Else
				$sItem_Msg = GUICtrlRead($iItem_CtrlID, 1) ; Get advanced infos about the treeview item
				
				If $sItem_Msg = "" Then
					MsgBox(16, "Error", "Error while retrieving infos about item.", 0, $hGUI)
				Else
					MsgBox(64, "TreeView Demo", "Current item selected is: " & $sItem_Msg, 0, $hGUI) 
				EndIf
			EndIf
		Case $ColExp_Button
			$iItem_CtrlID = GUICtrlRead($TreeView)
			
			If $iItem_CtrlID > 0 Then
				$hItem = GUICtrlGetHandle($iItem_CtrlID)
				GUICtrlSendMsg($TreeView, $TVM_EXPAND, $TVE_TOGGLE, $hItem)
			EndIf
			
			;The following items will hide the other labels (1st and 2nd parameter), 
			;and then show the 'own' labels (3rd and 4th parameter)
		Case $General_TVItem, $About_TVItem, $Computer_TVItem, $User_TVItem, $Display_TVItem, $Resolution_TVItem, $Other_TVItem
			$iEnd_ItemID = 0
			
			Switch $nMsg
				Case $General_TVItem
					$iEnd_ItemID = $iGeneral_Last_Item
				Case $About_TVItem
					$iEnd_ItemID = $iAbout_Last_Item
				Case $Computer_TVItem
					$iEnd_ItemID = $iComputer_Last_Item
				Case $User_TVItem
					$iEnd_ItemID = $iUser_Last_Item
				Case $Display_TVItem
					$iEnd_ItemID = $iDisplay_Last_Item
				Case $Resolution_TVItem
					$iEnd_ItemID = $iResolution_Last_Item
				Case $Other_TVItem
					$iEnd_ItemID = $iOther_Last_Item
			EndSwitch
			
			;This list is the control IDs that should be ignored when we set items state
			$sExclude_IDs = $General_TVItem & "|" & $Display_TVItem
			
			_GUICtrlTreeView_ToggleItemsState($General_TVItem, $iLast_TVItemsID, $nMsg+1, $iEnd_ItemID, $sExclude_IDs)
	EndSwitch
WEnd

Func _GUICtrlTreeView_ToggleItemsState($iHideStartID, $iHideEndID, $iShowStartID, $iShowEndID, $sExclude_IDs="")
	If $sExclude_IDs <> "" Then $sExclude_IDs = "|" & $sExclude_IDs & "|"
	
	For $i = $iHideStartID To $iHideEndID
		If $sExclude_IDs = "" Or Not StringInStr($sExclude_IDs, "|" & $i & "|") Then GUICtrlSetState($i, $GUI_HIDE)
	Next
	
	For $i = $iShowStartID To $iShowEndID
		If $sExclude_IDs = "" Or Not StringInStr($sExclude_IDs, "|" & $i & "|") Then GUICtrlSetState($i, $GUI_SHOW)
	Next
EndFunc



Добавлено:
Сообщение автоматически объединено:

sforce5 [?]
Я не понял как отображается информация при переключении TreeViewItem
Алгоритм примерно таков:

* На стадий запуска скрипта, вместе с созданием GUI создаются все необходимые элементы (для каждого пункта в TreeМшуц своя группа элементов, см. #Region'ы).
* Далее в цикле проверяется событие по нажатию на один из пунктов TreeViewItem.
* В зависимости от нажатого TV-элемента определяется первый и последний элемент в этой группе, и при помощи функций _GUICtrlTreeView_ToggleItemsState происходит откат этих элементов - т.е все остальные элементы скрываются, и отображаются только те элементы, которые попадают под текущую группу в TreeViewItem.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR
А не проще ли управление TV сделать через ф-ию WM_NOTIFY ?
Ведь если элементов дерева много или они сразу не определены ,то перечисление их в Case ... lполучается громоздким или затруднительным
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
А не проще ли управление TV сделать через ф-ию WM_NOTIFY ?
Ведь если элементов дерева много или они сразу не определены ,то перечисление их в Case ... lполучается громоздким или затруднительным
А какая разница где их перечислять, в WM_NOTIFY или в MessageLoop? ;)
Всё ровно перечислять нужно одно и тоже количество элементов :whisper:
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Ага, вот именно, у меня ведь там не один элемент, я поседею пока все элементы пропишу по методике Creator'a
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
Вобщем мне удалось создать ещё более гибкий механизм переключения пунктов для TreeView:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>
;

;All the TreeView Arrays to chek them in WM_NOTIFY Events callback-function.
Global $aAll_TV_Arrays[1]

$hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

$nTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

#Region General TVItem
Enum $iGeneral_0, $iGeneral_1, $iGeneral_Max
Dim $aGeneral_TVItems[$iGeneral_Max]

$aGeneral_TVItems[$iGeneral_0] = GUICtrlCreateTreeViewItem("General", $nTreeView)
GUICtrlSetColor(-1, 0x0000C0)

$aGeneral_TVItems[$iGeneral_1] = GUICtrlCreateLabel("TreeView Demo", 190, 90, 100, 20)

_ArrayAdd($aAll_TV_Arrays, $aGeneral_TVItems)
#EndRegion General TVItem
;

#Region About TVItem
Enum $iAbout_0, $iAbout_1, $iAbout_2, $iAbout_Max
Dim $aAbout_TVItems[$iAbout_Max]

$aAbout_TVItems[$iAbout_0] = GUICtrlCreateTreeViewItem("About", $aGeneral_TVItems[$iGeneral_0])

$aAbout_TVItems[$iAbout_1] = GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "aboutlabel"-text during initialization

$aAbout_TVItems[$iAbout_2] = GUICtrlCreateButton("My Button", 190, 135, 70, 20)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "My Button"-button during initialization

_ArrayAdd($aAll_TV_Arrays, $aAbout_TVItems)
#EndRegion About TVItem
;

#Region Computer TVItem
Enum $iComp_0, $iComp_1, $iComp_Max
Dim $aComp_TVItems[$iComp_Max]

$aComp_TVItems[$iComp_0] = GUICtrlCreateTreeViewItem("Computer", $aGeneral_TVItems[$iGeneral_0])

$aComp_TVItems[$iComp_1] = GUICtrlCreateLabel( _
	StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "compinfo"-text during initialization

_ArrayAdd($aAll_TV_Arrays, $aComp_TVItems)
#EndRegion Computer TVItem
;

#Region User TVItem
Enum $iUser_0, $iUser_1, $iUser_Max
Dim $aUser_TVItems[$iUser_Max]

$aUser_TVItems[$iUser_0] = GUICtrlCreateTreeViewItem("User", $aGeneral_TVItems[$iGeneral_0])

$aUser_TVItems[$iUser_1] = GUICtrlCreateLabel("User Name: " & @CRLF & @TAB & @TAB & @UserName, 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "UserInfo"-text during initialization

_ArrayAdd($aAll_TV_Arrays, $aUser_TVItems)
#EndRegion User TVItem
;

#Region Display TVItem
Enum $iDisplay_0, $iDisplay_Max
Dim $aDisplay_TVItems[$iDisplay_Max]

$aDisplay_TVItems[$iDisplay_0] = GUICtrlCreateTreeViewItem("Display", $nTreeView)
GUICtrlSetColor(-1, 0x0000C0)

_ArrayAdd($aAll_TV_Arrays, $aDisplay_TVItems)
#EndRegion Display TVItem
;

#Region Resolution TVItem
Enum $iResol_0, $iResol_Max
Dim $aResol_TVItems[$iResol_Max]

$aResol_TVItems[$iResol_0] = GUICtrlCreateTreeViewItem("Resolution", $aDisplay_TVItems[$iDisplay_0])

_ArrayAdd($aAll_TV_Arrays, $aResol_TVItems)
#EndRegion Resolution TVItem
;

GUICtrlCreateLabel("", 0, 180, 350, 2, $SS_SUNKEN)

$Toggle_Button = GUICtrlCreateButton("Toggle", 35, 185, 70, 20)
$Info_Button = GUICtrlCreateButton("Info", 105, 185, 70, 20)
$ColExp_Button = GUICtrlCreateButton("Col./Exp.", 175, 185, 70, 20)
$Cancel_Button = GUICtrlCreateButton("Cancel", 245, 185, 70, 20)

GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold
GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $Cancel_Button, $GUI_EVENT_CLOSE
			Exit
		Case $Toggle_Button ; Toggle the bold painting
			If BitAND(GUICtrlRead($aGeneral_TVItems[$iGeneral_0]), $GUI_DEFBUTTON) Then
				GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], 0)
				GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], 0)
			Else
				GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], $GUI_DEFBUTTON)
				GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], $GUI_DEFBUTTON)
			EndIf
		Case $Info_Button
			$iItem_CtrlID = GUICtrlRead($nTreeView) ; Get the controlID of the current selected treeview item
			
			If $iItem_CtrlID = 0 Then
				MsgBox(64, "TreeView Demo", "No item currently selected.", 0, $hGUI)
			Else
				$sItem_Msg = GUICtrlRead($iItem_CtrlID, 1) ; Get advanced infos about the treeview item
				
				If $sItem_Msg = "" Then
					MsgBox(16, "Error", "Error while retrieving infos about item.", 0, $hGUI)
				Else
					MsgBox(64, "TreeView Demo", "Current item selected is: " & $sItem_Msg, 0, $hGUI) 
				EndIf
			EndIf
		Case $ColExp_Button
			$iItem_CtrlID = GUICtrlRead($nTreeView)
			
			If $iItem_CtrlID > 0 Then
				$hItem = GUICtrlGetHandle($iItem_CtrlID)
				GUICtrlSendMsg($nTreeView, $TVM_EXPAND, $TVE_TOGGLE, $hItem)
			EndIf
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
	
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
    Switch $iIDFrom
        Case $nTreeView
            Switch $iCode
				Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
					Local $aTmpArr, $iArr_Indx = 0
					$iIDFrom = GUICtrlRead($iIDFrom)
					
					For $i = 0 To UBound($aAll_TV_Arrays)-1
						$aTmpArr = $aAll_TV_Arrays[$i]
						
						For $j = 1 To UBound($aTmpArr)-1
							GUICtrlSetState($aTmpArr[$j], $GUI_HIDE)
							
							If $iIDFrom = $aTmpArr[$j-1] Then
								$iArr_Indx = $i
							EndIf
						Next
					Next
					
					$aTmpArr = $aAll_TV_Arrays[$iArr_Indx]
					
					For $i = 1 To UBound($aTmpArr)-1
						GUICtrlSetState($aTmpArr[$i], $GUI_SHOW)
					Next
            EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc


Добавление новых пунктов сводится к следующему блоку (добавляется при построений элементов GUI):

Код:
#Region Other TVItem
Enum $iOther_0, $iOther_1, $iOther_Max
Dim $aOther_TVItems[$iOther_Max]

$aOther_TVItems[$iOther_0] = GUICtrlCreateTreeViewItem("Other", $aDisplay_TVItems[$iDisplay_0])

$aOther_TVItems[$iOther_1] = GUICtrlCreateLabel("Some Other Data Controls", 150, 50)

_ArrayAdd($aAll_TV_Arrays, $aOther_TVItems)
#EndRegion Other TVItem
;


:beer:

P.S
Я сам немного в шоке, не думал что это можно сделать ещё универсальнее и проще.


Добавлено:
Сообщение автоматически объединено:

Можно конечно обойтись и без WM_NOTIFY:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>
;

;All the TreeView Arrays to chek them in WM_NOTIFY Events callback-function.
Global $aAll_TV_Arrays[1]

$hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

$nTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

#Region General TVItem
Enum $iGeneral_0, $iGeneral_1, $iGeneral_Max
Dim $aGeneral_TVItems[$iGeneral_Max]

$aGeneral_TVItems[$iGeneral_0] = GUICtrlCreateTreeViewItem("General", $nTreeView)
GUICtrlSetColor(-1, 0x0000C0)

$aGeneral_TVItems[$iGeneral_1] = GUICtrlCreateLabel("TreeView Demo", 190, 90, 100, 20)

_ArrayAdd($aAll_TV_Arrays, $aGeneral_TVItems)
#EndRegion General TVItem
;

#Region About TVItem
Enum $iAbout_0, $iAbout_1, $iAbout_2, $iAbout_Max
Dim $aAbout_TVItems[$iAbout_Max]

$aAbout_TVItems[$iAbout_0] = GUICtrlCreateTreeViewItem("About", $aGeneral_TVItems[$iGeneral_0])

$aAbout_TVItems[$iAbout_1] = GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "aboutlabel"-text during initialization

$aAbout_TVItems[$iAbout_2] = GUICtrlCreateButton("My Button", 190, 135, 70, 20)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "My Button"-button during initialization

_ArrayAdd($aAll_TV_Arrays, $aAbout_TVItems)
#EndRegion About TVItem
;

#Region Computer TVItem
Enum $iComp_0, $iComp_1, $iComp_Max
Dim $aComp_TVItems[$iComp_Max]

$aComp_TVItems[$iComp_0] = GUICtrlCreateTreeViewItem("Computer", $aGeneral_TVItems[$iGeneral_0])

$aComp_TVItems[$iComp_1] = GUICtrlCreateLabel( _
	StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "compinfo"-text during initialization

_ArrayAdd($aAll_TV_Arrays, $aComp_TVItems)
#EndRegion Computer TVItem
;

#Region User TVItem
Enum $iUser_0, $iUser_1, $iUser_Max
Dim $aUser_TVItems[$iUser_Max]

$aUser_TVItems[$iUser_0] = GUICtrlCreateTreeViewItem("User", $aGeneral_TVItems[$iGeneral_0])

$aUser_TVItems[$iUser_1] = GUICtrlCreateLabel("User Name: " & @CRLF & @TAB & @TAB & @UserName, 120, 30, 200, 80)
GUICtrlSetState(-1, $GUI_HIDE) ; Hides the "UserInfo"-text during initialization

_ArrayAdd($aAll_TV_Arrays, $aUser_TVItems)
#EndRegion User TVItem
;

#Region Display TVItem
Enum $iDisplay_0, $iDisplay_Max
Dim $aDisplay_TVItems[$iDisplay_Max]

$aDisplay_TVItems[$iDisplay_0] = GUICtrlCreateTreeViewItem("Display", $nTreeView)
GUICtrlSetColor(-1, 0x0000C0)

_ArrayAdd($aAll_TV_Arrays, $aDisplay_TVItems)
#EndRegion Display TVItem
;

#Region Resolution TVItem
Enum $iResol_0, $iResol_Max
Dim $aResol_TVItems[$iResol_Max]

$aResol_TVItems[$iResol_0] = GUICtrlCreateTreeViewItem("Resolution", $aDisplay_TVItems[$iDisplay_0])

_ArrayAdd($aAll_TV_Arrays, $aResol_TVItems)
#EndRegion Resolution TVItem
;

#Region Other TVItem
Enum $iOther_0, $iOther_1, $iOther_Max
Dim $aOther_TVItems[$iOther_Max]

$aOther_TVItems[$iOther_0] = GUICtrlCreateTreeViewItem("Other", $aDisplay_TVItems[$iDisplay_0])

$aOther_TVItems[$iOther_1] = GUICtrlCreateLabel("Some Other Data Controls", 150, 50)

_ArrayAdd($aAll_TV_Arrays, $aOther_TVItems)
#EndRegion Other TVItem
;

GUICtrlCreateLabel("", 0, 180, 350, 2, $SS_SUNKEN)

$Toggle_Button = GUICtrlCreateButton("Toggle", 35, 185, 70, 20)
$Info_Button = GUICtrlCreateButton("Info", 105, 185, 70, 20)
$ColExp_Button = GUICtrlCreateButton("Col./Exp.", 175, 185, 70, 20)
$Cancel_Button = GUICtrlCreateButton("Cancel", 245, 185, 70, 20)

GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold
GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $Cancel_Button, $GUI_EVENT_CLOSE
			Exit
		Case $Toggle_Button ; Toggle the bold painting
			If BitAND(GUICtrlRead($aGeneral_TVItems[$iGeneral_0]), $GUI_DEFBUTTON) Then
				GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], 0)
				GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], 0)
			Else
				GUICtrlSetState($aGeneral_TVItems[$iGeneral_0], $GUI_DEFBUTTON)
				GUICtrlSetState($aDisplay_TVItems[$iDisplay_0], $GUI_DEFBUTTON)
			EndIf
		Case $Info_Button
			$iItem_CtrlID = GUICtrlRead($nTreeView) ; Get the controlID of the current selected treeview item
			
			If $iItem_CtrlID = 0 Then
				MsgBox(64, "TreeView Demo", "No item currently selected.", 0, $hGUI)
			Else
				$sItem_Msg = GUICtrlRead($iItem_CtrlID, 1) ; Get advanced infos about the treeview item
				
				If $sItem_Msg = "" Then
					MsgBox(16, "Error", "Error while retrieving infos about item.", 0, $hGUI)
				Else
					MsgBox(64, "TreeView Demo", "Current item selected is: " & $sItem_Msg, 0, $hGUI) 
				EndIf
			EndIf
		Case $ColExp_Button
			$iItem_CtrlID = GUICtrlRead($nTreeView)
			
			If $iItem_CtrlID > 0 Then
				$hItem = GUICtrlGetHandle($iItem_CtrlID)
				GUICtrlSendMsg($nTreeView, $TVM_EXPAND, $TVE_TOGGLE, $hItem)
			EndIf
		Case Else
			If $nMsg <= 0 Then ContinueLoop
			Local $aTmpArr, $iArr_Indx = 0
			
			For $i = 0 To UBound($aAll_TV_Arrays)-1
				$aTmpArr = $aAll_TV_Arrays[$i]
				
				For $j = 1 To UBound($aTmpArr)-1
					GUICtrlSetState($aTmpArr[$j], $GUI_HIDE)
					
					If $nMsg = $aTmpArr[$j-1] Then
						$iArr_Indx = $i
					EndIf
				Next
			Next
			
			$aTmpArr = $aAll_TV_Arrays[$iArr_Indx]
			
			For $i = 1 To UBound($aTmpArr)-1
				GUICtrlSetState($aTmpArr[$i], $GUI_SHOW)
			Next
	EndSwitch
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR
Показанные тобой решения интересны с точки зрения выявления и использования неограниченных возможностей :IL_AutoIt_1:
Но использование сложных массивов (массив в массиве) приводит к достаточно сложным для чтения конструкциям.
Не проще ли использовать Дочерние окна , переключаемые с помощью обычного WM_NOTIFY ?



Добавлено:
Сообщение автоматически объединено:

Если задать одинаковые имена для ItemTreeView и Дочернего окна (Title) то обработка событий вообще упрощается.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
использование сложных массивов (массив в массиве) приводит к достаточно сложным для чтения конструкциям
На "стороне пользователя" ничего не нужно читать и массивы обрабатываются без всякого вмешательства пользователя, для наглядности и усовершенствования концепций прикрепил архив, в нём есть пример (TreeViewHandler Example.au3) и собственно обработчик в виде UDF (TreeViewHandler.au3), в примере видно, насколько просто исполльзовать данную концепцию.

Не проще ли использовать Дочерние окна , переключаемые с помощью обычного WM_NOTIFY ?
Пример можно?
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR сказал(а):
Примерно так
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>

$MainhWnd = GuiCreate('Test',800,600)
GUISetState(@SW_SHOW, $MainhWnd)
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
Global  $sDefItemTxt

$hTreeView = GUICtrlGetHandle(GUICtrlCreateTreeView(0, 0, 325, 540))
$hParent=_GUICtrlTreeView_Add($hTreeView, 0,'Windows')
_GUICtrlTreeView_AddChild($hTreeView, $hParent, 'Window 1')
_GUICtrlTreeView_AddChild($hTreeView, $hParent, 'Window 2')
_GUICtrlTreeView_AddChild($hTreeView, $hParent, 'Window 3')
_GUICtrlTreeView_Expand($hTreeView)

$Child_hWnd = GUICreate("Window 1",460,590, 330, 0,  $WS_POPUP +$WS_DLGFRAME, $WS_EX_MDICHILD,$MainhWnd)	
GUISetState(@SW_HIDE, $Child_hWnd)	
GUISetBkColor ( 0x525252)
GUICtrlCreateLabel('Window 1',20,10,245,40,0x01)
$hInput=GUICtrlCreateInput("", 10,30,325,50)
$hBt1=GUICtrlCreateButton('1',10,100,60,20)
$hBt2=GUICtrlCreateButton('2',100,-1,'','')

$Child_hWnd1 = GUICreate("Window 2",460,590, 330, 0,  $WS_POPUP +$WS_DLGFRAME, $WS_EX_MDICHILD,$MainhWnd)	
GUISetState(@SW_HIDE, $Child_hWnd1)		
GUISetBkColor ( 0xC0C0C0)
GUICtrlCreateLabel('Window 2',20,10,245,40,0x01)
$hEdit=GUICtrlCreateEdit ('',20,30,400,300)
$hBt3=GUICtrlCreateButton('3',10,400,50,20)

$Child_hWnd2 = GUICreate("Window 3",460,590, 330, 0,  $WS_POPUP +$WS_DLGFRAME, $WS_EX_MDICHILD,$MainhWnd)	
GUISetState(@SW_HIDE, $Child_hWnd2)		
GUISetBkColor ( 0xCEC0CE)
$hLable=GUICtrlCreateLabel('Window 3',20,10,245,40,0x01)
$hBt4=GUICtrlCreateButton('4',10,50,50,20)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")	  

While 1  
	Sleep(50)
WEnd 

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

   Switch _WinAPI_LoWord ($iwParam)
	  Case $hBt1
		 GUICtrlSetData ($hInput, 'Нажата кнопка 1')
	  Case $hBt2
		  GUICtrlSetData ($hInput, 'Нажата кнопка 2')
	  Case $hBt3
		  GUICtrlSetData ($hEdit, 'Нажата кнопка 3')
	  Case $hBt4
		  GUICtrlSetData ($hLable, 'Нажата кнопка 4')
   EndSwitch 
   Return $GUI_RUNDEFMSG
 EndFunc   ;==>WM_COMMAND

Func Click($hTV,$hItem)
   $sItemTxt=_GUICtrlTreeView_GetText($hTV, $hItem)
   If $sDefItemTxt <>'' THen WinSetState ( $sDefItemTxt, "", @SW_HIDE )
   WinSetState ( $sItemTxt, "", @SW_SHOW )
   $sDefItemTxt=$sItemTxt
EndFunc ;===> Click

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local  $iCode, $tNMHDR
    $hWndTreeview = $hTreeView
    If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $iCode = DllStructGetData($tNMHDR, "Code")
	Switch $iCode
		Case $NM_CLICK 
			Local $tPOINT = DllStructCreate("int X;int Y")
			DllStructSetData($tPOINT, "X", MouseGetPos(0))
			DllStructSetData($tPOINT, "Y", MouseGetPos(1))
			DllCall("user32.dll", "int", "ScreenToClient", _
				"hwnd", $hTreeView, _
				"ptr", DllStructGetPtr($tPOINT)) 
			Local $iX = DllStructGetData($tPOINT, "X")
			Local $iY = DllStructGetData($tPOINT, "Y")
			Click($hTreeView,_GUICtrlTreeView_HitTestItem($hTreeView, $iX, $iY))
	EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;====> WM_NOTIFY 

Func Quit()
	Exit
EndFunc ; =====> quit
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
Во-первых оно не работает если менять пункты не мышкой, а клавиатурой (вверх-вниз). Во-вторых у меня оно тормозит немного при переключений, ну и в третьих, при работе с элементами дочернего окна родительское окно не активно, что выглядит немного некрасиво :smile:

Сорри что столько критики :smile:, просто подобное обычно не делается через дочерние окна.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR сказал(а):
Во-первых оно не работает если менять пункты не мышкой, а клавиатурой (вверх-вниз).
По моему работает.
CreatoR сказал(а):
Во-вторых у меня оно тормозит немного при переключений,
Действительно несколько тормозит , ну наверное можно что-то придумать .
CreatoR сказал(а):
при работе с элементами дочернего окна родительское окно не активно, что выглядит немного некрасиво
Да это есть , но события из родительского окна обрабатываются .

CreatoR сказал(а):
просто подобное обычно не делается через дочерние окна.
С точки зрения эстетики наверное ты прав.



Добавлено:
Сообщение автоматически объединено:

Просто для начинающего скриптера мой вариант прост и понятен.
Твой вариант труднее для понимания
Хотя бесспорно надо учиться составлять скрипты грамотно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
Твой вариант труднее для понимания
Не вижу ничего трудного в такой конструкций:

Код:
$nParent_TVItem = GUICtrlCreateTreeViewItem("General", $nTreeView)
GUICtrlSetColor($nParent_TVItem, 0x0000C0)
_GUICtrlTreeViewHandler_AddControl($nParent_TVItem, 0)

$nLabel = GUICtrlCreateLabel("TreeView Demo", 220, 90, 100, 20)
_GUICtrlTreeViewHandler_AddControl($nLabel, $nParent_TVItem)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
CreatoR сказал(а):
Не вижу ничего трудного в такой конструкций:
Я имел в виду опубликованные выше посты
А используя UDF : TreeViewHandler.au3 в качестве " Черного ящика " действительно не сложно.
Но и здесь есть подвох : Внутрь UDF : TreeViewHandler.au3 засунута WM_NOTIFY
А как быть если мне в скрипте нужна WM_NOTIFY для обработки других событий TreeView или ListView ???
Создавать еще одну ???. Прошу не считать меня слишком дотошным. Просто надо уж до конца разобраться

Позволю себе привести еще один простой вариант (на примере Creator'a) :
Без использования массивов и даже без WM_NOTIFY , за которую я так ратовал :
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>

Global $DEF_ID

$hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

$nTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

GUICtrlCreateLabel("TreeView Demo", 190, 90, 100, 20)

#Region General TVItem
   $hGeneral=GUICtrlCreateTreeViewItem("General", $nTreeView)
   GUICtrlSetColor(-1, 0x0000C0)
#EndRegion General TVItem

#Region About TVItem
   GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60)
   GUICtrlSetState(-1, $GUI_HIDE)
   $hBtMyButton=GUICtrlCreateButton("My Button", 190, 135, 70, 20)
   GUICtrlSetState(-1, $GUI_HIDE) 
   GUICtrlCreateTreeViewItem("About", $hGeneral)
#EndRegion About TVItem

#Region Computer TVItem
   GUICtrlCreateLabel( _
	   StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80)
   GUICtrlSetState(-1, $GUI_HIDE) 
   GUICtrlCreateTreeViewItem("Computer",$hGeneral)
#EndRegion Computer TVItem

#Region User TVItem
   GUICtrlCreateLabel("User Name: " & @CRLF & @TAB & @TAB & @UserName, 120, 30, 200, 80)
   GUICtrlSetState(-1, $GUI_HIDE)
   GUICtrlCreateTreeViewItem("User",$hGeneral)
#EndRegion User TVItem

#Region Display TVItem
   $hDisplay=GUICtrlCreateTreeViewItem("Display", $nTreeView)
   GUICtrlSetColor(-1, 0x0000C0)
#EndRegion Display TVItem   
 
#Region Resolution TVItem 
   GUICtrlCreateTreeViewItem("Resolution",$hDisplay)
#EndRegion Resolution TVItem

#Region Other TVItem
   GUICtrlCreateLabel("Some Other Data Controls", 150, 50)
   GUICtrlSetState(-1, $GUI_HIDE) 
   GUICtrlCreateTreeViewItem("Other", $hDisplay)
#EndRegion Other TVItem

GUICtrlCreateLabel("", 0, 180, 350, 2, $SS_SUNKEN)

$Toggle_Button = GUICtrlCreateButton("Toggle", 35, 185, 70, 20)
$Info_Button = GUICtrlCreateButton("Info", 105, 185, 70, 20)
$ColExp_Button = GUICtrlCreateButton("Col./Exp.", 175, 185, 70, 20)
$Cancel_Button = GUICtrlCreateButton("Cancel", 245, 185, 70, 20)

GUISetState()

While 1
   $nMsg = GUIGetMsg()
   $iItem_CtrlID = GUICtrlRead($nTreeView)
   Switch $nMsg
	  Case $Cancel_Button, $GUI_EVENT_CLOSE
		 Exit
	  Case  $iItem_CtrlID
		 If $DEF_ID <> '' Then SetState($nTreeView,$DEF_ID,$GUI_HIDE); Скрыть открытые прежде элементы
		 SetState($nTreeView,$iItem_CtrlID); Показать группу элементов ,относящуюся к кликнутой ветви дерева
		 $DEF_ID=$iItem_CtrlID ; Запомнить кликнутую ветвь дерева
	  Case $Toggle_Button ; Toggle the bold painting
		 If BitAND(GUICtrlRead($hGeneral), $GUI_DEFBUTTON) Then
			GUICtrlSetState($hGeneral, 0)
			GUICtrlSetState($hDisplay, 0)
		 Else
			GUICtrlSetState($hGeneral, $GUI_DEFBUTTON)
			GUICtrlSetState($hDisplay, $GUI_DEFBUTTON)
		 EndIf
	  Case $Info_Button
		 $sItem_Msg = GUICtrlRead($iItem_CtrlID, 1) ; Get advanced infos about the treeview item
                
		 If $sItem_Msg = "" Then
			MsgBox(16, "Error", "Error while retrieving infos about item.", 0, $hGUI)
		 Else
			MsgBox(64, "TreeView Demo", "Current item selected is: " & $sItem_Msg, 0, $hGUI) 
		 EndIf
	  Case $ColExp_Button
		 If $iItem_CtrlID > 0 Then
			$hItem = GUICtrlGetHandle($iItem_CtrlID)
			GUICtrlSendMsg($nTreeView, $TVM_EXPAND, $TVE_TOGGLE, $hItem)
		 EndIf
	  Case $hBtMyButton
		 MsgBox(0,'Info','My Button Clicked',1)
	EndSwitch
WEnd

Func SetState($hTV,$iCtrlID,$state=$GUI_SHOW)
   $hItem = _GUICtrlTreeView_GetItemHandle($hTV,$iCtrlID)
   If _GUICtrlTreeView_GetChildren($hTV, $hItem) Then Return 
   $hPrev=_GUICtrlTreeView_GetPrevChild($nTreeView, $hItem)
   If $hPrev=0 Then $hPrev=_GUICtrlTreeView_GetParentHandle($nTreeView, $hItem)
   While 1
	  $iCtrlID-=1
	  $hVND=GUICtrlGetHandle($iCtrlID)
	  If $hVND=$hPrev  Then ExitLoop
	  GUICtrlSetState($iCtrlID, $state)
   WEnd
EndFunc

Насколько он корректен ?
И еще один простой вопрос по ходу если можно : Как получить ID элемента по его Хэндли ? ( не мог найти )
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
Позволю себе привести еще один простой вариант (на примере Creator'a) :
Без использования массивов и даже без WM_NOTIFY , за которую я так ратовал :
Неплохо, хотя данный вариант ограничен последовательностью создаваемых элементов.

Как получить ID элемента по его Хэндли ?
Код:
$aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))
If Not @error Then MsgBox(0, "", "CtrlID of last created GUI control: " & $aRet[0])
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
Обновил немного UDF
* Теперь поддерживается -1 для указания последнего элемента в параметре $nCtrlID (не для элемента TreeView, только для дочерних элементов).
* Добавлена возможность удалять элемент из списка обработчика.
* Добавлена возможность присвоения элементов в несколько TreeView оболочек.
* Ну и сам пример значительно обновлён.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
В новой версии : TreeViewHandler_v1.1 значительно упростилась WM_NOTIFY. Классно.
Понимая , что это выполнено профессионально и мне (новичку ) сделать подобное невозможно
все же публикую свой вариант ( уж больно простой код получился ) .
CreatoR сказал(а):
Неплохо, хотя данный вариант ограничен последовательностью создаваемых элементов.
* Устранено ограничение последовательностью создаваемых элементов
* Добавлена возможность добавления Контролов в группу , кликнутой ветки Дерева.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>
#include <Array.au3>

   Global $DEF_ID
   Global  $aID[1]
   $hGUI = GUICreate("Advanced TreeView Usage Demo", 350, 215)

   $hTreeView = GUICtrlCreateTreeView(6, 6, 110, 150, -1, $WS_EX_STATICEDGE+$WS_EX_CLIENTEDGE)

   GUICtrlCreateLabel("Advanced TreeView Usage Demo", 140, 10, 200, 20)
   
   $hGeneral_TV = GUICtrlCreateTreeViewItem("General",$hTreeView)
   AddControl($hTreeView,$hGeneral_TV)
	  $hAbout_TVItem   = GUICtrlCreateTreeViewItem("About",$hGeneral_TV)
	  AddControl($hTreeView,$hAbout_TVItem)
	  AddControl($hTreeView,GUICtrlCreateLabel("About", 130, 10, 200, 30), $hAbout_TVItem)  
	  GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	  AddControl($hTreeView,GUICtrlCreateLabel("This little scripts demonstates the using of a treeview-control.",190,70,100,60),$hAbout_TVItem)
	  $hBtMyButton=GUICtrlCreateButton("My Button", 190, 135, 70, 20)
	  AddControl($hTreeView,$hBtMyButton,$hAbout_TVItem)
	  $hComp_TVItem=GUICtrlCreateTreeViewItem("Computer",$hGeneral_TV)
	  AddControl($hTreeView,$hComp_TVItem)
	  AddControl($hTreeView,GUICtrlCreateLabel("Computer", 130, 10, 200, 30),$hComp_TVItem)  
	  GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	  AddControl($hTreeView,GUICtrlCreateLabel( _
		 StringFormat("Name:\t%sOS:\n\t%s\nSP:\t%s", @ComputerName, @OSVersion, @OSServicePack), 120, 30, 200, 80),$hComp_TVItem)
	  $hUser_TVItem=GUICtrlCreateTreeViewItem("User",$hGeneral_TV)
	  AddControl($hTreeView,$hUser_TVItem)
	  AddControl($hTreeView,GUICtrlCreateLabel("User Name", 130, 10, 200, 30),$hUser_TVItem)
	  GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	  AddControl($hTreeView,GUICtrlCreateLabel("User Name: " & @Tab  & @UserName, 120, 30, 200, 80),$hUser_TVItem)
   $hDisplay_TV=GUICtrlCreateTreeViewItem("Display", $hTreeView)
   AddControl($hTreeView,$hDisplay_TV)
	  $hResol_TVItem =GUICtrlCreateTreeViewItem("Resolution",$hDisplay_TV)
	  AddControl($hTreeView,$hResol_TVItem)
	  AddControl($hTreeView,GUICtrlCreateLabel("Resolution", 130, 10, 200, 30),$hResol_TVItem)
	  GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	  $hOther_TVItem =GUICtrlCreateTreeViewItem("Other", $hDisplay_TV)
	  AddControl($hTreeView,$hOther_TVItem)
	  AddControl($hTreeView,GUICtrlCreateLabel("Other", 130, 10, 200, 30),$hOther_TVItem)
	  GUICtrlSetFont(-1, 12, 800, 0, "Georgia")
	  AddControl($hTreeView,GUICtrlCreateLabel("Some Other Data Controls", 150, 50),$hOther_TVItem)

   $AddControl_Button = GUICtrlCreateButton("Add Control", 10, 185, 70, 20)
   $Exit_Button = GUICtrlCreateButton("Exit", 270, -1, '', '')
 ;------------------------------------------------------------------------------------------------ 
GUISetState()
 
While 1
   $nMsg = GUIGetMsg()
   $iItem_CtrlID = GUICtrlRead($hTreeView)
   Switch $nMsg
	  Case  -3,$Exit_Button
		 Exit
	  Case  $iItem_CtrlID
		 If  $DEF_ID=$iItem_CtrlID Then ContinueLoop
		 _CtrlSetState1($hTreeView,$iItem_CtrlID,$aID); ===>
	  Case $AddControl_Button
	      ; If _GUICtrlTreeView_GetParentHandle($hTreeView,$iItem_CtrlID) =0 Then ContinueLoop  ; **** Добавлено  ***
                        AddControl($hTreeView,GUICtrlCreateLabel("New Control",  10, 160, 200, 20), $iItem_CtrlID,$GUI_SHOW)  
		GUICtrlSetColor(-1, 0xFF0000)
   EndSwitch
WEnd

Func AddControl($hTV, $iCtrID, $iParentCtrlID=0,$iState=$GUI_HIDE)
   $iInd = _ArraySearch($aID, $iParentCtrlID, 1, 0, 0, 1)
   If $iParentCtrlID=0 Then 
	  _ArrayAdd($aID,$iCtrID)
   Else  
	  _ArrayInsert($aID, $iInd, $iCtrID)
   EndIf  
   GUICtrlSetState($iCtrID,$iState) 
EndFunc

Func _CtrlSetState1($hTV,$iCtrlID,$aArray,$state=$GUI_SHOW)
   ;If _GUICtrlTreeView_GetParentHandle($hTV,$iCtrlID) =0 Then Return
   $iIndex = _ArraySearch($aArray, $iCtrlID, 1, 0, 0, 1)
   While 1
	  $iIndex-=1
	 ; If _GUICtrlTreeView_GetText($hTV,$aArray[$iIndex]) <> '' Then ExitLoop 
	 If _GUICtrlTreeView_GetText($hTV,$aArray[$iIndex]) <> '' Or $iIndex <1 Then ExitLoop
             GUICtrlSetState($aArray[$iIndex], $state)
   WEnd
   If $state=$GUI_SHOW And $DEF_ID <>'' Then  _CtrlSetState1($hTV, $DEF_ID,$aArray,$GUI_HIDE); Скрыть открытые прежде элементы
   $DEF_ID=$iCtrlID
EndFunc

Поскольку это моя 1-я наработка просьба высказать замечания и по коду и по организации скрипта.
Вопрос : Как можно объединить строчки ? :
Код:
$nMsg = GUIGetMsg()
$iItem_CtrlID = GUICtrlRead($hTreeView)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 278
Репутация
2 353
gregaz [?]
Добавлена возможность добавления Контролов в группу , кликнутой ветки Дерева
Оно немного глючит. Если создать контрол в About, а потом в General, то контрол отображается во всех остальных вкладках, ну или если два раза создать в General.

просьба высказать замечания и по коду и по организации скрипта
Уже намного лучше, концепция приближается к той что в моём примере :smile:

Как можно объединить строчки ?
Ну я бы так сделал, чтобы не нагружать цикл:

Код:
While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case -3, $Exit_Button
			Exit
		Case $AddControl_Button
			AddControl($hTreeView, GUICtrlCreateLabel("New Control", 10, 160, 200, 20), $iItem_CtrlID, $GUI_SHOW)
			GUICtrlSetColor(-1, 0xFF0000)
		Case Else
			If $nMsg <= 0 Then ContinueLoop
			$iItem_CtrlID = GUICtrlRead($hTreeView)
			
			If $DEF_ID = $iItem_CtrlID Then ContinueLoop
			_CtrlSetState1($hTreeView, $iItem_CtrlID, $aID); ===>
	EndSwitch
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Спасибо.
CreatoR сказал(а):
Оно немного глючит. Если создать контрол в About, а потом в General, то контрол отображается во всех остальных вкладках, ну или если два раза создать в General.
Честно говоря я не предусматривал создание контролов в Родительских ветках . Помоему это не нужно.
Можно легко поставить на них ограничение. (добавил : If _GUICtrlTreeView_GetParentHandle($hTreeView,$iItem_CtrlID) =0 Then ContinueLoop )
Хотя можно посмотреть насколько усложнится скрипт при устранении глюков.
 
Верх