Что нового

[Элементы GUI] Привязка события для элемента "Edit"

belovkirill

Новичок
Сообщения
23
Репутация
0
Здравствуйте. У меня возник вопрос по привязке функции к элементу пользовательского интерфейса Edit. Изначально я думал, что при нажатии в поле должна вызываться та функция, которая указана в "GUICtrlSetOnEvent()". И в том примере, который я указал, тогда при нажатии в поле - оно должно очиститься, появиться диалоговое окно и с данного элемента будет снята привязка функции. И еще дополнение. Если изменить Edit на Button - то функция срабатывает при нажатии, однако привязка "_StartEdit" к кнопке почему-то не снимается.
Код:
;включение констант
#include <GUIConstantsEx.au3>

;включение опции обработки событий
Opt("GUIOnEventMode", 1)

;создание окна и привязка функции выхода к кнопке закрытия
$hWin = GUICreate('окно')
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit', $hWin)

;функция выхода
Func _Exit()
   Exit
EndFunc

;создание поля
$hEdit = GUICtrlCreateEdit('текст', 10, 10)
;$hEdit = GUICtrlCreateButton('текст', 10, 10)

;привязка функции к полю: вот как раз здесь я и ожидал, что при нажатии в поле - будет удаляться текст, который там изначально
GUICtrlSetOnEvent($hEdit, '_StartEdit')

;функция, привязанная к полю для ввода
Func _StartEdit()
   GUICtrlSetData($hEdit, '')
   MsgBox(0, 1, '')
   GUICtrlSetOnEvent($hEdit, '')
EndFunc

;отображение окна
GUISetState(@SW_SHOW, $hWin)

;цикл ожидания
While True
   Sleep(500)
WEnd

Заранее спасибо!
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Может так по может?
Код:
While True
Switch GUIGetMsg ()
Case $GUI_EVENT_PRIMARYDOWN
$aInfo = GUIGetCursorInfo()
If $aInfo [4 ] = $hEdit Then
_StartEdit()
EndIf
EndSwitch
Wend
 
Автор
B

belovkirill

Новичок
Сообщения
23
Репутация
0
Да, спасибо, Ksaan! Это отчасти помогает, но не решает саму проблему. Мне стало интересно, почему не удается привязать событие к элементу Edit. И еще - я проверил и получение курсора срабатывает только в режиме опроса GUI. Если тоже самое проделать для режима срабатывания по событиям - то функция вызывается при наведении на поле, без нажатия.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Используйте WM_COMMAND (EN_SETFOCUS), на форуме полно примеров.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 575
Репутация
335
belovkirill [?]
Мне стало интересно, почему не удается привязать событие к элементу Edit
Потому что специфические события обрабатываются через WM_NOTIFY и WM_COMMAND, как сказал Yashied
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>


$hWin = GUICreate('окно')
$hEdit = GUICtrlCreateEdit('текст', 10, 10, 100, 100)
$hEditbt = GUICtrlCreateButton('текст', 110, 10)

;отображение окна
GUISetState(@SW_SHOW, $hWin)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $hEditbt
			MsgBox(0,0,"Кнопочка")
	EndSwitch
WEnd


Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = _WinAPI_LoWord($wParam)
	Local $hCtrl = $lParam

	Switch $nID
		Case $hEdit
			Switch $nNotifyCode
				Case $EN_SETFOCUS
					MsgBox(0,0,"Фокус получен")
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
A

Alofa

Гость
OffTopic:

Medic84 Прошу великодушно меня извинить, но раз уж так подвернулось... Вопрос для повышения общей образованности.
Уже несколько раз видел такое прменение "Switch"
Medic84 сказал(а):
Код:
...
	Switch $nID
		Case $hEdit
			Switch $nNotifyCode
				Case $EN_SETFOCUS
					MsgBox(0,0,"Фокус получен")
			EndSwitch
	EndSwitch
 ...
... вместо
Код:
If $nID = $hEdit And $nNotifyCode = $EN_SETFOCUS Then MsgBox(0,0,"Фокус получен")

Почему? Вероятно этому есть какое-то объяснение?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 575
Репутация
335
Alofa [?]
Почему? Вероятно этому есть какое-то объяснение?
Все очень просто. В данном конкретном случае - у нас есть всего 1 элемент, у которого мы опрашиваем его состояние (причем состояний у него тоже много разных, в примере приведен всего один). Если бы было элементов и состояний больше, использование связки If...Else...EndIf нелогично.

Пример:
Код:
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = _WinAPI_LoWord($wParam)
	Local $hCtrl = $lParam

	Switch $nID
		Case $hProgCombo
			Switch $nNotifyCode
				Case $CBN_SELCHANGE
					$bProgramms_Changed = True
			EndSwitch
		Case $hSelector_Combo
			Switch $nNotifyCode
				Case $CBN_SELCHANGE
					GUICtrlSetData($hChange_Button, 'Изменить "' & GUICtrlRead($hSelector_Combo) & '"')
			EndSwitch
		Case $hLastname_Input
			Switch $nNotifyCode
				Case $EN_CHANGE
					$bHumanInfo_Changed = True
			EndSwitch
		Case $hSearch_Input
			Switch $nNotifyCode
				Case $EN_CHANGE
					_FastSearch()
			EndSwitch
		Case $hGender_Combo
			Switch $nNotifyCode
				Case $CBN_SELCHANGE
					$bHumanInfo_Changed = True
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Верх