Mode OnEvent - Référence GUI

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).

Format d'une boucle événement (OnEvent) classique

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

Evénements GUI

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


Exemple de GUI

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.

Opérations Avancées et Fenêtres Multiples

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.