Dans le mode OnEvent (Evénement) au lieu d'interroger en permanence la GUI pour savoir si quelque chose c'est passé, 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 le Bouton1, la GUI met en pause votre script principal et appelle une fonction utilisateur précédemment définie qui traite le Button1. Lorsque l'appel de la fonction est complété, le script principal est repris là ou il en était. Ce mode est similaire à la méthode Forms de 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).
Le code de la structure d'une boucle OnEvent est :
While 1
Sleep(1000) ; Boucle de d'attente.
WEnd
Func Event1()
; Le code pour traiter l'événement va ici
EndFunc
Func Event2()
; Le code pour traiter l'événement va ici
EndFunc
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 vous aider à traiter l'événement.
| Macro | Détails |
| @GUI_CTRLID | Le contrôle 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énement 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éfinit par @GUI_CTRLID. L'événement est envoyé à la fonction définie au moyen de GUISetOnEvent. Les valeurs des événements système possible sont visibles 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("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
Maintenant nous allons finir le code en utilisant le mode OnEvent et certains des messages d'événement décrits ci-dessus.
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1) ; Passe en mode événement
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")
GUISetState(@SW_SHOW)
While 1
Sleep(1000) ; Boucle de d'attente
WEnd
Func OKButton()
; Note : Ici @GUI_CTRLID est égal à $okbutton,
; et @GUI_WINHANDLE est égal à $mainwindow
MsgBox(0, "GUI Event", "Vous avez appuyé OK !")
EndFunc
Func CLOSEClicked()
; Note : Ici @GUI_CTRLID est égal à $GUI_EVENT_CLOSE,
; et @GUI_WINHANDLE est égal à $mainwindow
MsgBox(0, "GUI Event", "Vous avez cliqué FERMER ! Sortie...")
Exit
EndFunc
C'est aussi simple que ça. Évidemment plus il y à de fenêtres et de contrôles, plus le script est compliqué. Mais ce qui vient d'être montré vous donne 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) ; Passe en mode événement
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")
$dummywindow = GUICreate("Fenêtre de test factice", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
While 1
Sleep(1000) ; Boucle de d'attente
WEnd
Func OKButton()
; Note : Ici @GUI_CTRLID est égal à $okbutton
MsgBox(0, "GUI Event", "Vous avez appuyé OK !")
EndFunc
Func CLOSEClicked()
; Note : Ici @GUI_CTRLID est égal à $GUI_EVENT_CLOSE
; @GUI_WINHANDLE sera égal à $mainwindow ou $dummywindow
If @GUI_WINHANDLE = $mainwindow Then
MsgBox(0, "GUI Event", "Vous avez cliqué FERMER sur la fenêtre principale ! Sortie...")
Exit
EndIf
EndFunc
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 "Hello World" et non la fenêtre de test. Donc nous allons "commuter (switch)" de fenêtre. Certaines fonctions GUI vous authorise à utiliser le handle de la fenêtre à l'intérieur de l'appel de la fonction - Ces fonctions commuterons automatiquement. Dans notre exemple nous pourrions l'avoir fait avec :
GUISetState(@SW_SHOW, $mainwindow)
Remarquez aussi que nous avons utilisé la même fonction OnEvent pour traiter le bouton "FERMER" 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 FERMER 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.