【已解决】Input无输入响应回车
本帖最后由 koflion 于 2011-9-18 14:08 编辑如果用GUICtrlSetOnEvent注册,输入框只能响应变动过数据的操作,想使用GUIRegisterMsg 获取回车操作然后判断焦点应该可以实现。。,就是不知道该咋写,希望知道的朋友们提个醒。。。谢谢了、、
目的:无论$Input是否输入了信息,按下回车后Button控件获得焦点#include <GuiConstants.au3>
#include <EditConstants.au3>
Opt("GUIOnEventMode", 1)
Dim $Input
$GUI = GUICreate("测试", 140, 130)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUICtrlMsg")
$Input = GUICtrlCreateInput("", 10, 10, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NOHIDESEL, $ES_AUTOVSCROLL, $ES_WANTRETURN))
GUICtrlSetState(-1, $GUI_FOCUS)
GUICtrlSetFont(-1, 12, 200, 0, "宋体")
$Input = GUICtrlCreateInput("", 10, 50, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_AUTOVSCROLL, $ES_PASSWORD, $ES_WANTRETURN))
GUICtrlSetFont(-1, 12, 100, 0)
$Button = GUICtrlCreateButton("测试", 10, 90, 120, 30)
GUICtrlSetFont(-1, 16, 400, 0)
GUICtrlSetOnEvent($Button, "GUICtrlMsg")
GUICtrlSetOnEvent($Input, "GUICtrlMsg")
GUICtrlSetOnEvent($Input, "GUICtrlMsg")
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func GUICtrlMsg()
Switch @GUI_CtrlId;选择事件 ID 或 控件 ID
Case $GUI_EVENT_CLOSE;如果点下的是$GUI_EVENT_CLOSE(关闭)
Exit
Case $Input
GUICtrlSetState($Input, $GUI_FOCUS)
Case $Input
GUICtrlSetState($Button, $GUI_FOCUS)
Case $Button
MsgBox(0,"","1#输入框:"&GUICtrlRead($Input)&@LF&@LF&"2#输入框:"&GUICtrlRead($Input))
EndSwitch
EndFunc
#include <GuiConstants.au3>
#include <EditConstants.au3>
Opt("GUIOnEventMode", 1)
Dim $Input
$GUI = GUICreate("测试", 140, 130)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUICtrlMsg")
$Input = GUICtrlCreateInput("", 10, 10, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NOHIDESEL, $ES_AUTOVSCROLL, $ES_WANTRETURN))
GUICtrlSetState(-1, $GUI_FOCUS)
$iFOCUS = $Input
GUICtrlSetFont(-1, 12, 200, 0, "宋体")
$Input = GUICtrlCreateInput("", 10, 50, 120, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_AUTOVSCROLL, $ES_PASSWORD, $ES_WANTRETURN))
GUICtrlSetFont(-1, 12, 100, 0)
$Button = GUICtrlCreateButton("测试", 10, 90, 120, 30)
GUICtrlSetFont(-1, 16, 400, 0)
GUICtrlSetOnEvent(-1, "GUICtrlMsg")
GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0111, "MY_WM_COMMAND") ;$WM_COMMAND
While 1
Sleep(100)
WEnd
Func GUICtrlMsg()
Switch @GUI_CtrlId;选择事件 ID 或 控件 ID
Case $GUI_EVENT_CLOSE;如果点下的是$GUI_EVENT_CLOSE(关闭)
Exit
Case $Button
MsgBox(0, "", "1#输入框:" & GUICtrlRead($Input) & @LF & @LF & "2#输入框:" & GUICtrlRead($Input))
EndSwitch
EndFunc ;==>GUICtrlMsg
Func MY_WM_COMMAND($hWnd, $Msg, $wParam)
#forceref $hWnd, $iMsg
$nNotifyCode = BitShift($wParam, 16)
$nID = BitAND($wParam, 0x0000FFFF)
If $nID = 1 And $nNotifyCode = 0 Then
GUICtrlSetState($iFOCUS + 1, $GUI_FOCUS)
Return 0
Else
$iFOCUS = $nID
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
原来如此,使用WM_COMMAND (好囧。。帮助里面有。。就是英文的看起来好累,没理解清楚)
百度了下:
WM_COMMAND 当用户点击菜单、按钮、下拉列表框、快捷键等控件时候,会触发WM_COMMAND ,WM_COMMAND消息中有两个参数,wparam、lparam,定义如下:
wParam 高两个字节 通知码
wParam 低两字节 命令ID
lParam 发送命令消息的子窗体句柄。
如果这个消息是由子窗口控件产生,如button产生则: LOWORD(wParam): 控件ID HIWORD(wParam): 通知码 lParam: 子窗口句柄。 如果这个消息是由子窗口或者快捷键产生,则通知码为1,由菜单产生,通知码为0。通过参数,可以区分这个消息的来源是来自于控件,快捷键还是菜单。
测试中wParam 返回的数据格式为:0x00000000(十六位进制的8位数)
A大回复的代码中
$nNotifyCode = BitShift($wParam, 16) (通过右移运算获取高两个字节获取通知码,不过没明白为什么要移动16次,难道是因为是十六进制的??)
题外话:位移运算帮助中的Local $x = BitShift(14, 2)
;x == 3 因为 1110b 右移两次是 11b == 3 等于我这种没学习过人很难搞懂,最后明白了。。使用的是2进制换算,然后移位,大家别被那个b搞晕了。。我之前也觉得奇怪。。2进制的话不可能有b,16进制的话14是e啊。。倒
$nID = BitAND($wParam, 0x0000FFFF),按位或运算 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。(这个。。。这个。。太晕了。。不懂待学)
然后就是
If $nID = 1 And $nNotifyCode = 0 Then
呵呵。。明白了。。。非常感谢啊!!!!! 没搞懂做成4个input 就不行了 upupupupup 学习下,感谢,感谢 学习下,感谢,感谢
页:
[1]