关于GUI宏的一些问题 [已解决]
本帖最后由 xiehuahere 于 2012-11-26 16:45 编辑请看下面代码片段,大家会明白我想干什么。对于托盘菜单和主界面我都是用的OnEvent模式。
Func _Exit()
If @TRAY_ID = $TrayExit Then Exit
Switch @GUI_WinHandle
Case $hGUI
Exit
Case $hSubGUI
DestroySubGUI()
Case $hWinAbout
GUIDelete($hWinAbout)
TrayItemSetState($TrayAbout, $TRAY_ENABLE)
EndSwitch
EndFunc
问题是:
如果我点击的是主界面上的退出按钮,那么@TRAY_ID展开的时候会报错;
如果我点击的是托盘菜单中的退出按钮,那么@GUI_WinHandle的展开会报错(当然上面的代码由于先判断托盘消息,所以绕开了这种情况)。
做的是同一件事情,即退出,能否有办法放在同一个函数中处理?还是说,必须得分开? 回复 1# xiehuahere
建议发完整代码~~ 回复 1# xiehuahere
Opt("GUIOnEventMode", 1)
Opt("trayOnEventMode", 1)
TraySetClick(8)
Opt("TrayMenuMode", 3)
$win = GUICreate("test", 251, 160, 482, 287)
GUISetState(1)
GUISetOnEvent(-3,'_exit')
TrayCreateItem("退出")
TrayItemSetOnEvent(-1, "_exit")
While 1
Sleep(50)
WEnd
Func _exit()
Exit
EndFunc 本帖最后由 netegg 于 2012-11-26 12:31 编辑
Switch @GUI_WinHandle, @tray_id其实这个可能最好用select,switch切换的话,不知道下面的代码行不行
Func _Exit()
Switch True
Case bitor(bitand($hGUI,@GUI_WinHandle),bitand($trayexit, @tray_id))
; Case (($hGUI=@GUI_WinHandle) or ($trayexit = @tray_id))
Exit
Case bitand($hSubGUI,@GUI_WinHandle)
; Case $hSubGui=@GUI_WinHandle
DestroySubGUI()
Case bitand($hWinAbout,@GUI_WinHandle)
; Case $hWinAbout = @GUI_WinHandle
GUIDelete($hWinAbout)
TrayItemSetState($TrayAbout, $TRAY_ENABLE)
EndSwitch
EndFunc
试试看吧,没测试 回复annybaby
回复netegg
我没表达清楚?还是代码没看清楚?原代码近千行,我先看看能不能简化一个出来。
需要判断区分的,因为有些不是要Exit退出脚本的,而只是销毁子窗口。见上面代码例子中 $hSubGUI 和 $hWinAbout 处理。
蛋蛋的方法也不行,因为在点击托盘菜单退出时宏@GUI_WinHandle在展开时就立即报错,同理,在点击窗口上的退出按钮时,宏@tray_id在展开时立即报错。
当然,我可以分开两个函数,一个处理完全退出Exit的情况,另一个处理仅销毁窗口的情况。
这个问题的目的是问有没有在一个函数中处理的可能。谢谢! 回复 5# xiehuahere
一定要纠结于宏吗??? 回复 5# xiehuahere
展开是什么意思 回复 6# annybaby
这和用不用宏没关系,不用宏的话用别的方法获取,按照原有逻辑会一样报错 回复 7# netegg
这个意思:
If @TRAY_ID = $TrayExit Then Exit
If ^ ERROR
会看到这种报错。 回复 5# xiehuahere
你还是用文字描述那三个条件吧,越说越糊涂 回复 9# netegg
是宏的问题,原因是脚本判断要判断的宏根本不存在~~ 回复 9# xiehuahere
@tray_id要存在才能判断和比较值啊,不存在当然会出错~~ 回复 9# xiehuahere
模式开没开,这个宏必须在开了托盘事件模式后才有效
不想开的话试试看这样
if isdeclared(@tray_id) then
if @tray_id = $trayexit then exit
endif 回复 5# xiehuahere
Opt("GUIOnEventMode", 1)
Opt("trayOnEventMode", 1)
TraySetClick(8)
Opt("TrayMenuMode", 3)
$win = GUICreate("test", 251, 160, 482, 287)
GUISetOnEvent(-3, '_exit')
GUISetState(1)
$child=GUICreate('子窗体',100,100)
GUISetState(1)
GUISetOnEvent(-3, '_exit')
$about=TrayCreateItem('关于')
TrayItemSetOnEvent(-1, "_exit")
TrayCreateItem('')
$exit = TrayCreateItem("退出")
TrayItemSetOnEvent(-1, "_exit")
While 1
Sleep(5000)
WEnd
Func _exit()
Select
Case WinGetHandle('')=$win
MsgBox(0,0,'从窗口中退出!',0,$win)
Exit
Case WinGetHandle('')=$child
MsgBox(0,0,'关闭子窗口!',0,$child)
GUIDelete($child)
Case @TRAY_ID=$exit
MsgBox(0,0,'从托盘中退出!')
Exit
Case @TRAY_ID=$about
MsgBox(0,0,'关于部分的内容!')
EndSelect
EndFunc ;==>_exit 本帖最后由 xiehuahere 于 2012-11-26 14:32 编辑
回复 14# annybaby
有点意思了,但你这个关闭子窗口后再从托盘选择退出,还是弹出“从窗口中退出”,进入了错误的分支。
我给个示例代码吧:
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIButton.au3>
Global $hGUI, $BtnClose, $BtnQuery
Global $hSubGUI, $BtnClose2
Global $hWinAbout
Opt("GUIOnEventMode", 1)
$hGUI = GUICreate("", 285, 45, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$BtnClose = GUICtrlCreateLabel("×", 269, 1, 14, 14, $SS_CENTER + $SS_CENTERIMAGE)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, "_Exit")
$BtnQuery = GUICtrlCreateButton("Create Sub", 100, 18, 65, 26, $BS_DEFPUSHBUTTON)
GUICtrlSetOnEvent(-1, "_CreateSubGUI")
GUISetState()
Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 1)
TraySetClick(16) ;释放鼠标右键显示托盘菜单
Local $TrayAbout = TrayCreateItem("About")
TrayItemSetOnEvent(-1, "_About")
TrayCreateItem("")
Local $TrayExit = TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "_Exit")
TraySetState()
While 1
Sleep(100)
WEnd
Func _CreateSubGUI()
$hSubGUI = GUICreate("", 720, 90, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE), $hGUI)
$BtnClose2 = GUICtrlCreateButton("Close", 630, 3, 80, 25)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetState()
EndFunc
Func _About()
TrayItemSetState($TrayAbout, $TRAY_UNCHECKED + $TRAY_DISABLE)
$hWinAbout = GUICreate("About", 300, 200, -1, -1, Bitor($WS_CAPTION,$WS_SYSMENU), $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUISetState()
EndFunc
Func DestroyQueryWin()
If Not IsHWnd($hSubGUI) Then Return
GUIDelete($hSubGUI)
EndFunc
Func _Exit()
If @TRAY_ID = $TrayExit Then Exit
Switch @GUI_WinHandle
Case $hGUI
Exit
Case $hSubGUI
DestroyQueryWin()
Case $hWinAbout
GUIDelete($hWinAbout)
TrayItemSetState($TrayAbout, $TRAY_ENABLE)
EndSwitch
EndFunc
没有点过托盘图标的情况下,@TRAY_ID不存在。
页:
[1]
2