spkljl 发表于 2009-3-19 22:06:46

有没有办法可以使得回车后使焦点移动到下一个控件?

比如有两个INPUT控件A,B。焦点在A上,有没有办法使得回车后焦点移动到B上????

麻烦各位啦

akmm88 发表于 2009-3-20 01:23:20

对AU3的GUI一直都不喜欢.
在其它语言,可以在INPUT的KEYDOWN事件,判断输入 回车键 .

sanhen 发表于 2009-3-20 01:31:39

AU3的GUI事件用好一样很强大。一样可以判断楼主的问题。
用了SDK之后才觉得AU3的GUI原来是如此的方便和强大。哈。

sxd 发表于 2009-3-20 01:32:48

....汗 做个按钮 defbutton+hide

响应回车
然后做你想做的

akmm88 发表于 2009-3-20 02:18:12

原帖由 sanhen 于 2009-3-20 01:31 发表 http://www.autoitx.com/images/common/back.gif
AU3的GUI事件用好一样很强大。一样可以判断楼主的问题。
用了SDK之后才觉得AU3的GUI原来是如此的方便和强大。哈。

什么SDK, 谁提供的SDK?

象楼主说的问题,难道自己去处理 WM_KEYDOWN 消息,这样很烦琐,很不方便.

akmm88 发表于 2009-3-20 02:21:54

原帖由 sxd 于 2009-3-20 01:32 发表 http://www.autoitx.com/images/common/back.gif
....汗 做个按钮 defbutton+hide

响应回车
然后做你想做的

这个不是根本.想想看,
我们做一个登陆框, 例如象QQ的.
输玩QQ号按回车,要判断QQ号是否正确,然后把焦点给下一个输入框, 继续输入 按回车还得判断 是否输入密码.
如果是注册程序,可能有N个输入框.

sanhen 发表于 2009-3-20 02:27:41

原帖由 akmm88 于 2009-3-20 02:18 发表 http://www.autoitx.com/images/common/back.gif


什么SDK, 谁提供的SDK?

象楼主说的问题,难道自己去处理 WM_KEYDOWN 消息,这样很烦琐,很不方便.


我说的是用其他语言时用MS提供的SDK来控制GUI,感觉非常之烦琐和复杂。没有AU3来得简单。

sanhen 发表于 2009-3-20 02:28:59

不过楼主的问题可以参考一下我以前写的代码,当然这只是一个简单的演示。

砖是抛了,玉引不来没有关系。不要将砖头砸到我身上来就行了。


]http://www.autoitx.com/forum.php?mod=viewthread&tid=3779&extra=page%3D4

akmm88 发表于 2009-3-20 02:45:52

http://www.autoitx.com/forum.php?mod=viewthread&tid=3779&extra=page%3D4

这个是不错,还真让我说中了,自己注册消息. 很不方便啊.
佩服你的耐力.

xrbenbeba 发表于 2009-3-20 08:28:18

原帖由 sanhen 于 2009-3-20 01:31 发表 http://www.autoitx.com/images/common/back.gif
AU3的GUI事件用好一样很强大。一样可以判断楼主的问题。
用了SDK之后才觉得AU3的GUI原来是如此的方便和强大。哈。

SDK我就忍了....做个破窗口注册窗体类,声明窗体再创建窗体,再回调函数,样式还要声明全了....
AU3相对来说是太方便了

spkljl 发表于 2009-3-20 08:31:19

谢谢楼上各位!!!我去看看SANHEN大大的帖子!!!

jale 发表于 2009-6-15 09:01:54

感觉管理员的程序实现不到楼主说的需求,我也试过一下,好像没用

jale 发表于 2009-6-15 09:20:01

一、通用GUI通知
使用通用GUI通知需要注册WM_NOTIFY消息,下面是全部的通用GUI通知的值及介绍:

Global Const $WM_NOTIFY = 0x004E ; //这是使用通用GUI通知时需要用到的消息ID
Global Const $NM_FIRST = 0 ; //无具体含义,只是方便赋值而已
Global Const $NM_LAST = (-99) ; //同上
Global Const $NM_OUTOFMEMORY = ($NM_FIRST - 1) ; //内存不足
Global Const $NM_CLICK = ($NM_FIRST - 2) ; //单击
Global Const $NM_DBLCLK = ($NM_FIRST - 3) ; //双击
Global Const $NM_RETURN = ($NM_FIRST - 4) ; //用户在输入框按下了ENTER键
Global Const $NM_RCLICK = ($NM_FIRST - 5) ; //右键单击
Global Const $NM_RDBLCLK = ($NM_FIRST - 6) ; //右键双击
Global Const $NM_SETFOCUS = ($NM_FIRST - 7) ; //获取焦点
Global Const $NM_KILLFOCUS = ($NM_FIRST - 8) ; //失去焦点
Global Const $NM_HOVER = ($NM_FIRST - 13) ; //鼠标移动到控件上
Global Const $NM_KEYDOWN = ($NM_FIRST - 15) ; //用户按键
Global Const $NM_RELEASEDCAPTURE = ($NM_FIRST - 16) ; //子控件被鼠标按住拖动到适当位置以后鼠标释放时子控件向父控件产发送的消息
Global Const $NM_SETCURSOR = ($NM_FIRST - 17) ; //鼠标样式改变
Global Const $NM_TOOLTIPSCREATED = ($NM_FIRST - 19) ; //控件创建了一个工具栏提示
Global Const $NM_THEMECHANGED = ($NM_FIRST-22) ; //系统主题变化
Global Const $NM_RDOWN = ($NM_FIRST - 21) ; //按下右键(不要求按在控件上)
Global Const $NM_LDOWN = ($NM_FIRST - 20) ; //按下左键(不要求按在控件上)

