【已解决】请问高手,如何实现程序中多个函数同时执行?
本帖最后由 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 将阻断型的函数 MsgBox 换成 GUICreate 自建窗口~ 将阻断型的函数 MsgBox 换成 GUICreate 自建窗口~
afan 发表于 2013-5-12 11:40 http://www.autoitx.com/images/common/back.gif
可是比如我点击了菜单项“帮助”后,在未关闭“帮助”窗口的情况下,点击“注册”,此时程序是无法响应的。在关闭了“帮助”窗口后,“注册”窗口会再自动弹出来。
“帮助”和“注册”都是使用 GUICreate 建立的窗口啊。
如何能实现其中一个窗口未关闭的情况下,点另外的菜单项,也能立刻出现对应需要的窗口,并且实现各自窗口中的一些功能而不冲突呢? 可是比如我点击了菜单项“帮助”后,在未关闭“帮助”窗口的情况下,点击“注册”,此时程序是无法响应的 ...
lmhsb 发表于 2013-5-12 12:02 http://www.autoitx.com/images/common/back.gif
没注意看其它的……
因为你的 _ShowHelp()、_Register() 等函数内部都加了消息循环,这样肯定另其它外部消息无法响应。你应该先创建所有的窗口,按需要显示和隐藏,然后在主循环中响应各个控件消息。当然,最佳方式是采用 OnEvent 事件模式。 没注意看其它的……
因为你的 _ShowHelp()、_Register() 等函数内部都加了消息循环,这样肯定 ...
afan 发表于 2013-5-12 12:06 http://www.autoitx.com/images/common/back.gif
真的很抱歉,我尝试了半天,还是没能整明白。
A 版可否有时间帮我将上面的程序修改下,以满足要求。我再慢慢边看边学,谢谢啊 真的很抱歉,我尝试了半天,还是没能整明白。
A 版可否有时间帮我将上面的程序修改下,以满足 ...
lmhsb 发表于 2013-5-12 13:08 http://www.autoitx.com/images/common/back.gif#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
afan 发表于 2013-5-12 14:05 http://61.153.183.105:88/images/common/back.gif
非常感谢,测试没有问题。
页:
[1]