EN_CHANGE
Этот код определяет, что пользователь предпринял некоторые
действия, которые, возможно, изменили содержимое текста.
Он посылается после того, как Windows откорректировал
изображение (в отличие от кода EN_UPDATE). Родительское
окно получает этот код через сообщение WM_COMMAND блока
управления.
*источник*EN_UPDATE
Этот код показывает, что редактируемый блок управления
будет индицировать измененный текст. Родительское окно
получает этот код через сообщение WM_COMMAND блока
управления. Родительское окно уведомляется после того, как
блок управления сформатировал текст, но перед тем, как
этот текст отобразится на экране. Это дает возможность,
если необходимо, изменить размер окна.
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $iW_Gui = 160, $iW_Input = 6
$hGui = GUICreate('test', $iW_Gui, 100)
$nInput = GUICtrlCreateInput("", $iW_Gui / 2 - $iW_Input / 2, 10, $iW_Input)
GUICtrlSetLimit(-1, 24)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
Local $nNotifyCode, $nID, $iLen, _
$iStep = 6 ; - под мое разрешение экрана.
$nNotifyCode = BitShift($iwParam, 16)
$nID = BitAND($iwParam, 0xFFFF)
;If $nNotifyCode = $EN_CHANGE Then
If $nNotifyCode = $EN_UPDATE Then
If Not StringIsDigit(GUICtrlRead($nID)) Then
GUICtrlSetData($nID, StringRegExpReplace(GUICtrlRead($nID), '[^0-9]', ''))
EndIf
$iLen = StringLen(GUICtrlRead($nID))
$iW_Input = $iStep * ($iLen + 1)
GUICtrlSetPos($nID, $iW_Gui / 2 - $iW_Input / 2, 10, $iW_Input)
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
madmasles сказал(а):$EN_UPDATE работает корректнее, чем с $EN_CHANGE...
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $sCode, $i = 0
$hGui = GUICreate('test', 200, 100)
$nInput = GUICtrlCreateInput('', 50, 10, 100)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
Local $nNotifyCode, $nID, $sText
$nNotifyCode = BitShift($iwParam, 16)
$nID = BitAND($iwParam, 0xFFFF)
$i += 1
If $nNotifyCode = $EN_UPDATE Then
$sText = '№ ' & $i & ': ' & 'EN_UPDATE(' & $nNotifyCode & ')' & @CRLF & _
GUICtrlRead($nID) & @CRLF
ElseIf $nNotifyCode = $EN_CHANGE Then
$sText = '№ ' & $i & ': ' & 'EN_CHANGE(' & $nNotifyCode & ')' & @CRLF & _
GUICtrlRead($nID) & @CRLF & '------------' & @CRLF
Else
$sText = $nNotifyCode & @CRLF
EndIf
$sCode &= $sText
ToolTip($sCode, 0, 0)
If Not Mod($i, 10) Then
$sCode = ''
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
но первое приходит тогда, когда измененный текст еще не отобразился в Edit/Input (но уже присутствует в буфере, т.е. GUICtrlRead() может его прочесть), а второй, тогда, когда измененый текст уже виден
gregaz сказал(а):И похоже это можно решить с помощью комбинации обработки этих сообщений.
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
Global $Prev
$hForm = GUICreate('MyGUI', 400, 400)
$Input1 = GUICtrlCreateInput('', 20, 20, 360, 19)
$Input2 = GUICtrlCreateInput('', 20, 50, 360, 19)
$Input3 = GUICtrlCreateInput('', 20, 80, 360, 19)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()
Do
Until GUIGetMsg() = -3
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $ID = BitAND($wParam, 0xFFFF)
Switch $hWnd
Case $hForm
Switch BitShift($wParam, 16)
Case $EN_CHANGE
Switch $ID
Case $Input1
ConsoleWrite('(Input1): ')
Case $Input2
ConsoleWrite('(Input2): ')
Case $Input3
ConsoleWrite('(Input3): ')
Case Else
Return $GUI_RUNDEFMSG
EndSwitch
$Data = GUICtrlRead($ID)
ConsoleWrite('"' & $Prev & '" => "' & $Data & '"' & @CR)
$Prev = $Data
Case $EN_SETFOCUS
$Prev = GUICtrlRead($ID)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
BitAND($wParam, 0xFFFF)
BitShift($wParam, 16)
Switch $hWnd
Case $hForm
...
EndSwitch
Для снятия последних вопросов по теме :Все это справедливо не только для Edit/Input, а для всего сообщения WM_COMMAND
gregaz сказал(а):Когда может понадобиться использование этих соообщений?
gregaz сказал(а):Не вижу практического предпочтения применения того или другого?
;..............
Switch $iCode
Case $EN_CHANGE , $BN_CLICKED
ConsoleWrite($iIDFrom& @LF)
EndSwitch
;..............
gregaz сказал(а):...корректно ли совместное использование сообщений...
#Include <ButtonConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>
$hForm = GUICreate('MyGUI', 400, 400)
$Button = GUICtrlCreateButton('OK', 160, 365, 80, 25, $BS_NOTIFY)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
MsgBox(0, '', 'Button has been pressed!')
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $ID = BitAND($wParam, 0xFFFF), $Code = BitShift($wParam, 16)
Switch $hWnd
Case $hForm
Switch $ID
Case $Button
Switch $Code
Case $BN_CLICKED
Return 0
Case $BN_DOUBLECLICKED
_SendMessage($hWnd, $iMsg, _WinAPI_MakeLong($ID, $BN_CLICKED), $lParam)
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
$Prev = GUICtrlRead()
GUICtrlSetData()
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
Global $Prev[3] = ['', '', '']
$hForm = GUICreate('MyGUI', 400, 400)
$Input1 = GUICtrlCreateInput('', 20, 20, 360, 19)
$Input2 = GUICtrlCreateInput('', 20, 50, 360, 19)
$Input3 = GUICtrlCreateInput('', 20, 80, 360, 19)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()
Do
Until GUIGetMsg() = -3
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $ID = BitAND($wParam, 0xFFFF), $Code = BitShift($wParam, 16)
Local $Index
Switch $hWnd
Case $hForm
Switch BitShift($wParam, 16)
Case $EN_CHANGE
Switch $ID
Case $Input1
ConsoleWrite('(Input1): ')
$Index = 0
Case $Input2
ConsoleWrite('(Input2): ')
$Index = 1
Case $Input3
ConsoleWrite('(Input3): ')
$Index = 2
Case Else
Return $GUI_RUNDEFMSG
EndSwitch
$Data = GUICtrlRead($ID)
ConsoleWrite('"' & $Prev[$Index] & '" => "' & $Data & '"' & @CR)
$Prev[$Index] = $Data
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
$hGUI = GUICreate ('Test', 250, 350)
$hEdit = GUICtrlCreateInput ("", 5, 10, 240, 25)
$hLabel = GUICtrlCreateLabel ("", 100, 320, 140, 25, 0x1000)
GUISetState (@SW_SHOW, $hGUI)
GUIRegisterMsg ($WM_COMMAND, "WM_COMMAND")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _rewrite()
GUICtrlSetData($hLabel, GUICtrlRead ($hEdit))
MsgBox (0,0, GUICtrlRead ($hEdit))
EndFunc ;==>_Change
Func WM_COMMAND($hWnd, $imsg, $wParam, $ilParam)
;Local $hWndFrom = $ilParam ; ID window (GUI)
;Local $iIDFrom = BitAND ($wParam, 0xFFFF) ; ID input (handle)
Local $iCode = BitShift ($wParam, 16) ; string (value
Switch $iCode
Case $EN_CHANGE
_rewrite ()
EndSwitch
#cs
Switch $hWnd
Case $hForm
Switch $iIDFrom
Case $hEdit
Switch $iCode
Case $EN_CHANGE
_Change()
EndSwitch
EndSwitch
EndSwitch
#ce
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND