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

MFC Discussion :

[MFC] fermeture de fenetre avec PostQuiMessage


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut [MFC] fermeture de fenetre avec PostQuiMessage
    bonjour

    je suis en train de faire un programme de CD autorun du genre CD pilote.

    j'ai donc un première fenetre avec le chois de la langue + exit
    puis une deuxième avec le menu + exit
    et une dernière avec un sous menu + exit

    quand j'appuie sur exit dans la première fenetre je fais ceci
    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
    16
    17
    18
    19
    20
    LRESULT CALLBACK ExitProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
    		case WM_LBUTTONUP:
    		{
    			PostQuitMessage(0);
    			break;
    		}
    		case WM_MOUSEMOVE :
    		{
    			SetCursor(handCursor);
    			ShowCursor(TRUE);
    			break;
    		}
     
    	}
     
    	return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    dans la deuxième et la dernière je fais ceci

    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
    16
    17
    18
    19
    20
    LRESULT CALLBACK EscapeProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
    		case WM_LBUTTONUP:
    		{
    			::EndDialog(hWndMe1,0);
    			PostQuitMessage(0);
    			break;
    		}
    		case WM_MOUSEMOVE :
    		{
    			SetCursor(handCursor);
    			ShowCursor(TRUE);
    			break;
    		}
     
    	}
    	return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    lors que je quit a partir de la première page et de la deuxième ca marche

    mais lors que je quit de la dernière ca plante parce que mon prog ne passe pas dans la fonction EscapeProc de ma deuxième fenetre et donc n'execute pas "::EndDialog(hWndMe1,0);"

    qui a une solution a me proposer

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Moi, je serais pour compter les fenêtres dans ta boucle de messages, et de n'appeler PostQuitMessage() qu'une fois toutes les fenêtres fermées.
    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.

  3. #3
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    je veux bien compter les fenetre mais j'ai pas de boucle de message

    mais quand je ferme la dernière comment dire a l'autre de ce fermer

  4. #4
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    j'ai essayer autre chose

    d'une j'ai trouver ca dans le FAQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0);
    mais ca a aucun effet

    de deux j'ai trouver ca aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CIomemFR::OnDestroy() 
    {
    	GetParent()->PostMessage(WM_CLOSE);
    	CDialog::OnDestroy();
    }
    mais je ne rentre pas dans mon OnDestroy comment puis je l'appeler d'ici
    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
    16
    17
    18
    19
    20
    LRESULT CALLBACK EscapeIFProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
    		case WM_LBUTTONUP:
    		{
    			//::EndDialog(hWndMe4,0);
                                          *** ici appel de OnDestroy ***
    			break;
    		}
    		case WM_MOUSEMOVE :
    		{
    			SetCursor(handCursor);
    			ShowCursor(TRUE);
    			break;
    		}
     
    	}
    	return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne connais pas suffisamment la gestion des messages pour t'aider. Mais je me demande: peut-être que tu peux faire quelque chose de plus simple. Un simple OnOK() sur une dialog suffit à la fermer. Pourquoi utiliser des messages?

  6. #6
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    je suis d'accord mais mon OnOK ne fermera pas l'ensemble de mes fenètres

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Euh, une petite minute: Je n'avais pas vu que tu étais en MFC.
    Pourquoi as-tu une des WindowProc/DialogProc ?

    PS: Le comptage, tu n'es pas obligé de le faire dans la boucle de message en fait.

    Je te conseillerais mettre un compteur dans ta CWinApp, et dans le OnCreate de chaque fenêtre, faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast< CMonProgrammeApp * >(AfxGetApp())->IncrementerCompteurFenetres();
    Et dans les OnDestroy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static_cast< CMonProgrammeApp * >(AfxGetApp())->DecrementerCompteurFenetres();
    if(static_cast< CMonProgrammeApp * >(AfxGetApp())->GetCompteurFenetres() == 0)
    	::PostQuitMessage(0);
    Avec ce code, l'utilisateur peut fermer les fenêtres dans n'importe quel ordre, et l'application ne se terminera que quand toutes les fenêtres seront fermées.

    Pour fermer d'autres fenêtres, le problème vient du AfxGetMainWnd() qui ne retourne que la fenêtre principale (celle créée dans InitInstance()).
    Si tu veux fermer d'autres fenêtres, tu dois leur envoyer WM_SYSCOMMAND(SC_CLOSE) ou simplement WM_CLOSE. Mais pour cela, il te faut l'adresse de l'objet CWnd, ou le HWND de la fenêtre destinataire.
    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.

  8. #8
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    ok je suis d'accord avec tous ca mais je n'arrive pas a entre dans mon OnDestroy a partir de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LRESULT CALLBACK EscapeIFProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par Médinoc
    Euh, une petite minute: Je n'avais pas vu que tu étais en MFC.
    Pourquoi as-tu une des WindowProc/DialogProc ?



    PS: L'équivalent de OnDestroy dans une WindowProc, c'est case WM_DESTROY.
    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.

  10. #10
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    la parcontre je comprend pas

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Je ne vois pas ce que tu ne comprends pas.

    Déjà, il y a un problème : Tu es en MFC, donc normalement tu n'as pas de fenêtre avec une WindowProc(). Et pourtant, tu as des windowprocs de définies : EscapeIFProc, ExitProc et EscapeProc.
    Comment se fait-ce ?

    Ensuite, c'est normal que tu ne puisse pas entrer dans un OnDestroy depuis une WindowProc, puisque OnDestroy est un callback MFC.

    Mais l'implémentation de MFC (avec les MessageMaps) équivaut à ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case WM_DESTROY:
    	this->OnDestroy();
    	break;

    Donc, si tu veux faire un truc quand une fenêtre non-MFC est détruite, tu dois faire ça dans le case WM_DESTROY.
    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.

  12. #12
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    Déjà, il y a un problème : Tu es en MFC, donc normalement tu n'as pas de fenêtre avec une WindowProc(). Et pourtant, tu as des windowprocs de définies : EscapeIFProc, ExitProc et EscapeProc.
    Comment se fait-ce ?
    non y'a pas de problème, EscapeIFProc, ExitProc et EscapeProcne sont des windowprocs ce sont des fonctions qui sont codée dans le .cpp de ma classe mais qui ne sont pas des méthode de ma classe

  13. #13
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    PS: pardon si je ne comprend pas tous mais c'est code que je doit reprendre derrière un collègue qui est en vacance et je ne comprend pas tous ce qu'il a fait

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par Cirdan Telemnar
    non y'a pas de problème, EscapeIFProc, ExitProc et EscapeProcne sont des windowprocs ce sont des fonctions qui sont codée dans le .cpp de ma classe mais qui ne sont pas des méthode de ma classe
    Moi, j'appelle ça un problème, d'organisation cette fois-ci.

    Citation Envoyé par Cirdan Telemnar
    PS: pardon si je ne comprend pas tous mais c'est code que je doit reprendre derrière un collègue qui est en vacance et je ne comprend pas tous ce qu'il a fait
    OK, c'est pardonnable alors.


    Ce qui me hérisse un peu le poil, c'est qu'on mélange des fenêtres MFC et des fenêtres non-MFC au point de les mettre dans le même code source. On pourrait permettre ça pour des contrôles, mais pour des fenêtres qui ont une interaction aussi forte, c'est pas évident.

    Bon, pour essayer de t'aider, il va falloir parer aux lacunes les plus graves:
    • Quel est ton niveau pour les fenêtres/boîtes de dialogue MFC ?
    • Quel est ton niveau pour les fenêtres/boîtes de dialogue Non-MFC ?
    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.

  15. #15
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    Quel est ton niveau pour les fenêtres/boîtes de dialogue MFC ? Bon

    Quel est ton niveau pour les fenêtres/boîtes de dialogue Non-MFC ? Null

  16. #16
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    je pense avoir une solution qui marche mais il faut passer par OnDestroy
    et la fonction EndDialog ne mi fait pas passer, y'a t'il un fonction du même style que me ferais passer par OnDestroy et donc passer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetParent()->PostMessage(WM_CLOSE);

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Normalement, une boîte de dialogue "marquée" par EndDialog() reçoit le message WM_DESTROY au moment de sa destruction, comme les autres fenêtres.

    Si c'est une boîte de dialogue non-MFC, tu dois mettre ton code dans son case WM_DESTROY.
    Si c'est une boîte de dialogue MFC, tu dois mettre ton code dans son OnDestroy(), et vérifier qu'il figure bien dans la Message Map.
    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.

  18. #18
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    deja d'une comment savoir quel est le type de ma boite de dialog (MFC ou NON)

    parcontre quand je suis en mode debug je ne rentre pas dans mon OnDestroy

    et je c'est pas si je peux mettre mon code dans "case WM_DESTROY" vu que j'en ai pas

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Houlà, y'a des trucs à reprendre depuis le début.
    • Boite de dialogue ou fenêtre MFC: Est attachée à une classe dérivée de CWnd, possède une MessageMap() et des fonctions OnXxxxxx().
    • Boite de dialogue ou fenêtre non-MFC: Possède une WindowProc() ou une DialogProc, qui contient un switch().
      S'il n'y a pas de case WM_XXXXX (messages standard de Windows, la plupart sont déclarés dans <winuser.h>), ben on rajoute le case dans le switch, tout simplement!
      Et pour une fenêtre avec une WindowProc, on n'oublie pas, dans le default du switch, d'appeler DefWindowProc(). Pour une DialogProc(), ce n'est pas la peine: À la place, on retourne FALSE.
    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.

  20. #20
    Membre confirmé Avatar de Cirdan Telemnar
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    comment tu fais fenêtre non-MFC

Discussions similaires

  1. Réponses: 36
    Dernier message: 23/05/2007, 17h54
  2. [debutant] Fermeture de fenetre
    Par wkd dans le forum Agents de placement/Fenêtres
    Réponses: 26
    Dernier message: 04/06/2004, 17h01
  3. [MFC] Ctrl/Alt+touches avec PostMessage
    Par Fladnag dans le forum MFC
    Réponses: 4
    Dernier message: 10/02/2004, 14h33
  4. Réponses: 3
    Dernier message: 03/02/2004, 17h34
  5. Réponses: 6
    Dernier message: 27/01/2004, 16h08

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