Mode MessageLoop - Référence GUI

Dans le mode Message-loop votre script passera la majorité de son temps dans une boucle While. Cette boucle interrogera simplement la GUI en utilisant la fonction GUIGetMsg. Lorsqu'un événement s'est produit, la valeur de retour de la fonction GUIGetMsg montrera les détails (Un bouton est cliqué, la GUI à été fermée, etc.).

Le mode MessageLoop est le mode de message par défaut pour les GUIs AutoIt - L'autre mode possible est le mode OnEvent.

Dans le mode MessageLoop vous recevrez uniquement des événements tandis que vous interrogerez activement la fonction GUIGetMsg, donc vous devez vous assurer que vous l'appelez plusieurs fois par seconde sous peine de perdre la réactivité de votre GUI.

Format d'une boucle de message (MessageLoop) de base

Le code de la structure d'une boucle MessageLoop est:

Local $iMsg = GUIGetMsg()
While $iMsg <> $GUI_EVENT_CLOSE
     ...
     ...
     $iMsg = GUIGetMsg()
WEnd

ou, avec la condition d'arrêt en fin de boucle Do:

Local $iMsg
Do
     $iMsg = GuiGetMsg()
     ...
     ...
Until $iMsg = $GUI_EVENT_CLOSE

Généralement une boucle comme ci-dessus utilisera 100% de votre CPU - Heureusement la fonction GUIGetMsg met en veille le CPU automatiquement lorsqu'il n'y à aucun événement en attente. Surtout ne mettez jamais une pause manuelle dans la boucle de peur de trop utiliser le CPU - Cela ne fera que rendre votre GUI inerte.

Evénements GUI

Il y a trois types de message d'événement retourné par GUIGetMsg:


Evénement Nul

Lorsqu'il n'y a aucun événement en attente de traitement, GUIGetMsg retourne 0. Dans une GUI classique, c'est l'événement le plus commun.


Evénement Contrôle

Lorsqu'un contrôle est cliqué ou modifié un événement contrôle est envoyé - Celui-ci est un nombre positif qui correspond au controlID retourné lors de la création du contrôle par GUICtrlCreate....


Evénement Système

Les événements système tel que la fermeture de la GUI sont des nombres négatif. Les différents événements sont montrés ci-dessous et sont définis dans GUIConstantsEx.au3 :

$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("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)


Maintenant nous allons finir le code en utilisant une boucle de message MessageLoop et certains des messages d'événement décrits ci-dessus. Il est conseillé, lorsqu'il faut traiter plusieurs messages, d'utiliser l'instruction Select pour une meilleure lisibilité.

#include <Constants.au3>
#include <GUIConstantsEx.au3>

Local $hGUI = GUICreate("Bonjour à tous", 200, 100)
GUICtrlCreateLabel("Bonjour à tous! Comment allez-vous?", 50, 10)
Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW, $hGUI)

Local $iMsg = GUIGetMsg()
While $iMsg <> $GUI_EVENT_CLOSE
    If $iMsg = $iOKButton Then
        MsgBox($MB_SYSTEMMODAL, "Evénement GUI", "Vous avez cliqué sur le bouton OK.")
    EndIf
    $iMsg = GUIGetMsg()
WEnd

MsgBox($MB_SYSTEMMODAL, "Evénement GUI", "Vous avez cliqué sur le bouton Close. Sortie...")
GUIDelete($hGUI)

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 montré vous donne l'essentiel.

GUIGetMsg avancé et fenêtres Multiples

Les contrôles ID sont uniques, même si vous avez des fenêtres multiples, donc le code précédent fonctionnera trés bien avec des contrôles et des fenêtres multiples. Toutefois, lors du traitement des événements comme $GUI_EVENT_CLOSE ou $GUI_MOUSEMOVE vous devez savoir quelle fenêtre GUI a produit l'événement. Pour ce faire, vous devez appeler GUIGetMsg comme ceci:

$aMsg = GUIGetMsg(1)

Lors de l'appel avec le paramètre 1, au lieu de retourner une valeur d'événement, un tableau array est retourné. Ce tableau contient l'événement (dans $array[0]) et l'information complémentaire du handle de la fenêtre (dans $array[1]). Si deux fenêtres étaient créées dans notre exemple précédent, alors la méthode d'écriture du code serait:

#include <Constants.au3>
#include <GUIConstantsEx.au3>

Local $hMainGUI = GUICreate("Bonjour à tous", 200, 100)
GUICtrlCreateLabel("Bonjour à tous! Comment allez-vous?", 50, 10)
Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)

Local $hDummyGUI = GUICreate("Fenêtre factice pour le test", 200, 100)

GUISwitch($hMainGUI)
GUISetState(@SW_SHOW)

Local $aMsg ; un tableau
Do
    $aMsg = GUIGetMsg(1)

    If $aMsg[0] = $iOKButton Then
        MsgBox($MB_SYSTEMMODAL, "Evénement GUI", "Vous avez cliqué sur OK!")
    EndIf
Until $aMsg[0] = $GUI_EVENT_CLOSE And $aMsg[1] = $hMainGUI

MsgBox($MB_SYSTEMMODAL, "Evénement GUI", "Vous avez cliqué sur CLOSE dans la fenêtre principale! Sortie...")

Le premier changement majeur est l'appel de 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 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 pourrions l'avoir fait avec:

GUISetState(@SW_SHOW, $hMainGUI)

L'autre changement est la manière dont GUIGetMsg est appelé et comment sont vérifiés les événements - Notez l'utilisation de $msg[0] et $msg[1] - Maintenant, nous sortirons du script seulement si l'événement Fermer ($GUI_EVENT_CLOSE) est envoyé et que celui-ci provient de la fenêtre principale.