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 :

Utiliser une seule barre de menu en MDI


Sujet :

MFC

  1. #1
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut Utiliser une seule barre de menu en MDI
    Bonjour à tous,

    Dans un projet MDI, je modifie mes menus au chargement de la fenêtre principale en fonction des droits d'accès de l'utilisateur. Ca, ça marche bien.

    Par contre, je voudrais savoir s'il est possible d'utiliser cette même barre de menu modifiée pour tous mes documents/vues. Car à l'ouverture d'un nouveau document/vue, c'est la barre des menus telle qu'elle est dans les ressources qui apparaît.

    Merci de votre aide !

  2. #2
    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,
    il suffit au moment de la declaration du document template dans initInstance
    de donner le même identifiant IDR_MAINFRAME (si c'est celui que tu as modifié).

  3. #3
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Oui, c'est bien IDR_MAINFRAME que je modifie. Et je n'ai qu'une seule ressource pour ce qui concerne mes menus ; c'est donc celle-ci que pour tous mes documents.
    Mais la modification ne concerne que les menus de la fenêtre principale...

  4. #4
    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 n'as du mettre IDR_MAINFRAME dans le doctemplate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(
            IDR_TESTMDTYPE, // ici il faut mettre IDR_MAINFRAME !!!!!
            RUNTIME_CLASS(CTestMdILayoutDoc),
            RUNTIME_CLASS(CChildFrame), // custom MDI child frame
            RUNTIME_CLASS(CTestMdILayoutView));
        AddDocTemplate(pDocTemplate);

  5. #5
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Si, si, Farscape, je t'assure que j'ai bien mis IDR_MAINRAME a cet endroit ! D'ailleurs, comme je n'ai qu'une seule ressource pour mes menus, ça planterait sinon...

    Le problème vient sans doute du fait que la modification dynamique de mes menus se fait dans le OnCreate de ma fenêtre principale et que je ne modifie que les menus de cette fenêtre principale. Mais je ne sais pas comment faire autrement.

  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
    hum dans ce cas tu devras aussi modifier dynamiquement le menu de la MDI:
    http://c.developpez.com/faq/vc/?page...tMenuActiveMDI

  7. #7
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Tu veux dire qu'à l'ouverture de chaque vue je dois faire les mêmes opérations de modification que celles que j'ai faites pour la fenêtre principale ?
    N'y a-t-il pas moyen de dire qu'on ne veut pas de menu différent pour les vues que ceux de la fenêtre principale ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    J'ignore s'il y a un meilleur moyen, mais je pense que dans le pire des cas, tu peux créer ton menu dynamiquement et faire un SetMenu() ou un truc du genre chaque fois qu'une fenêtre fille MDI reçoit le focus...

  9. #9
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Citation Envoyé par Médinoc
    tu peux créer ton menu dynamiquement et faire un SetMenu()
    Je veux bien, mais je n'y arrive pas. Quand je fais SetMenu sur la vue ou sur la fenêtre qui la contient, ça ne fait rien du tout...

  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
    le remplacement du menu est une solution, tu pourras procéder comme suit:
    commence par faire une classe dérivée de CDocument (si ce n'est pas déjà fait) pour rajouter le code suivant:
    GetDefaultMenu est une fonction virtuelle de CDocument non documentée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HMENU CMyDoc::GetDefaultMenu()
     {
       if (m_DefaultMenu) return m_DefaultMenu;
       return CDocument::GetDefaultMenu();
     }  
    CMyDoc::CMyDoc()
     { 
       // declare un HMenu dans le .h: HMENU m_DefaultMenu;
        m_DefaultMenu = NULL; 
     }
    dans la view dans OnInitialUpdate par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     CMyDoc* pdoc = GetDocument();
    pdoc->m_DefaultMenu =AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
    CMDIFrameWnd* frame=static_cast<CMDIChildWnd*>(GetParent())->GetMDIFrame();   
    frame->MDISetMenu(CMenu::FromHandle(pdoc->m_DefaultMenu), NULL);  
     frame->DrawMenuBar();
    je récupère le menu de la mainframe et l'affecte à la mdi.

    je n'ai pas testé à essayer ....

  11. #11
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Heu... Merci de ta proposition, Farscape, mais ça ne marche pas non plus.
    Ca ne fait aucune erreur, mais au final les menus affichés sont ceux des ressources et non pas ceux de la fenêtre principale.

  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
    Citation Envoyé par PetitPapaNoël
    Heu... Merci de ta proposition, Farscape, mais ça ne marche pas non plus.
    Ca ne fait aucune erreur, mais au final les menus affichés sont ceux des ressources et non pas ceux de la fenêtre principale.
    si si, je viens de tester à l'instant dans un projet bidon ça fonctionne très bien...
    met des points d'arrêts dans les portions de code citées pour vérifier l'exécution...

  13. #13
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    J'ai compris mon erreur : dans le OnInitialUpdate j'avais placé le code que tu proposes après l'appel à CFormView::OnInitialUpdate(). Du coup, la méthode GetDefaultMenu() ne servait à rien...

    Désolé d'avoir cru quelques instants que tu avais fait une erreur. Pourtant je devrais savoir, depuis le temps que je fréquente ce forum, que c'est quasi impossible !

    Merci de votre aide, Farscape et Médinoc !

    J'ai quand même une petite question subsidiaire, Farscape...
    Je suppose qu'il ne faut pas détruire m_DefaultMenu dans le destructeur sous peine de faire planter l'appli car c'est un pointeur sur le menu de la fenêtre principale, et qu'il sera détruit automatiquement en même temps qu'elle. C'est bien ça ?

  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
    oui c'est bien ça ,
    dans le cas ou on affecterait un menu lu directement dans les ressources (donc autonome et non partagé comme ici) on aurait du faire ceci dans la classe document:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CMyDoc::~CMyDoc()
     { 
       if( m_DefaultMenu ) ::DestroyMenu(m_DefaultMenu);
     }

  15. #15
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Super !
    Merci beaucoup !

  16. #16
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Heu...
    En fait, c'est bizarre, mais après affichage de la première vue, l'accès aux sous-menus de l'un des menus ne fonctionne plus, ni lorsqu'une vue est affichée, ni lorsqu'aucune ne l'est.

    Je ne comprends pas. J'ai pourtant mis m_bAutoMenuEnable à false sur ma fenêtre principale et sur les fenêtres contenenant mes vues...

  17. #17
    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
    l'accès aux sous-menus de l'un des menus ne fonctionne plus
    ça veut dire quoi exactement ?
    la fonction de reponse n'est plus appelée ?

  18. #18
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    En fait, quand j'accède pour la première fois à mes menus, tout fonctionne normalement.
    Mais après avoir ouvert la permière vue (et même après l'avoir refermée), mon quatrième menu ne se déroule plus, et je n'ai plus accès à ses sous-menus, alors que je n'ai rien modifié entre temps.

    Je suis en train de faire des tests pour voir d'où ça vient, mais je n'avance pas vraiment.
    En cliquant sur le menu qui pose problème, les méthodes OnInitMenu et OnMenuSelect sont appelées, mais ensuite, je ne sais pas...

  19. #19
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    C'est marrant : j'ai interverti mes menus 3 et 4, et c'est toujours celui qui est en 4ème position qui ne fonctionne pas (celui qui a l'index 3).

  20. #20
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Et il suffit que je mette en commentaire le code que tu as proposé pour dans le OnInitialUpdate de mes vues pour que le menu ne pose plus de problème (mais on retrouve mon problème d'origine)...

Discussions similaires

  1. [XL-2003] fonction mscomm1.input utilisable une seule fois?
    Par Elfstat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2009, 13h02
  2. Réponses: 5
    Dernier message: 27/02/2009, 12h31
  3. Utiliser une seule fois printf
    Par Minouchka dans le forum Débuter
    Réponses: 2
    Dernier message: 16/11/2007, 18h13
  4. utiliser une seule servlet pour toutes les jsp
    Par DoubleU dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 20/09/2007, 19h30
  5. [VB6] Utiliser une Progressbar (barre de progression)
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 29/03/2006, 14h57

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