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.