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 :

Pop-up d'une dialog box a partir d'un bouton


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Pop-up d'une dialog box a partir d'un bouton
    Salut,


    J'suis bloque sur Visual en MFC. J'ai cree une boite de dialogue que j'aimerais ouvrir en appuyant sur un bouton depuis ma boite de dialogue principale mais j'ai aucune idee de comment faire. Quelqu'un a une idee?


    Cimer

  2. #2
    pdl
    pdl est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Très simple, si AddBoitier est ta classe de type CDialog, alors tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    AddBoitier dlg(*myConn);
     
    	if (dlg.DoModal()==IDOK)
    	{
    		//Mettre ton code ici
    	}
    Et c'est tout.

    Bien à toi,

  3. #3
    Bob
    Bob est déconnecté
    Membre averti
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Points : 378
    Points
    378
    Par défaut boite de dialogue
    Si tu n'utilise pas les MFC, utilise le message WM_COMMAND pour detecter une pression sur ton bouton, puis DialogBox() pour creer la nouvelle boite de dialogue a partir des resources.

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 125
    Points : 117
    Points
    117
    Par défaut Pour afficher ta boite de dialogue...
    ke ce soit depuis un bouton ou depuis un menu,le processus est le meme...

    Tu vas dans les ressources,tu crees ton dialogue.
    Kan tu aurais fini de creer ton dialogue,tu appuies la combinaison Ctrl+W pour acceder a ClassWizard.
    Une fenetre te demande de creer une classe pour ton dialogue,tu le fais.

    Toujours dans classwizard,tu selectionnes l'ID (IDC_BOUTON21 pqr exemple)du bouton sur lekel tu veux detecter le clik creant l'ouverture du dialogue.
    Tu selectionne la classe CMonAplliDoc et tu cli sur ajouter la fonction.

    Tu obtiendras le code suivant:
    CMonAppliDoc::OnBouton21()
    {
    CMonDialogue dlg;
    dlg.DoModal();
    }


    Du courage,mais si t'avais deja resolu ton inquietude,mets le tag [Resolu]
    Merci

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Bonjour, Désolé pour le remontage de topic mais voila je viens de tester ca sur mon projet et aucune fenetre ne s'affiche

    J'ai un bouton ID_BOUTON_1 dans ma fenetre principale MainFrm.cpp
    Je créer ma dialog dans les ressources, je créer la classe associer CMyDlg
    Il me crée un MyDlg.cpp
    Je selectionne mon ID_BOUTON_1 dans le classwizard et je selectionne Mainfrm.cpp et la je clique sur COMMAND

    Dans l'exemple au dessus je vois pas c'est quoi la classe MonAppliDoc

    Merci

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    dans les ressources , ouvres la boite de dialogue principale ou tu as crée le bouton .
    et Double click sur le bouton , il va te proposer automatiquement un nom de fonction . tu cliques OK et tu peux mettre ton code correspondant au click de ce bouton . c'est a dire ouvrir ta 2eme boite de dialague avec le code donné précedemment .

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    J'ai reussi avec CDialog dlg(ID_MABOITEDEDIALOGUE)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    remontage de topic encore
    en fait, c quasi le mem prob (a partir d'un menu, pas d'un bouton), donc je crée pas d'autre topic, mais si necessaire pas de souci

    sous visual studio 2003:

    donc comme l'a si bien indiqué feed_our_vision, je vais dans la vue ressource, click droit sur app.rc, add resource, puis dialog, puis new, ensuite click droit sur la boite de dialogue(elle a juste deux bouton ok, et cancel par defaut, je laisse tel quel), add class, et je rempli, mais je peux pas choisir le bouton/menu qui va ouvrir cette boite de dialogue.
    je vais dans la fonction du menu en question, je rajoute le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMonDialogue dlg;
    dlg.DoModal();
    ca compile (en rajoutant le bon include), mais qd je click sur le menu voulu, j'ai un "debug assertion failed" :/
    j'ai vu d'autre code, comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dlg->Create(...)
    dlg->ShowWindow(...)
    avec dlg en pointeur, mais je pense mal remplir les param, car je cast, et au final, ca fait le meme resultat qu'avec Domodal()

    qu'est que je fais pas ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    si ça plante sur le doModal,
    c'est qu'il y a peut etre entre les controles et les variables attachées.
    dans ce cas remonte la pile des erreurs ,pour trouver l'appel dans ton code qui provoque l'assertion.
    ou donne nous la ligne de code qui provoque l'erreur.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par farscape
    si ça plante sur le doModal,
    c'est qu'il y a peut etre entre les controles et les variables attachées.
    dans ce cas remonte la pile des erreurs ,pour trouver l'appel dans ton code qui provoque l'assertion.
    ou donne nous la ligne de code qui provoque l'erreur.
    voila les fichiers generés par la dialogbox, que j'ai appelé optionbox, car c'est la boite de dialogue pour les options:

    pour le .h
    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
    21
    #pragma once
    #include "resource.h"
     
    // Optionbox dialog
     
    class Optionbox : public CDialog
    {
    	DECLARE_DYNAMIC(Optionbox)
     
    public:
    	Optionbox(CWnd* pParent = NULL);   // standard constructor
    	virtual ~Optionbox();
     
    // Dialog Data
    	enum { IDD = IDD_DIALOG1 };
     
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     
    	DECLARE_MESSAGE_MAP()
    };
    pour le .cpp
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    // optionbox.cpp : implementation file
    //
     
    #include "stdafx.h"
    //#include "win_pnt4.h"
    #include "optionbox.h"
     
     
    // Optionbox dialog
     
    IMPLEMENT_DYNAMIC(Optionbox, CDialog)
    Optionbox::Optionbox(CWnd* pParent /*=NULL*/)
    	: CDialog(Optionbox::IDD, pParent)
    {
    }
     
    Optionbox::~Optionbox()
    {
    }
     
    void Optionbox::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
     
     
    BEGIN_MESSAGE_MAP(Optionbox, CDialog)
    END_MESSAGE_MAP()
     
     
    // Optionbox message handlers
    pr le moment, j'ai rien mis dedans, visual a generée la boite de dialogue avec deux boutons ok, et cancel.

    et pour le code qui plante, effectivement, ca doit etre au domodal, mais pourquoi ?
    voila la fonction appellé lors d'un click sur le menu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private: System::Void menuItem2_Click(System::Object *  sender, System::EventArgs *  e)
    		 {
    			 Optionbox op_;
    			 op_.DoModal();
    //			 this->optionbox = new Optionbox((CWnd *)get_Handle().ToPointer());
    //			 this->optionbox->DoModal();
    //			 this->optionbox->Create((LPCTSTR)Optionbox::IDD);
    //			 this->optionbox->ShowWindow(SW_SHOW);
    		 }
    qq essai en commentaires ...
    si je met:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AfxMessageBox("coucou");
    a la place, ca marche, donc ca viens pas du menu
    8)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    je suis tjrs dessus, entre deux bout de code ...

    Citation Envoyé par Sh4rk
    J'ai reussi avec CDialog dlg(ID_MABOITEDEDIALOGUE)
    moi, la classe generée prend un cWnd* en entrée, du coup, je sais pas quoi mettre :
    autres questions, ya pas un moyen moins couteux pour recuperer le HWnd que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (HWND)get_Handle().ToPointer()
    et c quoi la diff avec cWnd :

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    bon, j'ai en parthwe trouvé ce que je cherchais, ie passer de hwnd a cwnd, mais ca marche tjrs pas, et j'ai bien l'impression de me compliquer la vie
    http://www.codeguru.com/forum/showth...highlight=cwnd
    ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CWnd* pWnd = CWnd::FromHandle((HWND)get_Handle().ToPointer());
    			 Optionbox op_(pWnd);
    			 op_.DoModal();
    mais ca sort tjrs et encore avec un assert des que je click sur le menu

  13. #13
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut, quel est le plantage exact en fait (message d'erreur, assertion) ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Brouzouf
    Salut, quel est le plantage exact en fait (message d'erreur, assertion) ?
    j'ai mis des breakpoint sur les trois ligne, et il sort bien sur le domodal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    debug assertion failed!
    blahblah
    File: blahblah\vc\MFCATL\ship\atlmfc\include\afxwin1.inl
    ligne: 26
    blahblah :D
    edit --> au fait, salut

    edit2 --> qqun d'autre semble avoir eu un pb analogue mais pas de reponse ...
    http://www.codeguru.com/forum/showth...ht=afxwin1.inl

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu peux preciser ton contexte de projet ?
    ce n'est certainement un application MFC classique.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par farscape
    tu peux preciser ton contexte de projet ?
    ce n'est certainement un application MFC classique.
    alors, j'ai meme refait un nouveau proj, histoire de bien verifier que yaurai pas des pb d'includes...
    je demarre en faisant new project, visual c++, windows forms appli, puis je met un bouton ds la fenetre, et je fais ce qui est decrit plus haut, cad ds ressource, ajouter ds app.rc la boite de dialogue.
    et ca met la meme erreur a domodal.
    bizarrement le constructeur de la boite de dialogue attend un cWnd*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ption(CWnd* pParent = NULL);

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    personne

    je suis la msdn:
    http://msdn.microsoft.com/library/de...menuoption.asp

    In Class View, select the document class (CDisplayDialogDoc). In the Properties window, click the Events button. Double-click the ID of the menu command (ID_VIEW_TEST) in the left pane of the Properties window and select Command. In the right pane, click the down arrow and select <Add> OnViewTest.
    qd je vais dans class view, et que je vois les proprietés de ma classe Option, ds events, je n'ai que IDCANCEL et IDOK, avec des + chacuns.
    mais elle sert a quoi cette etape 4 :
    je viens d'uploader le proj, fait 1mo tout de meme, c'est le .ncb qui est lourd, je sais pas pourquoi ...
    http://zedine.free.fr/visual/test_dialog.rar

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    je continu de chercher, ici un probleme analogue




    http://www.wilmott.com/messageview.c...&threadid=7498

    d'autre topic parle de rajouter ca avt la creation de la boite de dialogue:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    edit --> le modulestate sert probablement au dll importé, donc ca a rien avoir ...
    sinon, ca plante bien au domodal, j'ai mis des messagebox autour d Option opt, et ca passe.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    il plante exactement a la ligne 490 dans dlgcore.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HINSTANCE hInst = AfxGetResourceHandle();

  20. #20
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Salut,
    Je viens de survoler à nouveau ton post.
    Je crois qu'il y a méprise ..
    Tu ne peux mélanger du code .net (windows form) et des MFC .
    en gros sa plante parce que les MFC ne sont pas initialisées.
    Si tu veux utiliser les boites de Dialogues MFC il te faut créer un projet MFC et non windows form (.net).
    ou alors j'ai rien compris au film. (c'est possible).

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/05/2015, 07h41
  2. courbe dans une Dialog Box
    Par danymanix dans le forum MFC
    Réponses: 3
    Dernier message: 15/12/2006, 10h31
  3. Réponses: 9
    Dernier message: 27/07/2006, 14h38
  4. Réponses: 5
    Dernier message: 05/03/2006, 14h39
  5. Réponses: 3
    Dernier message: 22/12/2005, 10h43

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