eine Warteschlange geschickt, die erst abgearbeitet wird,
wenn Du es willst.
Bei einem reinen API-Programm ist der Message-Loop
jedesmal gleich:
Code: Alles auswählen
While GetMessage_( msg.MSG, #NULL, 0, 0 )
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
In C/C++ schreibst Du den obigen Code direkt hin, und in PureBasic
wird das zu dem Befehl WaitWindowEvent() zusammengefasst.
WindowEvent ist dann als API:
Code: Alles auswählen
While PeekMessage_( msg.MSG, #NULL, 0, 0, #PM_REMOVE )
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
und PeekMessage_() wartet nicht, sondern arbeitet auch so
weiter.
Windows sendet tausende Nachrichten an Dein Programm, ohne
das Du das direkt merkst.
Wenn Du z.B. den Status eines Gadgets änderst (egal ob Du einen
neuen Eintrag hinzufügst oder Das Image vom ImageGadget änderst),
wird eine Nachricht an die Warteschlange Deines Programmes
versendet.
Bearbeitet werden die Nachrichten in der Warteschlange (Queue)
aber erst nachdem Du die obige Befehlssequenz aufgerufen
hast - bzw. in PureBasic mit WindowEvent() und WaitWindowEvent().
der Befehl WindowEvent() wartet nicht bis eine message eintrifft,
sondern checkt 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:
Code: Alles auswählen
While WindowEvent():Wend
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.
es gab schon Leute hier die haben nur ein WindowEvent() benutzt,
und dann lief der code auf einer Windows-Version korrekt, auf
einer anderen Version aber nicht.
die verschiedenen Windows-Versionen unterscheiden sich Intern
eben sehr stark, so daß 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
Wer möchte kann Das natürlich auch umschreiben:
Repeat : Until WindowEvent() = 0
für solche Sachen wird halt auch in anderen Sprachen immer
While...Wend genommen, von daher wirst Du so gut wie immer
diese Methode sehen.
Hoffe Das hilft als kleine Erklärung dazu.
Wer mehr darüber wissen möchte, der sollte mal ein Buch oder
Tutorial zur Windows-Programmierung lesen.