找回密码
 加入
搜索
查看: 8690|回复: 19

[GUI管理] 关于GUI宏的一些问题 [已解决]

 火.. [复制链接]
发表于 2012-11-26 10:20:35 | 显示全部楼层 |阅读模式
本帖最后由 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的展开会报错(当然上面的代码由于先判断托盘消息,所以绕开了这种情况)。
做的是同一件事情,即退出,能否有办法放在同一个函数中处理?还是说,必须得分开?
发表于 2012-11-26 11:44:58 | 显示全部楼层
回复 1# xiehuahere
建议发完整代码~~
发表于 2012-11-26 11:59:21 | 显示全部楼层
回复 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
发表于 2012-11-26 12:18:01 | 显示全部楼层
本帖最后由 netegg 于 2012-11-26 12:31 编辑

Switch @GUI_WinHandle, @tray_id其实这个可能最好用select,switch切换的话,不知道下面的代码行不行
[au3]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[/au3]
试试看吧,没测试
 楼主| 发表于 2012-11-26 13:50:51 | 显示全部楼层
回复annybaby
回复netegg

我没表达清楚?还是代码没看清楚?原代码近千行,我先看看能不能简化一个出来。

需要判断区分的,因为有些不是要Exit退出脚本的,而只是销毁子窗口。见上面代码例子中 $hSubGUI 和 $hWinAbout 处理。

蛋蛋的方法也不行,因为在点击托盘菜单退出时宏@GUI_WinHandle在展开时就立即报错,同理,在点击窗口上的退出按钮时,宏@tray_id在展开时立即报错。

当然,我可以分开两个函数,一个处理完全退出Exit的情况,另一个处理仅销毁窗口的情况。
这个问题的目的是问有没有在一个函数中处理的可能。谢谢!
发表于 2012-11-26 14:01:02 | 显示全部楼层
回复 5# xiehuahere


    一定要纠结于宏吗???
发表于 2012-11-26 14:05:30 | 显示全部楼层
回复 5# xiehuahere
展开是什么意思
发表于 2012-11-26 14:09:11 | 显示全部楼层
回复 6# annybaby
这和用不用宏没关系,不用宏的话用别的方法获取,按照原有逻辑会一样报错
 楼主| 发表于 2012-11-26 14:09:11 | 显示全部楼层
回复 7# netegg


这个意思:
If @TRAY_ID = $TrayExit Then Exit
If ^ ERROR

会看到这种报错。
发表于 2012-11-26 14:10:44 | 显示全部楼层
回复 5# xiehuahere
你还是用文字描述那三个条件吧,越说越糊涂
发表于 2012-11-26 14:12:39 | 显示全部楼层
回复 9# netegg

是宏的问题,原因是脚本判断要判断的宏根本不存在~~
发表于 2012-11-26 14:15:01 | 显示全部楼层
回复 9# xiehuahere

@tray_id要存在才能判断和比较值啊,不存在当然会出错~~
发表于 2012-11-26 14:18:17 | 显示全部楼层
回复 9# xiehuahere
模式开没开,这个宏必须在开了托盘事件模式后才有效
不想开的话试试看这样
if isdeclared(@tray_id) then
  if @tray_id = $trayexit then exit
endif
发表于 2012-11-26 14:18:52 | 显示全部楼层
回复 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('[active]')=$win
                MsgBox(0,0,'从窗口中退出!',0,$win)
                Exit
        Case WinGetHandle('[active]')=$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

评分

参与人数 1金钱 +10 收起 理由
xiehuahere + 10 不失为一个方法,辛苦费呈上

查看全部评分

 楼主| 发表于 2012-11-26 14:26:29 | 显示全部楼层
本帖最后由 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不存在。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 00:28 , Processed in 0.084726 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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