[已解决]用消息函数点击控件并禁用,为什么无法启用?
本帖最后由 smooth 于 2022-3-12 23:12 编辑请教各位大佬,为什么用消息函数点击控件并禁用,为什么无法启用?谢谢!
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("", 400, 400)
Global $Label =GUICtrlCreateLabel("Test Hide/Show", 50, 80, 100, 26)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg(0x0111, "WM_COMMAND")
AdlibRegister("_Kh", 50)
While 1
Sleep(10)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0xFFFF)
If $iIDFrom = $Label Then
GUICtrlSetState($Label, 128)
EndIf
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_COMMAND
Func _Kh()
;~ToolTip("BitAND(GUICtrlGetState($Label), 128):" & BitAND(GUICtrlGetState($Label), 128), 600, 400)
If BitAND(GUICtrlGetState($Label), 128) Then
GUICtrlSetState($Label, 64) ;启用控件。
EndIf
Local Static $kh = 0
$info = GUIGetCursorInfo($hGui)
If $info = $Label And $kh = 0 Then
GUICtrlSetFont($Label, 9, 400, 4, "宋体")
GUICtrlSetColor($Label, 0xFF0000) ;红色
$kh = 1
ElseIf $info <> $Label And $kh = 1 Then
GUICtrlSetFont($Label, 9, 400, 0, "宋体")
GUICtrlSetColor($Label, 0x0000FF) ;蓝色
$kh = 0
EndIf
EndFunc ;==>_Kh
Func _Exit()
Exit
EndFunc
_Kh()
里面 启用控件也触发了 消息呗
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom, $iIDFrom, $iCode, $iIDFrom1
Switch BitAND(0xffff, $wParam)
Case $Label
GUICtrlSetState($Label, 128)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
本帖最后由 smooth 于 2022-3-8 11:24 编辑
lin6051 发表于 2022-3-8 09:23
_Kh()
里面 启用控件也触发了 消息呗
既然触发了,那控件咋补能启用呢?
控件启用后,BitAND(GUICtrlGetState($Label), 128)返回值是0,不再是128,说明控件已经是启用状态了,但是不知道为啥,还是灰色的。
chzj589 发表于 2022-3-8 10:31
你这个写法,有什么特殊目的么,我测试了,控件还是无法启用。 smooth 发表于 2022-3-8 11:14
你这个写法,有什么特殊目的么,我测试了,控件还是无法启用。
哦,我只注意消息函数,没注意控件启用。点击控件后控件转换为灰色就不能操作了。只能再建一个控件
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("", 400, 400)
Global $Label = GUICtrlCreateLabel("Test Show", 50, 110, 100, 26)
Global $Labe2 = GUICtrlCreateLabel("Test Hide", 50, 110, 100, 26);"Test Hide/Show", 50, 110, 100, 26)
GUICtrlSetState($Labe2, 32)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg(0x0111, "WM_COMMAND")
;AdlibRegister("_Kh", 50)
While 1
Sleep(10)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom, $iIDFrom, $iCode, $iIDFrom1
Switch BitAND(0xffff, $wParam)
Case $Label
GUICtrlSetState($Label, 32)
GUICtrlSetState($Labe2, 16)
GUICtrlSetFont($Labe2, 9, 400, 0, "宋体")
GUICtrlSetColor($Labe2, 0x0000FF) ;蓝色
Case $Labe2
GUICtrlSetState($Labe2, 32)
GUICtrlSetState($Label, 16)
GUICtrlSetFont($Label, 11, 400, 4, "宋体")
GUICtrlSetColor($Label, 0xFF0000) ;红色
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
不知道意义何在
#include <ButtonConstants.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("", 400, 400)
Global $Label = GUICtrlCreateLabel("Test Hide/Show", 50, 80, 150, 26)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg(0x0111, "WM_COMMAND")
AdlibRegister("_Kh", 2000)
While 1
Sleep(10)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0xFFFF)
If $iIDFrom = $Label And BitShift($wParam, 16) = $BN_CLICKED Then
GUICtrlSetState($Label, 128)
EndIf
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_COMMAND
Func _Kh()
;~ToolTip("BitAND(GUICtrlGetState($Label), 128):" & BitAND(GUICtrlGetState($Label), 128), 600, 400)
If BitAND(GUICtrlGetState($Label), 128) Then
GUICtrlSetState($Label, 64) ;启用控件。
EndIf
Local Static $kh = 0
$info = GUIGetCursorInfo($hGui)
If $info = $Label And $kh = 0 Then
GUICtrlSetFont($Label, 9, 400, 4, "宋体")
GUICtrlSetColor($Label, 0xFF0000) ;红色
$kh = 1
ElseIf $info <> $Label And $kh = 1 Then
GUICtrlSetFont($Label, 9, 400, 0, "宋体")
GUICtrlSetColor($Label, 0x0000FF) ;蓝色
$kh = 0
EndIf
EndFunc ;==>_Kh
Func _Exit()
Exit
EndFunc ;==>_Exit
禁用了还能点击那还叫禁用吗?矛盾一体。 本帖最后由 风行者 于 2022-3-8 13:02 编辑
理解你想学习窗口消息,但是事件模式更简单,而且也没必要用定时(测试鼠标圈圈一直在转,效率不高)
测试版本:3.3.15.4
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <tracker.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("", 400, 400)
Global $Label = GUICtrlCreateLabel("Test Hide/Show", 50, 80, 150, 26)
GUICtrlSetOnEvent($Label,"onClick")
GUISetState()
GUISetOnEvent(-3, "_Exit")
_TrMouseEnter($Label,"_red") ;移入
_TrMouseLeave($Label,"_blue") ;移出
While 1
If (GUICtrlGetState($Label)=144) Then
Sleep(1000) ;延迟用来看效果
GUICtrlSetState($Label,$GUI_ENABLE)
EndIf
Sleep(100)
WEnd
Func onClick()
GUICtrlSetState($Label,$GUI_DISABLE)
EndFunc
Func _red()
GUICtrlSetFont($Label, 9, 400, 4, "宋体")
GUICtrlSetColor($Label, 0xFF0000) ;红色
EndFunc
Func _blue()
GUICtrlSetFont($Label, 9, 400, 0, "宋体")
GUICtrlSetColor($Label, 0x0000FF) ;蓝色
EndFunc
Func _Exit()
Exit
EndFunc ;==>_Exit
zghwelcome 发表于 2022-3-8 11:43
不知道意义何在
BitShift($wParam, 16) = $BN_CLICKED
这是精华所在,我就是没找到这个确定窗口消息来自于鼠标点击的方法。 afan 发表于 2022-3-8 12:34
禁用了还能点击那还叫禁用吗?矛盾一体。
A大你理解有误,不是禁用了还能点击,而是启用了控件,但是还是显示是灰色的。我知道问题所在了,就是因为我的Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)函数里,只要检测到窗口消息等于那个控件的,然后就禁用,然后再用Adlibregister来检测,如果该控件处于禁用状态,则启用。问题就出在:Adlibregister函数里,启用该控件的命令,即GUICtrlSetState($Label, 64)启用该控件后,由于它也是窗口消息的一种,会被Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)检测到,然后又将该控件禁用掉,所以一直显示是灰色的。所以要在Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)函数里,区分该控件是鼠标点击产生的窗口消息,即:BitShift($wParam, 16) = $BN_CLICKED,这样才能解决问题。 风行者 发表于 2022-3-8 12:59
理解你想学习窗口消息,但是事件模式更简单,而且也没必要用定时(测试鼠标圈圈一直在转,效率不高)
测试版 ...
大佬,提示:
_TrMouseEnter($Label,"_red") ;移入
_TrMouseLeave($Label,"_blue") ;移出
未定义 https://www.autoitx.com/thread-72819-1-2.html
页:
[1]