Что нового

[Элементы GUI] Более детальные события в режиме цикла опроса GUI

notconnected

Новичок
Сообщения
8
Репутация
0
Подскажите, пожалуйста, где посмотреть все возможные события для различных элементов GUI, на данный момент, например, интересует событие изменения поля edit, для вывода кол-ва символов в режиме реального времени. Проверка соответствия опрашиваемого объекта его айди срабатывает лишь при потере фокуса полем, но не при его изменении.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
качаешь справку отсюда http://autoit-script.ru/index.php?topic=10070.0
раздел Функции пользователей - WM Сообщения
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
notconnected,
Можно еще посмотреть в справке UDF - функции -> Gui* -> _GUICtrl*_Create. Во всех примерах (или почти во всех) есть обработчики соответствующих событий.
 
Автор
notconnected

notconnected

Новичок
Сообщения
8
Репутация
0
joiner сказал(а):
качаешь справку отсюда http://autoit-script.ru/index.php?topic=10070.0
раздел Функции пользователей - WM Сообщения
Справка есть, раздел нашел, но никак не пойму как это использовать, можно какой-то пример?
В моем случае, как я понимаю, подходит событие WM_NOTIFY, но в справке описана сама функция, нет примера использования.

Похоже, я просто не понимаю сам принцип работы... :(

Ниже привел часть кода, он не полный, вычистил все лишнее, просто для примера того, как я понял это нужно использовать.

Код:
GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )
GUISetState()

Do
	$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE

Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
	GUICtrlSetData($CTRL_LblText_count, StringLen (GUICtrlRead($CTRL_EdtText)) & " символов")
EndFunc


Но событие происходит только один раз в момент загрузки и все. Может быть я не в том месте регистрирую событие?
Если GUIRegisterMsg перенести в цикл опроса формы, то оно вообще не работает, в принципе логично, проще вызывать функцию WM_NOTIFY() прямо из цикла, без всяких регистраций, но тогда она будет запускаться сумасшедшее количество раз.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
notconnected [?]
интересует событие изменения поля edit, для вывода кол-ва символов в режиме реального времени
Код:
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$hGui = GUICreate('Edit', 200, 200)
$idEdit = GUICtrlCreateEdit('', 20, 40, 160, 120)
GUICtrlCreateLabel('Кол-во символов в Edit:', 20, 5, 130, 20)
$idLbl = GUICtrlCreateLabel(StringLen(GUICtrlRead($idEdit)), 150, 5, 30, 20)
$idDummy = GUICtrlCreateDummy()
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $idDummy
			GUICtrlSetData($idLbl, StringLen(GUICtrlRead($idEdit)))
	EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode

	$iIDFrom = BitAND($iwParam, 0xFFFF) ; _WinAPI_LoWord
	$iCode = BitShift($iwParam, 16) ; _WinAPI_HiWord
	Switch $hWnd
		Case $hGui
			Switch $iIDFrom
				Case $idEdit
					Switch $iCode
						Case $EN_CHANGE
							GUICtrlSendToDummy($idDummy)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
notconnected

notconnected

Новичок
Сообщения
8
Репутация
0
madmasles сказал(а):
notconnected [?]
интересует событие изменения поля edit, для вывода кол-ва символов в режиме реального времени
Код:
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$hGui = GUICreate('Edit', 200, 200)
$idEdit = GUICtrlCreateEdit('', 20, 40, 160, 120)
GUICtrlCreateLabel('Кол-во символов в Edit:', 20, 5, 130, 20)
$idLbl = GUICtrlCreateLabel(StringLen(GUICtrlRead($idEdit)), 150, 5, 30, 20)
$idDummy = GUICtrlCreateDummy()
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $idDummy
			GUICtrlSetData($idLbl, StringLen(GUICtrlRead($idEdit)))
	EndSwitch
WEnd

Func _WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode

	$iIDFrom = BitAND($iwParam, 0xFFFF) ; _WinAPI_LoWord
	$iCode = BitShift($iwParam, 16) ; _WinAPI_HiWord
	Switch $hWnd
		Case $hGui
			Switch $iIDFrom
				Case $idEdit
					Switch $iCode
						Case $EN_CHANGE
							GUICtrlSendToDummy($idDummy)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Спасибо, но как-то сложно получается решается примитивная задача...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
notconnected сказал(а):
Спасибо, но как-то сложно получается решается примитивная задача...
И в чем здесь примитивность?
 
Автор
notconnected

notconnected

Новичок
Сообщения
8
Репутация
0
Yashied сказал(а):
notconnected сказал(а):
Спасибо, но как-то сложно получается решается примитивная задача...
И в чем здесь примитивность?
Ну в других языках есть просто событие изменения поля и на него вешается команда, а тут приходится создавать пустышку и через опрос ее делать вывод.
И не совсем понятно почему работает именно с событием WM_COMMAND (Из справки: Сообщение выполняется при клике на элементах окна.)
А событие WM_NOTIFY (Из справки: Сообщение выполняется при взаимодействии с элементами окна.) не дает нужного результата. Т.е. нажатие клавиш = "клик по элементу окна", но != "взаимодействие с элементом"?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
notconnected, я вам рекомендую почитать MSDN на соответствующую тему. WM_COMMAND, это наследие Windows 3.x, и осталось только для совместимости для Button, Edit, Menu и Accelerator. WM_NOTIFY - новый вариант сообщения.
 
Верх