Référence GUI - Mode MessageLoop

Dans le mode Message-loop votre script passera la majorité de son temps dans une boucle infinie. 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 rendre votre GUI inerte..

 

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

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

While 1
  $msg = GUIGetMsg()
  ...
  ...
WEnd

 

Généralement une boucle infinie 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
  • Evénement Contrôle
  • Evénement Système
  •  

    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! Comment allez vous ?", 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 habituel à cause du nombre de messages possibles, d'utiliser l'expression Select pour une meilleur lisibilité.

     

    #include <GUIConstantsEx.au3>

    GUICreate("Hello World", 200, 100)
    GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
    $okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
    GUISetState(@SW_SHOW)

    While 1
      $msg = GUIGetMsg()

      Select
        Case $msg = $okbutton
          MsgBox(0, "GUI Event", "Vous avez appuyé sur OK !")

        Case $msg = $GUI_EVENT_CLOSE
          MsgBox(0, "GUI Event", "Vous avez cliqué FERMER ! Sortie...")
          ExitLoop
      EndSelect
    WEnd

    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.

     

    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 :

    $msg = GUIGetMsg(1)

     

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

    #include <GUIConstantsEx.au3>

    $mainwindow = GUICreate("Hello World", 200, 100)
    GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
    $okbutton = GUICtrlCreateButton("OK", 70, 50, 60)

    $dummywindow = GUICreate("Fenêtre de test factice", 200, 100)

    GUISwitch($mainwindow)
    GUISetState(@SW_SHOW)

    While 1
      $msg = GUIGetMsg(1)

      Select
        Case $msg[0] = $okbutton
          MsgBox(0, "GUI Event", "Vous avez appuyé sur OK !")

        Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow
          MsgBox(0, "GUI Event", "Vous avez cliqué FERMER sur la fenêtre principale ! Sortie...")
          ExitLoop
      EndSelect
    WEnd

     

    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)

     

    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.