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 :

Ouvrir une fenêtre à partir d'un menu


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Ouvrir une fenêtre à partir d'un menu
    Bonjour à tous,

    Avant d'aller plus loin, je précise que je suis complètement novice en MFC.

    J'ai réussi à créer une dialog avec un menu. Maintenant j'essaye de faire un truc tout simple. J'ai crée un item "About my application" comme sous-menu. J'aimerais que lorsque l'on clique dessus, une fenêtre toute simple, même vide pour l'instant, s'ouvre.

    Problème, je ne vois pas comment faire. J'ai cherché sur le net et j'ai entendu parlé du Class Wizard mais pour le menu j'ai pas ça, j'ai un "Add Event Handler" seulement (qu'il doit falloir utiliser j'imagine).

    Mes questions sont les suivantes :

    1) Question simple mais ça me prend un peu la tête, je n'arrive pas à retrouver le code généré par visual à partir des ressources (de mon menu par exemple). Si seulement je pouvais l'étudier, je comprendrais mieux

    2) Comment faire simplement ce que je veux faire?

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Je précise...

    J'ai essayé d'ajouter du code et résultat : plantage général.
    Heureusement et merci SVN, tout est remis rapidos.
    Maintenant, je pense qu'il faut utiliser le "Event Handler Wizard". Seulement, faut-il que je crée la dialog avant ou je le fait dans le code (Edit Code) lorsque j'utilise le Wizard?

  3. #3
    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 te conseil de jeter un œil à mon tuto sur les MFC.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Salut,

    C'était ce que j'étais en train de lire avant de venir voir .
    Super tuto en tout cas, ça m'a permis de bien dégrossir.

    Alors si j'ai bien compris (ça parle pas directement de menu). Pour faire ce que je veux faire, c'est à dire lorsque que je clique sur un item de mon menu ouvrir une autre fenêtre, il faut :

    - créer un autre dialog dans les ressources, la nommer.
    - créer la classe correspondante avec le class wizard
    - gérer juste le message d'initialisation (WM_INITDIALOG) et rien d'autre vu que je la veux vide pour l'instant
    - implémenter l'appel à la boite de dialogue à partir de mon menu : ajouter un event handler sur mon item, et compléter la fonction correspondante dans le
    code de la vue comme suivant :

    void AppliView::OnHelp()
    {
    CdlgAppli Dlg;
    ????
    }

    Y'a que ça à mettre dans la fonction? Il doit manquer des choses, faudrait pas ajouter un DoModal() pour afficher la fenêtre?

    Sinon, j'ai rien oublié?

    Merci d'avance!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour

    void AppliView::OnHelp()
    {
    CdlgAppli Dlg;
    ????
    }
    faut ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void AppliView::OnHelp()
    {
    CdlgAppli Dlg;
    Dlg.DoModal();
    }
    cordialement

  6. #6
    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,
    oui c'est ça , tu trouveras aussi l'utilisation de la boite de dialogue dans mon tuto ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void AppliView::OnHelp()
    {
      CdlgAppli Dlg;
     if(Dlg.DoModal()==IDOK)
     {
     // traitement ok
     }
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Wep c'est ce que je pensais, c'est super simple en réalité!!

    Bon avant de dire ça, je vais tester quand même, on sait jamais

    Merci beaucoup en tout cas

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Petit problème, j'ai réussi à générer la classe correspondant à la fenêtre, j'ai déplacé le code dans le bon répertoire mais à la compile l'instruction suivante ne fonctionne pas bien dans le .h:

    enum { IDD = IDD_HELP };

    Voici mon fichier .h entier :

    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
    #pragma once
     
    // CDlgHelp dialog
     
    class CDlgHelp : public CDialog
    {
    	DECLARE_DYNAMIC(CDlgHelp)
     
    public:
    	CDlgHelp(CWnd* pParent = NULL);   // standard constructor
    	virtual ~CDlgHelp();
     
    // Dialog Data
    	enum { IDD = IDD_HELP };
     
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     
    	DECLARE_MESSAGE_MAP()
    };
    L'erreur retournée est "c:\dev\Projet\dialogs\DlgHelp.h(17): error C2065: 'IDD_HELP' : undeclared identifier"

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47

  10. #10
    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 tu passes par les assistants , tu ne dois pas avoir ce genre de problèmes .
    je ne vois pas pourquoi tu "déplaces du code dans le bon répertoire"

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Comme dit au-dessus, c'est résolu, manquait juste un include .
    J'ai simplement déplacé mes fichiers parce que l'assistant l'a mis à la racine de mon projet et pas dans la partie ui...

    Sinon, j'ai encore un problème. Je ne trouve pas où gérer le message d'initialisation WM_INITDIALOG...Je suis sous Visual 2003 et le Class Wizard ne me permet que de créer les classes (un seul onglet) et je ne trouve pas où gérer les messages...

    Edit : J'ai trouvé une liste de message que la dialog peut gérer. Mais pas de WM_INITDIALOG.

  12. #12
    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 places le curseur sur la ligne END_MESSAGE_MAP() et tu fais Alt+Entrée
    le panneau propriétés apparait.
    tu clic sur le bouton après celui en forme d'éclair.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Oui c'est là ou j'étais.
    Seulement dans la liste de message disponibles, je passe de WM_ICONERASEBKGND à WM_INITMENU et donc pas de WM_INITDIALOG très étrangement...

  14. #14
    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
    ah oui, OnInitDialog c'est une méthode virtuelle c'est le bouton d'après...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Edit : Merci

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Je viens d'implémenter l'appel de la boite de dialogue dans ma vue principale.
    Mais ça ne marche toujours pas (mais on se rapproche ).

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void AppliView::OnHelpAbout()
    {
    	CDlgHelp DlgHelp;
    	DlgHelp.DoModal();
    }
    Je sais que le message lorsque l'on clique sur l'item du menu est bien intercepté car lorsque je remplace ce code par un simple exit, l'appli se ferme bien.

    Voici mon .h de la clase CDlgHelp :

    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
    #include "res/resource.h"
    #pragma once
     
    // CDlgHelp dialog
     
     
    class CDlgHelp : public CDialog
    {
    	DECLARE_DYNAMIC(CDlgHelp)
     
    public:
    	CDlgHelp(CWnd* pParent = NULL);   // standard constructor
    	virtual ~CDlgHelp();
     
    // Dialog Data
    	enum { IDD = IDD_HELP };
     
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     
    	DECLARE_MESSAGE_MAP()
     
    public:
    	virtual BOOL OnInitDialog();
    };

    Et mon fichier 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
    32
    33
    34
    35
    36
    37
    38
    #include "stdafx.h"
    #include "DlgHelp.h"
    #include ".\dlghelp.h"
     
     
    // CDlgHelp dialog
     
    IMPLEMENT_DYNAMIC(CDlgHelp, CDialog)
    CDlgHelp::CDlgHelp(CWnd* pParent /*=NULL*/)
    	: CDialog(CDlgHelp::IDD, pParent)
    {
    }
     
    CDlgHelp::~CDlgHelp()
    {
    }
     
    void CDlgHelp::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
     
     
    BEGIN_MESSAGE_MAP(CDlgHelp, CDialog)
    END_MESSAGE_MAP()
     
     
    // CDlgHelp message handlers
     
    BOOL CDlgHelp::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// TODO:  Add extra initialization here
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// EXCEPTION: OCX Property Pages should return FALSE
    }
    Manquerait pas un SHOW ou quelque chose comme ça parce sinon ça me semble correct...
    (La fenêtre est vide à part les deux boutons OK et CANCEL par défaut)

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Arf en mode débug, ça marche...j'ai du mal avec VS...

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    J'ai beau investiguer, je ne trouve pas pourquoi les deux comportements sont différents.
    Je lance l'éxécutable "debug", ça marche parfaitement, la fenêtre apparait.
    Je lance l'éxécutable "release", la fenêtre n'apparait pas.

    Pourquoi à votre avis?

  19. #19
    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
    il n'y a pas de raison,
    tente une régénération en release.
    il n'est pas impossible que ta manipulation de déplacement de source y pour quelque chose..
    pour voir si la commande est appelée, place un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AfxMessageBox("dialogue",MB_ICONEXCLAMATION);
    avant l'appel de DoModal.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Un rebuild a effectivement résolu tout ça.

    Merci beaucoup pour l'aide en tout cas

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

Discussions similaires

  1. ouvrir une fenêtre à partir d'un bouton
    Par minerva dans le forum C#
    Réponses: 1
    Dernier message: 16/10/2010, 11h40
  2. Ouvrir une fenêtre à partir d'un type="radio"
    Par mioke dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/08/2008, 16h44
  3. ouvrir une fenêtre à partir d'une autre
    Par zikos dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 20/05/2008, 04h42
  4. Ouvrir une fenêtre à partir d'une Popup
    Par Sytchev3 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/10/2007, 11h46

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