smooth 发表于 2022-3-8 08:48:18

[已解决]用消息函数点击控件并禁用,为什么无法启用?

本帖最后由 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

lin6051 发表于 2022-3-8 09:23:46

_Kh()
里面 启用控件也触发了 消息呗

chzj589 发表于 2022-3-8 10:31:43


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:14:31

本帖最后由 smooth 于 2022-3-8 11:24 编辑

lin6051 发表于 2022-3-8 09:23
_Kh()
里面 启用控件也触发了 消息呗
既然触发了,那控件咋补能启用呢?

控件启用后,BitAND(GUICtrlGetState($Label), 128)返回值是0,不再是128,说明控件已经是启用状态了,但是不知道为啥,还是灰色的。

smooth 发表于 2022-3-8 11:14:58

chzj589 发表于 2022-3-8 10:31


你这个写法,有什么特殊目的么,我测试了,控件还是无法启用。

chzj589 发表于 2022-3-8 11:36:13

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


zghwelcome 发表于 2022-3-8 11:43:08

不知道意义何在

#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


afan 发表于 2022-3-8 12:34:12

禁用了还能点击那还叫禁用吗?矛盾一体。

风行者 发表于 2022-3-8 12:59:25

本帖最后由 风行者 于 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

smooth 发表于 2022-3-8 19:27:14

zghwelcome 发表于 2022-3-8 11:43
不知道意义何在
BitShift($wParam, 16) = $BN_CLICKED
这是精华所在,我就是没找到这个确定窗口消息来自于鼠标点击的方法。

smooth 发表于 2022-3-8 19:34:03

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,这样才能解决问题。

smooth 发表于 2022-3-8 19:36:18

风行者 发表于 2022-3-8 12:59
理解你想学习窗口消息,但是事件模式更简单,而且也没必要用定时(测试鼠标圈圈一直在转,效率不高)
测试版 ...

大佬,提示:
_TrMouseEnter($Label,"_red") ;移入
_TrMouseLeave($Label,"_blue") ;移出

未定义

风行者 发表于 2022-3-8 21:50:19

https://www.autoitx.com/thread-72819-1-2.html
页: [1]
查看完整版本: [已解决]用消息函数点击控件并禁用,为什么无法启用?