Здравствуйте.
Пытаюсь нарисовать GUI с поиском по типу как у Google (т.е. с автодополнением и выпадающими подсказками наиболее часто встречающихся запросов)
Вот что написал:
Как должно работать - если List имеет статус $GUI_SHOW, то Listview должен быть спрятан. И наоборот. При клике на строку в List, ее содержимое должно подставляться в Input и вызываться функция _Tab0Search . Так и происходит при первой попытке поиска. Однако при втором и последующих поисках ничего в List невозможно кликнуть. Вот это и не могу победить.
Combobox, пожалуйста, не советуйте. С ним свои проблемы. Вчера целый день убил на то, чтобы добиться чего хочу. Хотя полагал, что сделаю за 15 минут.
Спасибо
Пытаюсь нарисовать 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 минут.
Спасибо