sdlyfjx 发表于 2013-12-29 22:24:48

【已解决】GUI事件模式(ONEVENT)下多窗口嵌套如何实现?

本帖最后由 sdlyfjx 于 2013-12-31 16:21 编辑

实在不知道该肿么描述这个问题的题目了。。。不知道这样说怎么样呢?问题详细是酱紫的:做了一个脚本,用的是ONEVENT模式然后各个按键对应的是各个函数(guictrlsetonevent)注册的
然后比如说按了button1进入了button1函数
想在button1函数内部继续弹出一个对话框,让用户选择时间,然后有个确定按钮,有个取消按钮。
如果说再为这两个按钮注册函数就太麻烦了 而且需要更多的GLOBAL变量不知道有没有别的方法呢?   为什么@gui_ctrlid不管用呢?

正确的代码如下:
Func StartClick();开始刷课函数                            这已经是一个由GUI界面上的START按钮响应的函数了
      If GUICtrlRead($kcmdList) = "" Then
                GUICtrlSetData($StateShow,@CRLF&"选课名单为空→")
                Return
      ElseIf $reTime = -1 Then
                GUICtrlSetData($StateShow,"←请选择刷课模式"&@CRLF&@CRLF&"↓间隔时间↓")
                Return
      EndIf
      If MsgBox(4,"注意!","请核对好已填写的选课列表,是否现在开始选课?") = 7 Then
                Return
      EndIf
      ;#################倒计时代码段###########################
      If MsgBox(4,"是否定时","是否启用定时刷课功能?否,则现在开始刷课") = 6 Then
                Local $n,$m,$o      opt('GUIOnEventMode',0) ;切换到消息循环模式
      GUICreate("请选择开始时间", 300, 50, 800, 200,BitOR($WS_CAPTION,$WS_POPUP))
      $n = GUICtrlCreateDate("", 10, 10, 150, 30)
                $DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW
      $style = "yyyy/MM/dd HH:mm:ss"
      GUICtrlSendMsg($n, $DTM_SETFORMAT_, 0, $style)
      $m = GUICtrlCreateButton("确定",190,10,40,30)
                $o = GUICtrlCreateButton("取消",240,10,40,30)
      GUISetState()
                While True                        $msg = GUIGetMsg()
                        If$msg = $m      Then
                              $endtime = GUICtrlRead($n)
                              ExitLoop
                        ElseIf $msg = $o Then
                              ExitLoop
                        EndIf
                WEnd
            GUIDelete()            opt('GUIOnEventMode',1) ;根据需要设置会事件模式
                $spantime = _DateDiff("s",_NowCalc(),$endtime)
                If $spantime < 0 Then
                        MsgBox(0,'',"时间设置错误!请重试")
                        Return
                EndIf
                Local $h,$m,$s
                Do
                        _TicksToTime($spantime*1000,$h,$m,$s)
                        $t = StringFormat("%02d小时%02d分%02d秒",$h,$m,$s)
                        GUICtrlSetData($StateShow,'距离开始还有:'&@CRLF&$t)
                        $spantime -= 1
                        Sleep(1000)
                Until $spantime <= 1
                GUICtrlSetData($StateShow,@CRLF&"刷课间隔:"&$reTime&"秒")
            $XKxmlhttp.open("GET","http://"&$node&"/隐藏他",False)
            $XKxmlhttp.setRequestHeader("Cache-Control","no-cache")
            $XKxmlhttp.setRequestHeader("If-Modified-Since", "0")
                Do
            $XKxmlhttp.send()
                Sleep(2000)
            Until Not StringRegExp($XKxmlhttp.responsetext,"错误信息",0)
      Else
                $XKxmlhttp.open("GET","http://"&$node&"/隐藏他",False)
                $XKxmlhttp.setRequestHeader("Cache-Control","no-cache")
                $XKxmlhttp.setRequestHeader("If-Modified-Since", "0")
                $XKxmlhttp.send()
                If StringRegExp($XKxmlhttp.responsetext,"错误信息",0) Then
                        MsgBox(0,"⊙▂⊙","选课入口未开放,不允许选课。"&@CRLF&"请根据服务器时间和开放时间进行选课!")
                        Return
                EndIf
      EndIf
      ;##############################定时刷课代码结束#################################      下面进行其他的处理就可以了!······

endfunc

sdlyfjx 发表于 2013-12-29 22:25:20

不知道描述的准确不?

user3000 发表于 2013-12-30 12:44:25

可以根据需要用 Opt('GUIOnEventMode', 0) 和 Opt('GUIOnEventMode', 1) 进行切换处理窗体消息的模式。
像你的代码里,没有切换过,当然要注册响应控件的函数。那个消息循环是不起任何作用的。

sdlyfjx 发表于 2013-12-31 15:54:29

回复 3# user3000


    对吼!   我以前这样试过。。。   忘记了!我试试!   貌似是可以行的耶!先谢一个!
页: [1]
查看完整版本: 【已解决】GUI事件模式(ONEVENT)下多窗口嵌套如何实现?