IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Fonctionnement de MessageBox()


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut Fonctionnement de MessageBox()
    Bonjour
    Quelqu'un saurait comment marche la fonction MessageBox() ?
    J'ai un programme qui crée juste une fenètre et dont la fonction callback est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_KEYDOWN:
    			MessageBox (NULL, "a", "a", MB_OK);
    		case WM_DESTROY:
    			PostQuitMessage (0);
    			break;
    
    		default:
    			return DefWindowProc (hwnd, message, wParam, lParam);
    	}
    	return 0;
    }
    La curiosité est que on peut créer plusieurs boîtes à message, et que le programme ne se termine que si l'on ferme la dernière boîte créee.

    J'en déduit que MessageBox contient une boucle de message comme celle présente dans la fonction WinMain. Mais c'est très embètant : ça veut dire que on peut continuer à donner des ordres à un programme qui signale une erreur par exemple.
    Quand on spécifie le handle de la fenètre concernée : hwnd lors de l'appel de la fonction MessageBox, on ne peut plus commander la fenêtre principale, mais celle-ci traite encore les messages envoyés par Windows, comme WM_PAINT. J'ai raison ou pas?

  2. #2
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    Si tu pass hwnd comme parent de la messageBox au lieu de NULL, elle devient "application modale" ce qui signifie que l'application (dont hwnd est le handle de la fenêtre principale) ne reçoit plus certains messages dans sa pompe à message tant que la messageBox est affichée (les messages provenant de l'utilisateur : clavier et souris).

    Ensuite, effectivement, la messageBox a son propre mécanisme de réception des messages Windows, indépendant de la boucle de message de la MainWin.

    Donc effectivement, l'application continue à recevoir les messages WM_PAINT pendant l'exécution de MessageBox (réentrance).

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Attention: Il est très important de toujours spécifier le HWND de la fenêtre quand tu appelles une MessageBox de la fenêtre, car:
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    Tout cela est très interessant, mais à éviter bien sur.

    En ce moment j'essaie de faire un partie de programme en multithreading, et je sais pas trop comment m'y prendre.
    Mon problème est simple : je crée une thread qui fait beaucoup de calculs et pendant ce temps ma première thread réceptionne les messages. En fait, cette dernière ne doit faire qu'une chose : attendre l'appui d'un bouton qui stoppe l'execution des calculs ou attendre la fin des calculs. J'ai pensé à MsgWaitForMultipleObjects () pour ne pas gaspiller les ressources processeurs mais je ne sais pas comment ne receptionner que les appuis de boutons. J'ai même fait des tests, et je constate que pendant que mon application attend, je ne peut même pas appuyer sur le bouton.
    Comment je peut me débrouiller, même si je doit ignorer de temps en temps des "input events" qui n'on rien à voir avec mon fameux bouton?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Là, ça devient compliqué.

    La fin des calculs, tu peux l'attendre de deux façons:
    1. Attendre que le thread se termine, ou attendre un Event signalé par le thread de calcul.
    2. Attendre un message posté par le thread de calcul.


    La première solution implique l'utilisation de MsgWaitForMultipleObjects() dans une boucle. Là encore il y a plusieurs façons, la plus simple selon moi étant une boucle de messages interne + désactiver_tous_les_autres_boutons.

    La seconde solution ne nécessite pas de MsgWaitForMultipleObjects(), mais implique toujours la désactivation de tous les autres boutons (plus le refus de quitter immédiatement si l'on clique sur la croix).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    Donc dans tous les cas, il y aura une boucle de message.
    C'est OK, je vais me lancer...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 17h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 15h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 22h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 22h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 01h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo