OnEvent模式进阶教程
OnEvent模式进阶教程
很多autoit的用户(包括一些老用户)都认为OnEvent模式是简单的把GUIGetMsg 替换成了GUICtrlSetOnEvent,因此也产生了OnEvent模式不适合复杂GUI的误解。本文将具体阐述OnEvent模式的高级应用和使用技巧。
一、OnEvent模式的优势
OnEvent模式和MessageLoop模式最大的区别在于一个是主动,一个是被动。前者只有产生了消息才会执行函数,而后者则是不断地获取直到得到消息,这样CPU占用上OnEvent模式有很大优势。
另外,OnEvent模式能在运行脚本的同时获取GUI事件消息,这样我们就能把非常耗时的代码放在主循环里运行,而在其他的自定义函数里处理GUI消息。
比如下面这段代码,程序一直在主循环里更新控件内容,与此同时程序还能响应GUI消息:#include <GuiConstants.au3>
GUICreate("MyGUI", 372, 88, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Progress_1 = GUICtrlCreateProgress(10, 10, 370, 20)
$Button_2 = GUICtrlCreateButton("start", 10, 40, 60, 30)
$Button_3 = GUICtrlCreateButton("pause", 80, 40, 60, 30)
$Button_4 = GUICtrlCreateButton("exit", 150, 40, 70, 30)
Opt("GUIOnEventMode", 1)
Dim $start = 0, $ostart
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "gui") GUICtrlSetOnEvent($Button_2, "gui") GUICtrlSetOnEvent($Button_3, "gui") GUICtrlSetOnEvent($Button_4, "gui")
autoitWhile 1
If $start >= 0 Then
Sleep(50)
$start += 1
If $start > 100 Then $start = 0
If $start >= 0 Then
$ostart = $start
GUICtrlSetData($Progress_1, $start) Else
ContinueLoop
EndIf
EndIf
WEnd
Exit
Func gui()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE, $Button_4
Exit
Case $Button_2
$start = 0
Case $Button_3
If $start = -100 Then
$start = $ostart
Else
$start = -100
EndIf
EndSwitch
EndFunc ;==>gui
复制代码如果用MessageLoop模式来实现相同的效果,不但代码复杂,对GUI消息的响应也相当迟钝。也就是说MessageLoop模式只能在一个时间里做一件事,而OnEvent模式则能在做同样的事的同时抽出手去处理GUI事件。
所以,对于一些操作非常耗时或者GUI非常复杂的脚本,我们应首选OnEvent模式。
二、宏的妙用
许多人都有一个误解,认为一个事件只能注册一个函数,因此一些人把脚本写完之后代码里到处都是Func 、EndFunc。实际上,autoit本就提供了@GUI_CTRLID、@GUI_WINHANDLE、@GUI_CTRLHANDLE这三个宏,合理利用宏能大大简化代码
事实上,帮助文件里就有过说明:
注意:使用同一个函数来响应多种事件是完全合法的,记住要灵活使用@GUI_CTRLID 这
个宏。比如说,您可以注册所有系统事件到同一个函数。
下面是一个例子:#include <GuiConstants.au3>
GuiCreate("MyGUI", 340, 60,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Button_1 = GuiCtrlCreateButton("Button1", 10, 10, 100, 40)
$Button_2 = GuiCtrlCreateButton("Button2", 120, 10, 100, 40)
$Button_3 = GuiCtrlCreateButton("Button3", 230, 10, 100, 40)
Opt("GUIOnEventMode", 1)
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "gui")
GUICtrlSetOnEvent($Button_2, "gui")
GUICtrlSetOnEvent($Button_3, "gui")
GUICtrlSetOnEvent($Button_1, "gui")
While 1
;;;
WEnd
Exit
Func gui()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $Button_2
MsgBox(0,"","按下了Button_2")
Case $Button_3
MsgBox(0,"","按下了Button_3")
Case $Button_1
MsgBox(0,"","按下了Button_1")
EndSwitch
EndFunc ;==>gui
复制代码在上面的例子里,我将全部的事件都注册到一个函数里,然后根据@GUI_CTRLID 来判断具体的事件,这样代码就简洁多了。
而在关闭多窗口时@GUI_WINHANDLE则会起到很大作用,下面有个例子:#include <GuiConstants.au3>
Opt("GUIOnEventMode", 1)
$main = GuiCreate("MyGUI", 340, 60,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论