找回密码
 加入
搜索
查看: 3583|回复: 6

[AU3基础] 【已解决】请问高手,如何实现程序中多个函数同时执行?

  [复制链接]
发表于 2013-5-12 11:27:19 | 显示全部楼层 |阅读模式
本帖最后由 lmhsb 于 2013-5-12 20:39 编辑

比如我有以下一段程序,如何实现在点击菜单“关于”出现的对话框还没有关闭的情况下,点击其它的菜单项,还能执行其对应的函数而出现所需要的窗口?

先谢谢了!
#RequireAdmin
#PRE_UseUpx=n
#PRE_Res_Fileversion=2.1.2.17
#PRE_Res_Fileversion_AutoIncrement=y
#PRE_Run_Tidy=y

Dim $ProgName = "我的程序", $ProgTitle = "MyPrograme"

Opt("TrayMenuMode", 1 + 2)
TraySetClick(2)
$MenuItem_Reg = TrayCreateItem("注册(&R)")
$MenuItem_Help = TrayCreateItem("帮助(&H)")
$MenuItem_About = TrayCreateItem("关于(&A)")
TrayCreateItem("")
$MenuItem_Exit = TrayCreateItem("退出(&E)" & @TAB & "Ctrl+Alt+X")
TraySetIcon(@ScriptName, "201")

_MainTrayMenu() ;执行主函数

Func _MainTrayMenu()
        While 1
                $msg = TrayGetMsg()
                Select
                        Case $msg = 0
                                ContinueLoop
                        Case $msg = $MenuItem_Exit
                                _ExitProgram()
                        Case $msg = $MenuItem_Reg
                                _Register()
                        Case $msg = $MenuItem_About
                                _ShowAbout()
                        Case $msg = $MenuItem_Help
                                _ShowHelp()
                EndSelect
        WEnd
EndFunc   ;==>_MainTrayMenu

Func _Register()
        $RegForm = GUICreate($ProgTitle & " - 注册", 290, 200, -1, -1, 0x00080000)
        GUICtrlCreateLabel("注册后才可使用全部功能哦,亲!", 17, 15, 260)
        GUICtrlCreateLabel("请填写正确的注册码以注册本程序。", 17, 30, 260)
        GUICtrlCreateLabel("机器码", 20, 64, 40)
        $MachineNumInput = GUICtrlCreateInput("ABCD", 60, 60, 185, 21, 0x0800)
        GUICtrlCreateLabel("注册码", 20, 96, 40)
        $RegisterNum = GUICtrlCreateInput("", 60, 91, 185, 21)
        $RegButton = GUICtrlCreateButton("注册(&R)", 105, 125, 80)
        GUICtrlSetState($RegButton, 512)
        GUISetState(@SW_SHOW)
        While 1
                $msg = GUIGetMsg()
                Switch $msg
                        Case -3
                                GUIDelete($RegForm)
                                _MainTrayMenu()
                        Case $RegButton
                                MsgBox(64, $ProgTitle & " - 注册", "恭喜,注册成功!", 0, $RegForm)
                                GUIDelete($RegForm)
                                _MainTrayMenu()
                EndSwitch
        WEnd
EndFunc   ;==>_Register

Func _ShowHelp()
        GUICreate($ProgTitle & " - 帮助", 220, 160, -1, -1, 0x00080000)
        GUICtrlCreateIcon(@ScriptName, 0, 20, 20, 32, 32)
        $OkButton = GUICtrlCreateButton("确定(&O)", 70, 70, 80)
        GUISetState()
        While 1
                $msg = GUIGetMsg()
                Select
                        Case $msg = -3
                                ExitLoop
                        Case $msg = $OkButton
                                ExitLoop
                EndSelect
        WEnd
        GUIDelete()
EndFunc   ;==>_ShowHelp

Func _ShowAbout()
        MsgBox(64, $ProgTitle & " - 关于", $ProgName & " (Ver " & FileGetVersion(@ScriptName) & ")", 10)
EndFunc   ;==>_ShowAbout

Func _ExitProgram()
        Exit
EndFunc   ;==>_ExitProgram
发表于 2013-5-12 11:40:21 | 显示全部楼层
将阻断型的函数 MsgBox 换成 GUICreate 自建窗口~
 楼主| 发表于 2013-5-12 12:02:22 | 显示全部楼层
将阻断型的函数 MsgBox 换成 GUICreate 自建窗口~
afan 发表于 2013-5-12 11:40

可是比如我点击了菜单项“帮助”后,在未关闭“帮助”窗口的情况下,点击“注册”,此时程序是无法响应的。在关闭了“帮助”窗口后,“注册”窗口会再自动弹出来。

帮助”和“注册”都是使用 GUICreate 建立的窗口啊。

如何能实现其中一个窗口未关闭的情况下,点另外的菜单项,也能立刻出现对应需要的窗口,并且实现各自窗口中的一些功能而不冲突呢?

评分

参与人数 1金钱 +8 收起 理由
pusofalse + 8 漂亮的阐述~

查看全部评分

