找回密码
 加入
搜索
查看: 894|回复: 12

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

[复制链接]
发表于 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[4] = $Label And $kh = 0 Then 
  GUICtrlSetFont($Label, 9, 400, 4, "宋体")
  GUICtrlSetColor($Label, 0xFF0000) ;红色
  $kh = 1 
 ElseIf $info[4] <> $Label And $kh = 1 Then
  GUICtrlSetFont($Label, 9, 400, 0, "宋体")
  GUICtrlSetColor($Label, 0x0000FF) ;蓝色
  $kh = 0
 EndIf
EndFunc   ;==>_Kh
Func _Exit()
 Exit
EndFunc 

发表于 2022-3-8 09:23:46 | 显示全部楼层
_Kh()
里面 启用控件  也触发了 消息呗
发表于 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
 楼主| 发表于 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,说明控件已经是启用状态了,但是不知道为啥,还是灰色的。
 楼主| 发表于 2022-3-8 11:14:58 | 显示全部楼层

你这个写法,有什么特殊目的么,我测试了,控件还是无法启用。
发表于 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


发表于 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[4] = $Label And $kh = 0 Then
                GUICtrlSetFont($Label, 9, 400, 4, "宋体")
                GUICtrlSetColor($Label, 0xFF0000) ;红色
                $kh = 1
        ElseIf $info[4] <> $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 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

 楼主| 发表于 2022-3-8 19:27:14 | 显示全部楼层

BitShift($wParam, 16) = $BN_CLICKED
这是精华所在,我就是没找到这个确定窗口消息来自于鼠标点击的方法。
 楼主| 发表于 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,这样才能解决问题。
 楼主| 发表于 2022-3-8 19:36:18 | 显示全部楼层
风行者 发表于 2022-3-8 12:59
理解你想学习窗口消息,但是事件模式更简单,而且也没必要用定时(测试鼠标圈圈一直在转,效率不高)
测试版 ...

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

未定义
发表于 2022-3-8 21:50:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 15:21 , Processed in 0.079382 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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