Gestion des messages Windows

Introduction

Les messages de votre programme seront transférés par Windows dans une file d'attente, qui est traitée uniquement si vous le désirez. Windows transmet un millier de messages à votre programme sans avertissement direct.

Par exemple si vous changez le statut d'un gadget (que ce soit en ajoutant une saisie ou en changeant l'image d'un ImageGadget), un message est envoyé à la file d'attente de votre programme.

Il y a deux possibilités de récupérer et de traiter les messages Windows dans PureBasic : WaitWindowEvent() and WindowEvent(). La différence est, que WaitWindowEvent() attend qu'un message arrive alors que WindowEvent() permet de continuer à travailler. Les messages dans la file d'attente ne seront cependant traités qu'après l'appel à WindowEvent() ou WaitWindowEvent().

Spécificités de WindowEvent()

La commande WindowEvent() n'attend pas, qu'un message arrive, mais vérifie seulement s'il y en a un dans la file d'attente. Si Oui, le message est traité et WindowEvent() renvoie le numéro du message. Si aucun message n'est dans la file, alors zéro (0) est renvoyé.

Exemple

  While WindowEvent() : Wend
Fait en sorte, que WindowEvent() soit appelée tant qu'elle ne renvoie pas 0, c'est à dire jusqu'à ce que tous les messages de la file d'attente soient traités

Insérer un simple 'WindowEvent()' après un SetGadgetState() ne suffit pas pour traiter ce message en particulier. Premièrement il peut toujours y avoir d'autres messages dans la file d'attente, qui sont arrivés auparavant, et deuxièmement Windows envoie également un nombre conséquent d'autres messages, dont nous n'avons que faire... mais qui néanmoins sont dans la file d'attente.

Un simple appel à
  WindowEvent()
ne suffit pas, le programme peut fonctionner correctement dans certaines circonstances sur une version de Windows, mais pas sur une autre version. Les différentes versions de Windows ont un fonctionnement interne tellement spécifique, qu'une version envoie seulement 1 message mais une autre version peut envoyer 5 messages pour le même cas de figure. .

A cause de cela, on utilise toujours pour la mise à jour :
  While WindowEvent() : Wend
Bien sûr il y a aussi l'alternative
  Repeat : Until WindowEvent() = 0
possible, qui n'est cependant pas très courante.

La méthode While WindowEvent() : Wend est fréquemment utilisée avec la commande Delay(), lorsqu'une une boucle est insérée AVANT le Delay(), par exemple pour attendre que la mise à jour d'un ImageGadget soit effective, après avoir changé une image avec SetGadgetState().