Windows Message Handling

Die Nachrichten (englisch: "Messages") für Ihr Programm werden von Windows in eine Warteschlange (Queue) geschickt, die erst abgearbeitet wird, wenn Sie dies wollen. Windows sendet tausende Nachrichten an Ihr Programm, ohne dass Sie dies direkt merken.

Wenn Sie z.B. den Status eines Gadgets ändern (egal ob Sie einen neuen Eintrag hinzufügen oder das Image eines ImageGadget's ändern), wird eine Nachricht an die Warteschlange Ihres Programmes versendet.

In PureBasic gibt es zwei Möglichkeiten, die Windows-Nachrichten zu empfangen und zu verarbeiten: WaitWindowEvent() und WindowEvent(). Der Unterschied besteht darin, dass WaitWindowEvent() wartet, bis eine Nachricht ankommt und WindowEvent() auch so weiterarbeitet. Bearbeitet werden die Nachrichten in der Warteschlange jedoch erst, nachdem Sie WindowEvent() bzw. WaitWindowEvent() aufgerufen haben.

Besonderheiten von WindowEvent():

Der Befehl WindowEvent() wartet nicht, bis eine Message eintrifft, sondern überprüft nur, ob eine in der Queue ist. Falls ja, wird die Message abgearbeitet und WindowEvent() liefert die Nummer der Message zurück. Wenn keine Message ansteht, so wird NULL (0) zurückgegeben.

Die Zeile
  While WindowEvent() : Wend
bewirkt somit, dass WindowEvent() solange aufgerufen wird, bis es 0 zurückgibt, d.h. bis alle Messages aus der Warteschlange abgearbeitet sind.

Es reicht NICHT, wenn man nach einem SetGadgetState() ein simples 'WindowEvent()' macht, um diese 1 Message abzuarbeiten. Erstens könnten noch andere Nachrichten in der Schlange sein, die schon vorher angekommen sind, und zweitens sendet Windows auch noch etliche andere Messages, um die wir uns nicht kümmern müssen... die aber trotzdem in der Queue sind.

Ein einfacher Aufruf von
  WindowEvent()
reicht nicht aus, denn dann läuft der Code unter Umständen auf einer Windows-Version korrekt, auf einer anderen Version aber nicht. Die verschiedenen Windows-Versionen unterscheiden sich intern eben sehr stark, so dass eine Version nur 1 Message schickt, aber eine andere Windows-Version 5 Nachrichten dafür versendet.

Von daher macht man zum Updaten immer:
  While WindowEvent() : Wend
Alternativ wäre natürlich auch noch
  Repeat : Until WindowEvent() = 0
möglich, was jedoch eher unüblich ist.

Die geschilderte Methode "While : WindowEvent() : Wend" ist häufig im Zusammenhang mit dem Befehl Delay() nützlich, wobei die Schleife VOR dem Delay() eingefügt wird, um z.B. erst das Update eines ImageGadget's nach dem Austausch eines Bildes mit SetGadgetState() abzuwarten.