找回密码
 加入
搜索
查看: 5198|回复: 7

[GUI管理] 如何让消息响应多个控件(已解决)

  [复制链接]
发表于 2012-12-6 03:37:32 | 显示全部楼层 |阅读模式
本帖最后由 gzh888666 于 2012-12-6 04:30 编辑

最近学习WIN消息,下面的代码可以响应单个控件,我试了很多种方法无法响应多个控件,还是没有弄明白消息工作的原理,特来求助!
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <DateTimeConstants.au3>
#include <GUIConstantsEx.au3>
#include <Date.au3>
 
GUICreate("Form1", 400, 300)
$Date1 = GUICtrlCreateDate("", 100, 10, 91, 28)
$Date2 = GUICtrlCreateDate("", 100, 110, 91, 28)
$Date3 = GUICtrlCreateDate("", 100, 210, 91, 28)
$Button1 = GUICtrlCreateButton("E", 250, 100, 100, 30)
GUISetState()
 GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Button1
                        MsgBox(0, '', '相应键')
        EndSwitch
WEnd
 
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndDate1, $tInfo
        If Not IsHWnd($Date1) Then $hWndDate1 = GUICtrlGetHandle($Date1)
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hWndDate1 
                        Switch $iCode
                                Case $NM_KILLFOCUS ; 控件失去输入焦点
                           _Time($Date1)
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_NOTIFY

Func _Time($ID);定义时间比较函数
        $Time_Array = StringRegExp(GUICtrlRead($ID), "\d+", 3)
        $Time = $Time_Array[0] & "/" & $Time_Array[1] & "/" & $Time_Array[2]
        $iDateCalc = _DateDiff("D", $Time, _NowCalc())
        If $iDateCalc > 0 Then Return 1 ;如果控件时间小于现在时间返回1
        If $iDateCalc = 0 Then Return 0; 如果控件时间等于现在时间返回0
        If $iDateCalc < 0 Then 
                MsgBox(262144,"提示","选择日期不能超过当前日期,请重新输入!")
        GUICtrlSetData($ID,@YEAR&"年"&@MON&"月"&@MDAY&"日")
        GUICtrlSetState ($ID,$GUI_FOCUS)
        Return -1 ;如果控件时间大于现在时间返回-1
        EndIf 
EndFunc   ;==>_Time
发表于 2012-12-6 03:42:56 | 显示全部楼层
有id有句柄,判断这两个就行

评分

参与人数 1金钱 +80 贡献 +20 收起 理由
gzh888666 + 80 + 20

查看全部评分

 楼主| 发表于 2012-12-6 03:59:42 | 显示全部楼层
本帖最后由 gzh888666 于 2012-12-6 04:15 编辑

回复 2# 风行者
现在我在不同的TAB页中测试还是不成功!
我就是不知道怎么来判断多个,麻烦兄弟给个例子,谢谢了!
 楼主| 发表于 2012-12-6 04:08:07 | 显示全部楼层
本帖最后由 gzh888666 于 2012-12-6 04:17 编辑

现在我在不同的TAB页中测试还是不成功!
发表于 2012-12-6 04:17:16 | 显示全部楼层
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <DateTimeConstants.au3>
#include <GUIConstantsEx.au3>
#include <Date.au3>
 
GUICreate("Form1", 400, 300)
$Date1 = GUICtrlCreateDate("", 100, 10, 91, 28)
$Date2 = GUICtrlCreateDate("", 100, 110, 91, 28)
$Date3 = GUICtrlCreateDate("", 100, 210, 91, 28)
$Button1 = GUICtrlCreateButton("E", 250, 100, 100, 30)
GUISetState()
 GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Button1
                        MsgBox(0, '', '相应键')
        EndSwitch
WEnd
 
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndDate1, $tInfo
        If Not IsHWnd($Date1) Then $hWndDate1 = GUICtrlGetHandle($Date1)
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $iCode
                Case $NM_KILLFOCUS 
                        Switch $iIDFrom
                                                        Case $Date1 To $Date3 ; 控件失去输入焦点
                                                                        _Time($iIDFrom)
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_NOTIFY

Func _Time($ID);定义时间比较函数
        $Time_Array = StringRegExp(GUICtrlRead($ID), "\d+", 3)
        $Time = $Time_Array[0] & "/" & $Time_Array[1] & "/" & $Time_Array[2]
        $iDateCalc = _DateDiff("D", $Time, _NowCalc())
        If $iDateCalc > 0 Then Return 1 ;如果控件时间小于现在时间返回1
        If $iDateCalc = 0 Then Return 0; 如果控件时间等于现在时间返回0
        If $iDateCalc < 0 Then 
                MsgBox(262144,"提示","选择日期不能超过当前日期,请重新输入!")
        GUICtrlSetData($Date1,@YEAR&"年"&@MON&"月"&@MDAY&"日")
        GUICtrlSetState ($Date1,$GUI_FOCUS)
        Return -1 ;如果控件时间大于现在时间返回-1
        EndIf 
EndFunc   ;==>_Time
 楼主| 发表于 2012-12-6 04:20:25 | 显示全部楼层
本帖最后由 gzh888666 于 2012-12-6 04:24 编辑

回复 5# 风行者
OK了!谢谢!原来我_Time里写错了!已经改正!真是疏忽!
发表于 2012-12-6 04:21:40 | 显示全部楼层
tab页不是用这个消息吧
 楼主| 发表于 2012-12-6 04:25:05 | 显示全部楼层
回复 7# 风行者


    OK了!谢谢!原来我_Time里$id写错了!已经改正!真是疏忽!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-18 07:41 , Processed in 0.108628 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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