一个例子:
CODE: AutoIt#Include <GuiListView.au3>
$Form1 = GUICreate("AForm1", 452, 199, 177, 118)
$ListView1 = GUICtrlCreateListView("1|2|3", 10, 10, 431, 156)
$ListView1_0 = GUICtrlCreateListViewItem("1", $ListView1)
$ListView1_1 = GUICtrlCreateListViewItem("item2", $ListView1)
$ListView1_2 = GUICtrlCreateListViewItem("item3", $ListView1)
$ListView1_3 = GUICtrlCreateListViewItem("item4", $ListView1)
$ListView1_4 = GUICtrlCreateListViewItem("item5", $ListView1)
$dd = GUICtrlCreateInput("",10,179)
Global Const $WM_NOTIFY = 0x004E
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
GuiSetState()
Do
Until GUIGetMsg()=-3
Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    Const $NM_FIRST = 0
    Const $NM_CLICK = ($NM_FIRST - 2)
    Const $NM_HOVER = ($NM_FIRST - 13)
   
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam) ;NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
   
    If $event = $NM_CLICK Then
      GUICtrlSetData($dd,"鼠标选中:"&_GUICtrlListViewGetItemText($ListView1, _GUICtrlListViewGetSelectedIndices($ListView1)))
    EndIf
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
EndFunc
二、控件专用通知
你可以在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/wincontrols.asp 里找到一份控件列表,通过这个列表你可以找到每个控件的介绍页面,比如按钮控件的页面就是http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/buttons/buttons.asp。
在每个控件的页面下都有专门的Notifications项,用以介绍不同的控件通知。因为这类通知实在太多,我仅以Edit控件为例作一下介绍,其他控件的通知可以以此类推。
Edit控件的详细信息可以在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrols.asp 找到,下面是Edit控件所有通知的值和说明:

Global Const $EN_ALIGN_LTR_EC = 0x700 ; //文本排列顺序更变为从左到右
Global Const $EN_ALIGN_RTL_EC = 0x701; //文本排列顺序更变为从右到左
Global Const $EN_CHANGE = 0x300 ; //文本发生改变
Global Const $EN_ERRSPACE = 0x500 ; //内存不足
Global Const $EN_HSCROLL = 0x601 ; //用户点击横向滚动条
Global Const $EN_KILLFOCUS = 0x200 ; //失去焦点
Global Const $EN_MAXTEXT = 0x501 ; //文本已满
Global Const $EN_SETFOCUS = 0x100 ; //获取焦点
Global Const $EN_UPDATE = 0x400 ; //控件重绘
Global Const $EN_VSCROLL = 0x602 ; //用户点击纵向滚动条
一个例子:
CODE:
AutoItGuiCreate("MyGUI", 392, 66)
$Input_1 = GuiCtrlCreateInput("", 10, 20, 190, 30)
$Label_2 = GuiCtrlCreateLabel("", 220, 30, 130, 20)
Global Const $WM_COMMAND = 0x0111
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUISetState()
While 1
    $msg = GUIGetMsg()
    Select
      Case $msg = -3
            ExitLoop
      Case Else
            ;;;
    EndSelect
WEnd
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local Const $EN_CHANGE = 0x300
   
    Local $nNotifyCode = BitShift($wParam,16)
    Local $nID = BitAND($wParam,0xFFFF)
    Local $hCtrl = $lParam
    If $nNotifyCode = $EN_CHANGE Then GUICtrlSetData($Label_2,GUICtrlRead($Input_1))
EndFunc   ;==>MY_WM_COMMAND

jale 发表于 2009-6-15 09:20:30

这个代码我在GOOGLE找的,对楼主应该有帮助

jale 发表于 2009-6-15 11:23:43

这个问题希望有高手可以解决,我也试过,效果不太理想,我找到的用这个代码,不过对LISTVIEW才有用

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Constants.au3>

Global Const $VK_RETURN = 0x0D ;Enter key

$hGUI = GUICreate("Test GUI", 300, 200)

$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 10, 10, 280, 180)

For $i = 1 To 10
    _GUICtrlListView_AddItem($hListView, "Item " & $i)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

$wProcHandle = DllCallbackRegister("_WindowProc", "int", "hwnd;uint;wparam;lparam")
$wProcOld = _WinAPI_SetWindowLong($hListView, $GWL_WNDPROC, DllCallbackGetPtr($wProcHandle))

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_WinAPI_SetWindowLong($hListView, $GWL_WNDPROC, $wProcOld)
DllCallbackFree($wProcHandle)
GUIDelete($hGui)

Func _WindowProc($hWnd, $Msg, $wParam, $lParam)
    Switch $hWnd
      Case $hListView
            Switch $Msg
                Case $WM_GETDLGCODE
                  Switch $wParam
                        Case $VK_RETURN
                            ConsoleWrite(_GUICtrlListView_GetItemText($hListView, _
                                       _GUICtrlListView_GetSelectedIndices($hListView)) & @LF)
                            Return 0
                  EndSwitch
            EndSwitch
    EndSwitch
   
    Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $Msg, $wParam, $lParam)
EndFunc

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $hWndListView, $tNMHDR, $hWndFrom, $iCode
   
    $hWndListView = $hListView
    If Not IsHWnd($hWndListView) Then $hWndListView = GUICtrlGetHandle($hListView)
   
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
   
    Switch $hWndFrom
      Case $hWndListView
            Switch $iCode
                Case $NM_DBLCLK
                  ConsoleWrite("Double click!" & @LF)
            EndSwitch
    EndSwitch
   
    Return $GUI_RUNDEFMSG
EndFunc
页: [1] 2
查看完整版本: 有没有办法可以使得回车后使焦点移动到下一个控件?