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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 290
    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 290
    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.

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