Что нового

Отработка нажатий на TreeView с 6000 позиций

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Вопрос вот в чем - как правильно будет организовать отработку нажатий на элементы дерева (несколько коренных ветвей, в каждой сотни или даже тысячи конечных ветвей). Как узнать на какой элемент ткунли мышкой с наименьшей нагрузкой на проц? MessageLoop вынуждает меня каждый цикл проверять весь массив ветвей на равенство с $MSG. Я когда тыкаю на несколько ветвей стрелкой вниз, ядро на 100% вскипает :smile: А с режимом onEvent мне придется на каждую ветвь выставлять одну и ту же функцию?
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Core2Duo76 [?]
как правильно будет
Вероятно, правильность будет зависеть от способа создания (построения) дерева. Например, такой вариант процессор не грузит
Код:
GUICreate("")
$Tree = GUICtrlCreateTreeView(5, 5, 390, 390)
Global $Items[6001], $Prev, $Item
For $i = 0 To 6000
  GUICtrlCreateTreeViewItem($i, $Tree)
Next
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Items[0] To $Items[6000]
      $Item = GUICtrlRead($Tree)
      If $Item <> $Prev Then
        $Prev = $Item
        ConsoleWrite($Item & @CRLF)
      EndIf
  EndSwitch
Until 0
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
А вот в этом и прикол, что создание элементов не линейно. Прерывается на создание ветви. в Items будет десяток веток и остальные уже будут простыми итемами


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

Плохо выразился. Цикл с двумя счетчками I и J
по I мы создаем ветку
по J вы создаем ветви в ветку I. в массиве J будут пропуски, а ваше условие из куска кода выше будет удовлетворять как собитям с ветки, так и событиям с ветви. Такие дела :smile:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Core2Duo76
Если хотите попроще, то можно реализовать так:
Код:
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	Switch HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
		Case $TreeView
			Switch DllStructGetData($tNMHDR, "Code")
				Case $NM_CLICK
					$fUpdate = True ;Совершен клик в TreeView
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

И берите пример от InnI, только активный элемент у вас будет получаться следующим образом:
Код:
_GUICtrlTreeView_GetSelection( $TreeView )


И как обработали нажатие - сбиваем триггер:
Код:
$fUpdate = False



Если посложнее - изучайте сообщения отсылаемые элементом TreeView, на msdn все расписано.
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Core2Duo76 [?]
как событиям с ветки, так и событиям с ветви
Разделите их и обрабатывайте отдельно
Код:
$GUI = GUICreate("")
$Tree = GUICtrlCreateTreeView(5, 5, 390, 390)
Global $Root[5], $L0[1201], $L1[1201], $L2[1201], $L3[1201], $L4[1201]
For $i = 0 To 4
  $Root[$i] = GUICtrlCreateTreeViewItem("Root_" & $i, $Tree)
Next
For $i = 0 To 1200
  $L0[$i] = GUICtrlCreateTreeViewItem("Level_0_" & $i, $Root[0])
Next
For $i = 0 To 1200
  $L1[$i] = GUICtrlCreateTreeViewItem("Level_1_" & $i, $Root[1])
Next
For $i = 0 To 1200
  $L2[$i] = GUICtrlCreateTreeViewItem("Level_2_" & $i, $Root[2])
Next
For $i = 0 To 1200
  $L3[$i] = GUICtrlCreateTreeViewItem("Level_3_" & $i, $Root[3])
Next
For $i = 0 To 1200
  $L4[$i] = GUICtrlCreateTreeViewItem("Level_4_" & $i, $Root[4])
Next
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Root[0] To $Root[4]
      GetItem()
    Case $L0[0] To $L0[1200]
      GetItem()
    Case $L1[0] To $L1[1200]
      GetItem()
    Case $L2[0] To $L2[1200]
      GetItem()
    Case $L3[0] To $L3[1200]
      GetItem()
    Case $L4[0] To $L4[1200]
      GetItem()
  EndSwitch
Until 0

Func GetItem()
  Local $Item = GUICtrlRead($Tree)
  ConsoleWrite("ItemID: " & $Item & ", " & ControlTreeView($GUI, "", $Tree, "GetSelected") & @CRLF)
EndFunc

firex [?]
сообщения отсылаемые элементом TreeView, на msdn все расписано
Можно ещё посмотреть в примере к функции
Код:
_GUICtrlTreeView_Create()
 
Верх