发表于 2013-5-12 12:06:13 | 显示全部楼层
可是比如我点击了菜单项“帮助”后,在未关闭“帮助”窗口的情况下,点击“注册”,此时程序是无法响应的 ...
lmhsb 发表于 2013-5-12 12:02



    没注意看其它的……

因为你的 _ShowHelp()、_Register() 等函数内部都加了消息循环,这样肯定另其它外部消息无法响应。你应该先创建所有的窗口,按需要显示和隐藏,然后在主循环中响应各个控件消息。当然,最佳方式是采用 OnEvent 事件模式。
 楼主| 发表于 2013-5-12 13:08:11 | 显示全部楼层
没注意看其它的……

因为你的 _ShowHelp()、_Register() 等函数内部都加了消息循环,这样肯定 ...
afan 发表于 2013-5-12 12:06



    真的很抱歉,我尝试了半天,还是没能整明白。

A 版可否有时间帮我将上面的程序修改下,以满足要求。我再慢慢边看边学,谢谢啊
发表于 2013-5-12 14:05:49 | 显示全部楼层
真的很抱歉,我尝试了半天,还是没能整明白。

A 版可否有时间帮我将上面的程序修改下,以满足 ...
lmhsb 发表于 2013-5-12 13:08
#RequireAdmin
#PRE_UseUpx=n
#PRE_Res_Fileversion=2.1.2.17
#PRE_Res_Fileversion_AutoIncrement=y
#PRE_Run_Tidy=y

Global $ProgName = "我的程序", $ProgTitle = "MyPrograme"
Global $hGui, $hGuiHelp, $hGuiAbout

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 1 + 2)
TraySetClick(2)

$MenuItem_Reg = TrayCreateItem("注册(&R)")
TrayItemSetOnEvent(-1, '_GuiShow')
$MenuItem_Help = TrayCreateItem("帮助(&H)")
TrayItemSetOnEvent(-1, '_GuiShow')
$MenuItem_About = TrayCreateItem("关于(&A)")
TrayItemSetOnEvent(-1, '_GuiShow')
TrayCreateItem("")
$MenuItem_Exit = TrayCreateItem("退出(&E)" & @TAB & "Ctrl+Alt+X")
TrayItemSetOnEvent(-1, '_ExitProgram')
TraySetIcon(@ScriptName, "201")

_GUICreateAll()

While 1
        Sleep(1000)
WEnd

Func _GUICreateAll()
        $hGui = GUICreate($ProgTitle & " - 注册", 290, 200, -1, -1, 0x00080000)
        GUISetOnEvent(-3, '_GuiClose')
        GUICtrlCreateLabel("注册后才可使用全部功能哦,亲!", 17, 15, 260)
        GUICtrlCreateLabel("请填写正确的注册码以注册本程序。", 17, 30, 260)
        GUICtrlCreateLabel("机器码", 20, 64, 40)
        $MachineNumInput = GUICtrlCreateInput("ABCD", 60, 60, 185, 21, 0x0800)
        GUICtrlCreateLabel("注册码", 20, 96, 40)
        $RegisterNum = GUICtrlCreateInput("", 60, 91, 185, 21)
        $RegButton = GUICtrlCreateButton("注册(&R)", 105, 125, 80)
        GUICtrlSetOnEvent(-1, '_Register')
        GUICtrlSetState($RegButton, 512)

        $hGuiHelp = GUICreate($ProgTitle & " - 帮助", 220, 160, -1, -1, 0x00080000)
        GUISetOnEvent(-3, '_GuiClose')
        GUICtrlCreateIcon(@ScriptName, 0, 20, 20, 32, 32)
        $OkButton = GUICtrlCreateButton("确定(&O)", 70, 70, 80)
        GUICtrlSetOnEvent(-1, '_GuiClose')

        $hGuiAbout = GUICreate($ProgTitle & " - 关于", 300, 160, -1, -1, 0x00080000)
        GUISetOnEvent(-3, '_GuiClose')
        GUICtrlCreateLabel($ProgName & " (Ver " & FileGetVersion(@ScriptName) & ")", 50, 20)
EndFunc   ;==>_GUICreateAll

Func _GuiClose()
        GUISetState(0, @GUI_WinHandle)
EndFunc   ;==>_GuiClose

Func _GuiShow()
        Switch @TRAY_ID
                Case $MenuItem_Reg
                        GUISetState(1, $hGui)
                Case $MenuItem_Help
                        GUISetState(1, $hGuiHelp)
                Case $MenuItem_About
                        GUISetState(1, $hGuiAbout)
        EndSwitch
EndFunc   ;==>_GuiShow

Func _Register()
        MsgBox(64, $ProgTitle & " - 注册", "恭喜,注册成功!", 0, $hGui)
EndFunc   ;==>_Register

Func _ExitProgram()
        Exit
EndFunc   ;==>_ExitProgram
 楼主| 发表于 2013-5-12 14:34:21 | 显示全部楼层
afan 发表于 2013-5-12 14:05



    非常感谢,测试没有问题。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-29 05:23 , Processed in 0.090865 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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