Что нового

[Элементы GUI] Контрол поверх контрола

Latoid

Знающий
Сообщения
95
Репутация
11
Здравствуйте.
Пытаюсь нарисовать GUI с поиском по типу как у Google (т.е. с автодополнением и выпадающими подсказками наиболее часто встречающихся запросов)
Вот что написал:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <Misc.au3>
#include <GuiEdit.au3>
#include <GuiListBox.au3>
#include <GuiTab.au3>

Local $aAllHistory[9][2] = [["родина 5 сезон триллер", 1],["родина 5 сезон amedia триллер", 2],["родина 5 сезон amedia", 3],["родина 5 сезон", 4],["родина 5", 5],["родина", 6],["род", 7],["ро", 8],["рахманинов", 9]]

Global Const $Width = @DesktopWidth * 0.9
Global Const $Height = @DesktopHeight * 0.92

Global $Tab0SearchInputValue = "род"

Local $hMainWindow = GUICreate("", $Width, $Height, -1, -1, $WS_OVERLAPPEDWINDOW)
Local $hMainWindowTab = GUICtrlCreateTab(0.01 * $Width, 0.01 * $Height, 0.98 * $Width, 0.71 * $Height)
$hTab0 = GUICtrlCreateTabItem("Поиск")
Local $hTab0SearchInput = GUICtrlCreateInput($Tab0SearchInputValue, 0.02 * $Width, 0.14 * $Height, 0.425 * $Width, 0.03 * $Height)
Local $hTab0SearchList = GUICtrlCreateList ("", 0.02 * $Width, 0.17 * $Height, 0.425 * $Width, 0.2 * $Height, $WS_VSCROLL)
GUICtrlSetState($hTab0SearchList, $GUI_FOCUS)
GuiCtrlSetState($hTab0SearchList, $GUI_ONTOP)

Local $hTab0ListView = GUICtrlCreateListView("Название", 0.02 * $Width, 0.18 * $Height, 0.96 * $Width, 0.5 * $Height)
GUICtrlSetState ($hTab0ListView, $GUI_HIDE)
_GUICtrlListView_SetColumnWidth($hTab0ListView, 0, 0.9 * $Width)

Local $hTab0SearchButton = GUICtrlCreateButton("Поиск (Enter)", 0.86 * $Width, 0.115 * $Height, 0.12 * $Width, 0.066 * $Height)
GUICtrlCreateTabItem("")



$hTab1 = GUICtrlCreateTabItem("1")

GUICtrlCreateTabItem("")

$hUPListBox = GUICtrlCreateDummy()
$hDOWNListbox = GUICtrlCreateDummy()

Local $AccelKeys[2][2]=[["{UP}", $hUPListBox], ["{DOWN}", $hDOWNListbox]]
GUISetAccelerators($AccelKeys)
$iCurrIndexInListBox = -1
$EventFromWhileLoop = False

_CreateListContent ($Tab0SearchInputValue)

HotKeySet("{ENTER}", "_EnterPressed")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOW, $hMainWindow)

While 1
	$msg = GUIGetMsg()
	Switch $msg

		Case $GUI_EVENT_CLOSE
			Exit

		Case $hUPListBox
;~ 			ConsoleWrite ("UP" & @CRLF)
				$EventFromWhileLoop = True
				$iCurrIndexInListBox -= 1
				If $iCurrIndexInListBox < 0 Then $iCurrIndexInListBox = 0
				_GUICtrlListBox_SetCurSel($hTab0SearchList, $iCurrIndexInListBox)
				GUICtrlSetData ($hTab0SearchInput, GUICtrlRead ($hTab0SearchList))

		Case $hDOWNListbox
;~ 			ConsoleWrite ("DOWN" & @CRLF)
				$EventFromWhileLoop = True
				$iTotal = _GUICtrlListBox_GetCount($hTab0SearchList)
				$iCurrIndexInListBox += 1
				If $iCurrIndexInListBox > $iTotal - 1 Then $iCurrIndexInListBox = $iTotal - 1
				_GUICtrlListBox_SetCurSel($hTab0SearchList, $iCurrIndexInListBox)
				GUICtrlSetData ($hTab0SearchInput, GUICtrlRead ($hTab0SearchList))

		Case $hTab0SearchButton
			_Tab0Search ()

	EndSwitch
WEnd

Func _EnterPressed()
	If WinActive($hMainWindow) And _GUICtrlTab_GetCurSel($hMainWindowTab) = 0 Then
		_Tab0Search()
	Else
		HotKeySet("{ENTER}")
		Send("{ENTER}")
		HotKeySet("{ENTER}", "_EnterPressed")
	EndIf
EndFunc   ;==>_EnterPressed

