Что нового

[Элементы GUI] Элемент GUI как строка поиска Google

strannik

Новичок
Сообщения
1
Репутация
0
Можно ли сделать такой элемент GUI как строка поиска в Google, т.е. когда вводишь текст в выпадающем меню под GUICtrlCreateEdit появляется варианты ввода, которые берутся из массива.
Пробовал сделать самостоятельно - в качестве текста ввода - GUICtrlCreateEdit, в качестве выпадающего списка - GUICtrlCreateList, поиск осуществлялся через StringInStr, но в этом случае две проблемы при обновлении текста в GUICtrlCreateEdit:
- список GUICtrlCreateList мерцал. Ставил обновление через sleep(1), что, кстати, не всегда помогает определить искомый текст
- в GUICtrlCreateList появлялись все значения

Народ, помогите справиться. Может быть как-то можно сделать это проще через ComboBox? :blink:
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
http://autoit-script.ru/index.php/topic,13743.msg87086.html#msg87086
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
strannik

Откуда-то с офф форума:

Код:
#include <WinAPI.au3>
#include <GuiEdit.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $hEdit, $hList = 0, $tRECT, $iHeight
Global $aValid[11] = ['Bruce Wayne', 'Bruce Banner', 'Brian Damage', 'Peter Parker', 'Polly Pocket', 'Hugh Janus', 'Zachary Quack', 'Zebedee', 'Billy Hunt', 'Jackson Pollock', 'Clark Kent']

_Main()

Exit

Func _Main()
	Local $hGUI = GUICreate('Daisywheel Combo', 512, 212)
	$hEdit = GUICtrlCreateInput('', 8, 8, 496)
	$hList = GUICtrlCreateList('', 8, 32, 496, 24, $LBS_SORT + $WS_VSCROLL)
	GUICtrlSetOnEvent($hList, '_OnListClick')
	GUICtrlSetState($hList, $GUI_HIDE)
	GUISetState()

	$tRECT = _WinAPI_GetWindowRect(GUICtrlGetHandle($hEdit))
	$iHeight = DllStructGetData($tRECT, 'Bottom') - DllStructGetData($tRECT, 'Top')

	GUIRegisterMsg($WM_COMMAND, '_OnMessage')

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUIDelete()
EndFunc   ;==>_Main

Func _OnMessage($hWnd, $iMsg, $wParam, $lParam)
	Local $hWndFrom = $lParam, $iIDFrom = _WinAPI_LoWord($wParam), $iCode = _WinAPI_HiWord($wParam)
	Switch $iMsg
		Case $WM_COMMAND
			Switch $hWndFrom
				Case GUICtrlGetHandle($hEdit)
					Switch $iCode
						Case $EN_CHANGE
							_ShowList()
					EndSwitch
				Case GUICtrlGetHandle($hList)
					Switch $iCode
						Case $LBN_SELCHANGE
							_OnListClick()
						Case $LBN_DBLCLK, $LBN_KILLFOCUS
							GUICtrlSetState($hList, $GUI_HIDE)
							If $iCode = $LBN_DBLCLK Then GUICtrlSetState($hEdit, $GUI_FOCUS)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_OnMessage

Func _ShowList()
	Local $sText = GUICtrlRead($hEdit), $i, $j = 0, $sContents = ''
	If $sText <> '' Then
		For $i = 0 To UBound($aValid) - 1
			If StringRegExp($aValid[$i], '(?i)^' & $sText & '.*') Then
				$sContents &= '|' & $aValid[$i]
				$j += 1
			EndIf
		Next
	EndIf
	If $sContents <> '' Then
		ConsoleWrite($j & ' ' & $iHeight * $j & @CRLF)
		GUICtrlSetPos($hList, 8, 8 + $iHeight, 496, $iHeight * $j)
		GUICtrlSetData($hList, $sContents)
		GUICtrlSetState($hList, $GUI_SHOW)
	Else
		GUICtrlSetState($hList, $GUI_HIDE)
	EndIf
EndFunc   ;==>_ShowList

Func _OnListClick()
	ConsoleWrite(GUICtrlRead($hList) & @CRLF)
	GUICtrlSetData($hEdit, GUICtrlRead($hList))
EndFunc   ;==>_OnListClick
 
Верх