找回密码
 加入
搜索
查看: 8085|回复: 16

[GUI管理] 关于文本控件获取焦点即全选中的BUG【已解决】

  [复制链接]
发表于 2011-1-30 16:40:46 | 显示全部楼层 |阅读模式
本帖最后由 xyold1 于 2011-1-30 18:52 编辑

下面的代码是在A版的写的一段代码上改的,不过改出BUG来了,晕

表现为,点Input1 ,使内部文本全选,再激活其它窗口,然后再点击Input2 ,这时窗口就会假死,是哪里出问题了呢?

Opt('GUIOnEventMode', 1)

GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')

$Input1 = GUICtrlCreateInput('这个点击即全选', 50, 50, 200, 20)
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)

GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')

While 1
        Sleep(100)
WEnd

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg
        If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
 If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
EndFunc   ;==>WM_COMMAND
发表于 2011-1-30 17:00:03 | 显示全部楼层
顶下,看看楼下的回答
 楼主| 发表于 2011-1-30 17:07:17 | 显示全部楼层
上面的情况不停地判断两个文本控件的状态,并使其全选,下面是Debug_Mode模下的输出代码,对Windows消息不太了解,请高手指点

WEnd
0016: 0-0:         Sleep(100)
0017: 0-0: WEnd
0016: 0-0:         Sleep(100)
0017: 0-0: WEnd
0016: 0-0:         Sleep(100)
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
0024: 0-0:         #forceref $hWnd, $iMsg
0025: 0-0:         If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input1, 256)
0026: 0-0:                  If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then GUICtrlSetState($Input2, 256)
0027: 0-0: EndFunc   ;==>WM_COMMAND
发表于 2011-1-30 17:49:49 | 显示全部楼层
这根本不是BUG。不明白为何要这样写,wparam的高位已经是EN_SETFOCUS,说明编辑框已经接收到焦点了,为何还要用GUICtrlSetState(..., $GUI_FOCUS)重新设置一下呢?这样写不会引发递归错误吗?~
 楼主| 发表于 2011-1-30 17:59:35 | 显示全部楼层
回复 4# pusofalse

抄的A版的,没经过大脑,
 楼主| 发表于 2011-1-30 18:00:33 | 显示全部楼层
下面是我的解决方法,用的鼠标判断,没有上面的错误

Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>

$Input1 = GUICtrlCreateInput('这个点击即全选', 50, 50, 200, 20)
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
;GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)

GUISetState()
;~ GUIRegisterMsg(0x0111, 'WM_COMMAND')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")

While 1
        Sleep(100)
WEnd
Func SpecialEvents()
 $a = GUIGetCursorInfo()
 If Not @error And $a<>0 Then
GUICtrlSetState($a[4], 256)
EndIf

EndFunc

Func _Exit()
        Exit
EndFunc   ;==>_Exit
 楼主| 发表于 2011-1-30 18:51:00 | 显示全部楼层
上面这个方法不怎么好,如果用的是Edit控件那么可以用_GUICtrlEdit_SetSel($Input1, 0, -1)来全选。
而Input框不行
发表于 2011-1-30 18:56:05 | 显示全部楼层
回复 7# xyold1


    Edit和Input不都是一种控件吗~? - -|||
 楼主| 发表于 2011-1-30 19:00:48 | 显示全部楼层
本帖最后由 xyold1 于 2011-1-30 19:02 编辑

回复 8# pusofalse
刚才试了,_GUICtrlEdit_SetSel只识别编辑框 ,对输入框 无作用,我的程序里全是输入框 ,要改成编辑框的话,太麻烦了

我也不明白,同属于Edit类,差距怎么就这么大呢
发表于 2011-1-30 19:05:42 | 显示全部楼层
回复 9# xyold1


    把你的测试代码贴上来。
 楼主| 发表于 2011-1-30 19:10:18 | 显示全部楼层
回复 10# pusofalse

P版看看哪里错了
Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)

GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
;~ GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")

While 1
        Sleep(100)
WEnd
Func SpecialEvents()
 $a = GUIGetCursorInfo()
 If Not @error And $a<>0 Then
GUICtrlSetState($a[4], 256)
EndIf

EndFunc

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg
        If $ilParam = $hInput1 And BitShift($iwParam, 16) = 256 Then 
                _GUICtrlEdit_SetSel($Input1, 0, -1)
                
                EndIf
;~                 GUICtrlSetState($Input1, 256)
                 If $ilParam = $hInput2 And BitShift($iwParam, 16) = 256 Then 
                 _GUICtrlEdit_SetSel($Input2, 0, -1)
                 EndIf
EndFunc   ;==>WM_COMMAND
发表于 2011-1-30 19:41:27 | 显示全部楼层
改成edit控件,也不麻烦啊

#include <EditConstants.au3>
Opt('GUIOnEventMode', 1)
 
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
 
$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,$GUI_SS_DEFAULT_INPUT)
$Input2 = GUICtrlCreateEdit('这个点击即全选', 50, 110, 200, 20,$GUI_SS_DEFAULT_INPUT)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)
 
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
 
While 1
        Sleep(100)
WEnd
 
Func _Exit()
        Exit
EndFunc   ;==>_Exit
 
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        $nNotifyCode = BitShift($iwParam, 16)
        $nID = BitAND($iwParam, 0x000FFFF)
 Switch $nID
        Case $Input1
                If $nNotifyCode = 256 Then _
                GUICtrlSendMsg($Input1,0x00b1,0,7)
        Case $Input2
                If $nNotifyCode = 256 Then _
                GUICtrlSendMsg($Input2,0x00b1,0,7)
EndSwitch
EndFunc   ;==>WM_COMMAND

评分

参与人数 1金钱 +10 收起 理由
xyold1 + 10

查看全部评分

 楼主| 发表于 2011-1-30 20:28:28 | 显示全部楼层
回复 12# 风行者

谢谢风行者
 楼主| 发表于 2011-1-31 08:25:06 | 显示全部楼层
又修改了一下,这下算是完美了



Opt('GUIOnEventMode', 1)
#AutoIt3Wrapper_Run_Debug_Mode=Y
GUICreate('窗口')
GUISetOnEvent(-3, '_Exit')
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

$Input1 = GUICtrlCreateEdit('这个点击即全选', 50, 50, 200, 20,BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hInput1 = GUICtrlGetHandle(-1)
$Input2 = GUICtrlCreateInput('这个点击即全选', 50, 110, 200, 20)
$hInput2 = GUICtrlGetHandle(-1)
GUICtrlCreateInput('这个不会全选,点哪是哪', 50, 80, 200, 20)

GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
;~ GUISetOnEvent($GUI_EVENT_PRIMARYUP, "SpecialEvents")

While 1
        Sleep(100)
WEnd
Func SpecialEvents()
 $a = GUIGetCursorInfo()
 If Not @error And $a<>0 Then
GUICtrlSetState($a[4], 256)
EndIf

EndFunc

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        $a = GUIGetCursorInfo()
 If Not @error And $a<>0 Then
GUICtrlSetState($a[4], 256)
      
EndFunc   ;==>WM_COMMAND
发表于 2011-1-31 11:37:45 | 显示全部楼层
少了个endif
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-11 17:12 , Processed in 0.082676 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表