Func _CreateListContent ($fTab0SearchInputValue)
		$iCurrIndexInListBox = -1
		$BackspaceIsPressed = _IsPressed ("08")
		$DelIsPressed = _IsPressed ("2E")
		GUICtrlSetData($hTab0SearchList, "")
		$iCharsNum = StringLen ($fTab0SearchInputValue)
		Local $aSelectedHistory[0][2]

		For $q = 0 To UBound ($aAllHistory) - 1
			If StringLeft ($aAllHistory[$q][0], $iCharsNum) = $fTab0SearchInputValue Then
				$iAddedRow = _ArrayAdd ($aSelectedHistory, $aAllHistory[$q][0])
				$aSelectedHistory[$iAddedRow][1] = $aAllHistory[$q][1]

			EndIf
		Next

		GUICtrlSetData($hTab0SearchList, _ArrayToString($aSelectedHistory, ";", -1, -1, "|", 0, 0))

		; Автодополнение
		If $fTab0SearchInputValue <> "" And $BackspaceIsPressed = False And $DelIsPressed = False Then
			$iIndexOfMostRecentValue = _ArrayMaxIndex ($aSelectedHistory, 1, -1, -1, 1)
			If $iIndexOfMostRecentValue <> -1 Then
				GUICtrlSetData ($hTab0SearchInput, $aSelectedHistory[$iIndexOfMostRecentValue][0])
				_GUICtrlEdit_SetSel ($hTab0SearchInput, StringLen ($fTab0SearchInputValue), StringLen ($aSelectedHistory[$iIndexOfMostRecentValue][0]))
			EndIf
		EndIf
EndFunc ; _CreateListContent

Func WM_COMMAND($hWnd, $iMsg, $iWparam, $iLparam)
	$hWndTab0SearchInput = $hTab0SearchInput
	If Not IsHWnd($hTab0SearchInput) Then $hWndTab0SearchInput = GUICtrlGetHandle($hTab0SearchInput)

	$hWndTab0SearchList = $hTab0SearchList
	If Not IsHWnd($hTab0SearchList) Then $hWndTab0SearchList = GUICtrlGetHandle($hTab0SearchList)

	$nNotifyCode = BitShift($iWparam, 16)
	$nID = BitAND($iWparam, 0x0000FFFF)
	$hWndFrom = $iLparam
	$iIDFrom = BitAND($iWparam, 0xFFFF)
	$iCode = BitShift($iWparam, 16)

	Switch $hWndFrom
		Case $hWndTab0SearchInput
			Switch $iCode
				Case $EN_UPDATE
					ConsoleWrite ("update in input" & @CRLF)
					If GUICtrlGetState ($hTab0SearchList) = 96 Then
						GUICtrlSetState ($hTab0SearchList, $GUI_SHOW)
						GuiCtrlSetState($hTab0SearchList, $GUI_ONTOP)
						GUICtrlSetState ($hTab0ListView, $GUI_HIDE)
					EndIf
					If $EventFromWhileLoop = False Then
						_CreateListContent (GUICtrlRead ($hTab0SearchInput))
					Else
						$EventFromWhileLoop = False
					EndIf
				Case $EN_SETFOCUS
					ConsoleWrite ("input set focus" & @CRLF)
					If GUICtrlGetState ($hTab0SearchList) = 96 Then
						GUICtrlSetState ($hTab0SearchList, $GUI_SHOW)
						GUICtrlSetState ($hTab0SearchList, $GUI_ONTOP)
						GUICtrlSetState ($hTab0ListView, $GUI_HIDE)
					EndIf

				Case $EN_KILLFOCUS
					ConsoleWrite ("input lost focus" & @CRLF)
					If GUICtrlGetState ($hTab0SearchList) = 80 Then
						GUICtrlSetState ($hTab0SearchList, $GUI_HIDE)
						GUICtrlSetState ($hTab0ListView, $GUI_SHOW)
					EndIf
			EndSwitch

		Case $hWndTab0SearchList
			Switch $iCode
				Case $LBN_SELCHANGE
					ConsoleWrite ("$LBN_SELCHANGE" & @CRLF)
					GUICtrlSetData ($hTab0SearchInput, GUICtrlRead ($hTab0SearchList))
					_Tab0Search ()

				Case $LBN_KILLFOCUS
					ConsoleWrite ("List lost focus" & @CRLF)

				Case $LBN_SETFOCUS
					ConsoleWrite ("List set focus" & @CRLF)

			EndSwitch


	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _Tab0Search ()
	ConsoleWrite ("_Tab0Search" & @CRLF)
	GUICtrlSetState ($hTab0SearchList, $GUI_HIDE)
	GUICtrlSetState ($hTab0ListView, $GUI_SHOW)
	$Tab0SearchInputValue = StringStripWS(GUICtrlRead($hTab0SearchInput), 1 + 2 + 4)

	_GUICtrlListView_DeleteAllItems($hTab0ListView)
	For $i = 0 To UBound ($aAllHistory) -1
		If StringInStr ($aAllHistory[$i][0], $Tab0SearchInputValue) Then
			_GUICtrlListView_AddItem ($hTab0ListView, $aAllHistory[$i][0])
		EndIf
	Next
EndFunc ; _Tab0Search


Как должно работать - если List имеет статус $GUI_SHOW, то Listview должен быть спрятан. И наоборот. При клике на строку в List, ее содержимое должно подставляться в Input и вызываться функция _Tab0Search . Так и происходит при первой попытке поиска. Однако при втором и последующих поисках ничего в List невозможно кликнуть. Вот это и не могу победить.

Combobox, пожалуйста, не советуйте. С ним свои проблемы. Вчера целый день убил на то, чтобы добиться чего хочу. Хотя полагал, что сделаю за 15 минут.
Спасибо
 
Верх