Dans le mode OnEvent (Evénement) au lieu d'interroger en permanence la GUI pour savoir si quelque chose s'est passée, vous faites en sorte que la GUI mette temporairement votre script en pause et appelle une fonction prédéfinie pour traiter l'événement. Par exemple, si l'utilisateur clique sur le Bouton1, la GUI met en pause votre script principal et appelle une fonction utilisateur précédemment définie qui traite le clic du Button1. Lorsque l'appel de la fonction est complété, le script principal reprend là ou il en était. Ce mode est similaire au fonctionnement des formulaires dans Visual Basic.
Tant que votre GUI est en exécution, votre script principal peut faire n'imporqte quel travail de script. Mais pour la facilité des exemples nous mettrons juste en "pause" le script principal dans une boucle While infinie.
Le mode par défaut, est le mode MessageLoop (Boucle de message).Pour passer en mode OnEvent (Mode événementiel), utilisez Opt("GUIOnEventMode", 1).
La structure générale du code OnEvent est:
Global $bStopScript = False
...
While Not $bStopScript
Sleep(100) ; Pause pour réduire l'utilisation du CPU
WEnd
Func Event1()
; Code pour traiter l'événement ...
EndFunc ;==>Event1
Func Event2()
; Code pour traiter l'événement
...
$bStopScript = True
EndFunc ;==>Event2
Dans le mode OnEvent votre GUI générera les "événements" suivants:
Les deux types d'événement appelleront une fonction utilisateur définie si elle a été fixée par la GUI (GUISetOnEvent) ou par un contrôle (GUICtrlSetOnEvent). Si aucune fonction n'a été définie pour un événement, alors il sera tout simplement ignoré. A l'intérieur de la fonction appelée, diverses valeurs de macros seront disponibles pour vous aider à traiter l'événement.
Macro | Détails |
---|---|
@GUI_CtrlId | L'ID du contrôle qui envoie le message OU l'ID de l'événement système |
@GUI_WinHandle | Le handle de la GUI qui envoie le message |
@GUI_CtrlHandle | Le handle du Contrôle qui envoie le message (Si applicable) |
Note : Il est tout à fait normal d'utiliser la même fonction pour des événements multiples, Tout ce que vous devez faire dans ce cas c'est de prendre des mesures basées sur la macro @GUI_CTRLID. Par exemple, vous pourriez lier tous les événements système à la même fonction.
Evénement Contrôle
Lorsqu'un contrôle est cliqué ou modifié, un événement contrôle est envoyé. L'événement est envoyé à la fonction définie au moyen de GUICtrlSetOnEvent. A l'intérieur de la fonction définie par l'utilisateur, @GUI_CTRLID est fixé à la valeur du controlID qui à été retourné lorsque le contrôle a été créé par une des fonctions GUICtrlCreate....
Evénement Système
Les événements système, tel que la fermeture de la GUI, sont envoyés de la même manière que les événements contrôle, mais le type d'événement est défini par @GUI_CTRLID. L'événement est envoyé à la fonction définie au moyen de GUISetOnEvent. Les valeurs des événements système possibles sont donnés ci-dessous :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Dans la page principale Référence GUI nous avons commencé un exemple simple (Hello World) qui ressemblait à ceci :
#include <GUIConstantsEx.au3>
GUICreate("Bonjour à tous", 200, 100)
GUICtrlCreateLabel("Bonjour à tous! Comment allez vous?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
Maintenant nous complétons le code en utilisant OnEvents et quelques messages d'événement décrits ci-dessus.
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1) ; Définit le mode OnEvent
Global $hMainGUI = GUICreate("Bonjour à tous", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton") GUICtrlCreateLabel("Bonjour à tous! Comment allez vous?", 30, 10)
Global $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($iOKButton, "OKButton") GUISetState(@SW_SHOW, $hMainGUI)
Global $bStopScript = False
While Not $bStopScript
Sleep(100) ; Pause pour réduire l'utilisation du processeur
WEnd
Func OKButton()
; Note: à ce point @GUI_CtrlId devrait être égal à $iOKButton, ; et @GUI_WinHandle devrait être égal à $hMainGUI
MsgBox(0, "GUI Event", "Vous avez cliqué sur OK!")
EndFunc ;==>OKButton
Func CLOSEButton()
; Note: à ce point @GUI_CtrlId devrait être égal à $GUI_EVENT_CLOSE,
; et @GUI_WinHandle devrait être égal à $hMainGUI
MsgBox(0, "GUI Event", "Vous avez cliqué sur CLOSE! Arrêt du script...")
$bStopScript = True
EndFunc ;==>CLOSEButton
C'est aussi simple que ça. Évidemment plus il y a de fenêtres et de contrôles, plus le script est compliqué. Mais ce qui vient d'être étudié vous montre l'essentiel.
Les contrôles ID sont uniques, même si vous avez des fenêtres multiples, mais comment allons nous traiter des fenêtres multiples ?
Voici un exemple similaire au précédent, mais avec une autre fenêtre "factice".
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1) ; Définit le mode OnEvent
Global $hMainGUI = GUICreate("Bonjour à tous", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton")
GUICtrlCreateLabel("Bonjour à tous! Comment allez vous?", 30, 10)
Global $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($iOKButton, "OKButton")
Global $hDummyGUI = GUICreate("GUI factice pour le test", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton")
GUISwitch($hMainGUI)
GUISetState(@SW_SHOW)
Global $bStopScript = False
While Not $bStopScript
Sleep(100) ; Pause pour réduire l'utilisation du CPU
WEnd
Func OKButton()
; Note: à ce point @GUI_CtrlId devrait être égal à $iOKButton MsgBox(0, "GUI Event", "Vous avez cliqué sur OK!")
EndFunc ;==>OKButton
Func CLOSEButton()
; Note: à ce point @GUI_CtrlId devrait être égal à $GUI_EVENT_CLOSE,
; @GUI_WinHandle serait $hMainGUI ou $hDummyGUI
If @GUI_WinHandle = $hMainGUI Then
MsgBox(0, "GUI Event", "Vous avez cliqué sur CLOSE dans la fenêtre principale! Arrêt du script...")
$bStopScript = True
EndIf
EndFunc ;==>CLOSEButton
Le premier changement majeur est l'appel à la fonction GUISwitch - quand une nouvelle fenêtre est créée elle devient la fenêtre par défaut pour les opérations GUI qui suivent (y compris la création de contrôles). Dans notre cas, nous voulons travailler avec la fenêtre principale "Bonjour à tous" et non la fenêtre de test. Donc nous allons "commuter (switch)" de fenêtre. Certaines fonctions GUI vous autorisent à utiliser le handle de la fenêtre à l'intérieur de l'appel de la fonction - Ces fonctions commuteront automatiquement. Dans notre exemple nous aurions pu le faire avec:
GUISetState(@SW_SHOW, $hMainGUI)
Remarquez aussi que nous avons utilisé la même fonction OnEvent pour traiter le bouton "CLOSE" pour les deux fenêtres et utilisé @GUI_WINHANDLE pour déterminer quelle fenêtre a envoyé le message - Nous avons donc fermé la GUI lorsque le bouton CLOSE a été cliqué et que le message provenait de la fenêtre principale. Vous pouvez tout aussi bien utiliser des fonctions séparées pour chaque fenêtre si vous le souhaitez.