|
|
fr.comp.os.ms-windows.programmation Affichage de l'article : Re: Tutorial : Programmer en 'C' sous windows (L4)
Date :
Le 03 avril 2008
From :
Sylvain SF
Sujet :
Re: Tutorial : Programmer en 'C' sous windows (L4)
Vincent Burel wrote on 03/04/2008 12:12:
>
> MessageBox (ou à toute ouverture de boite de dialogue modale) fait
> rentrer le code dans la boucle de message de la boite de dialogue. Ce
> n'est plus notre MessageLoop qui traite les événement mais celle de
> la boite de dialogue. et c'est cette boucle qui par le dispatch
> appelle notre callback avec l'événement WM_TIMER par exemple.
non, c'est bien le GetMessage() / DispatchMessage() de votre main
qui traite l'event WM_TIMER dans la fenêtre principale.
une pompe à message traite tous les messages destinés à la fenêtre
dont le handle est transmis à GetMessage() (2nd parametre), plus
précisemment à cette fenêtre et à tous ses childs ... sauf pour
toute fenêtre qui enregistre un autre event handler via un autre
GetMessage(), c'est le cas de MessageBox, il utilise un
GetMessage(&e, hWnd_du_dialog, ...) qui de fait provoque le
caractère modal et cette gestion séparée.
votre appli a contrario utilise un GetMessage(&e, null, ...)
afin de recevoir les msg pour toutes les fenêtres créés dans le
scope de votre HINSTANCE (toutes sauf celles qui ...).
>> on reçoit des WM_TIMER mais également des WM_UPDATE (les fenêtres
>> sont le dialogue modal sont bien redessinées) et tous messages qui
>> ne soit pas un ""user event"" (event souris ou clavier).
>
> oui, même des MOUSEMOVE si j'en crois le spy++
et de nombreuses appli. (browser par exemple pour afficher l'URL
d'un tag , mais d'autres avec affichage d'info-bulles) traitent
ce mousemove sans prendre en compte le statut actif ou non de la
fenêtre.
> comment expliquer que notre code attende la sortie de la fonction
> MessageBox et qu'il puisse en même temps continuer de faire tourner
> la boucle de message ?
le code (un code comparable à votre tuto) n'est pas multi-thread,
mais il est quand même réentrant.
l'appel à MessageBox est bloquant pour votre thread principal
unique, cela n'empêche pas le système de réappeler votre
procédure de traitement de message ('MainWindowManageEvent').
le fait que l'appli soit mono-thread implique seulement qu'un
seul message puisse être traité à la fois.
Sylvain.
Posez vos questions, réponses et remarques sur
les forums de FrameIP
|
|