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 :

Menu dynamique [FAQ]


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut Menu dynamique
    Bonjour,
    Je ne sais pas si je suis dans le bon forum la...

    Je voudrai juste faire un menu dynamique avec les mfc...
    Bon, je n'y connais rien et je n'ai pas le temps de comprendre la mecanique...

    En gros, j'ai cree un menu qui contient un sous-menu avec une seule valeur (dummy) et son ID.
    Apparement, grace a cette valeur qui devra disparaitre, le programme retrouvera mon menu a mettre a jour.
    Voila donc mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HMENU *test = new HMENU();
     
       MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
     
        mii.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
    	mii.wID = ID_LANGUES_DUMMY + 1;
        mii.hSubMenu = *test;
        mii.dwTypeData = _T("coucou");
     
    InsertMenuItem ( *test, ID_LANGUES_DUMMY, TRUE, &mii );
    Si j'ai bien compris, il doit me creer un item au niveau juste en dessous de "dummy" de nom "coucou".
    Pourtant rien ne se passe...
    Quelqu'un pourrai m'expliquer?
    Merci!

    Vincent

  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
    Par défaut
    salut,
    si tu utilises les MFC pourquoi ne pas utiliser la classe CMenu ?
    exemple:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    // exemple d'implémentation d'un classe Menu améloriée.
    class CMenuEx:public CMenu
    {
    public:
        CMenuEx():CMenu(){}
        // initialise le contexte avec le parent
        void InitPopupMenu(const CWnd *pWnd)
            {    
               CPoint Point;
              DWORD dwPos;
     
               dwPos = GetMessagePos(); 
           Point.x = LOWORD (dwPos);
           Point.y = HIWORD (dwPos);
     
           TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
               Point.x,
               Point.y,
               pWnd);    // owner is the main application window     
            }
     
        // ajoute un item au menu : sa position ,son IdControle,son texte.
        void AddPopupMenuItem(const int nindex,const UINT nicmd,LPCTSTR szitem)
            {
               InsertMenu(nindex,MF_BYPOSITION | MF_STRING ,nicmd,szitem);
            } 
     
        // ajoute un item separator.
        void AddPopupMenuSeparator(const int nindex)
            {
                InsertMenu(nindex,MF_BYPOSITION | MF_SEPARATOR ,0,"");
            }    
    };
     
    // utilisation
    char *tblm[]=
    {
        "Copier",
        "Coller",
        "Associer"
    };
     
        UINT tblid[]=
        {
            ID_MENU_COPY, 
            ID_MENU_PAST,
            ID_MENU_LINK
        };
     
        CMenuEx *m_pMenu = new CMenuEx;
        for(int i=0;i<sizeof(tblid)/sizeof(UINT);i++)
            m_pMenu->AddPopupMenuItem(i,tblid[i],tblm[i]);
    // appel
    m_pMenu->InitPopupMenu(this); // this== fenetre concernée..

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Salut!
    Merci pour ta reponse!

    Par contre, quand j'essaie ton code, je n'arrive pas a compiler a cause de ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InsertMenu(nindex,MF_BYPOSITION | MF_STRING ,nicmd,szitem);
    et ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
               Point.x,
               Point.y,
               pWnd);    // owner is the main application window
    L'erreur de compilation est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2660: 'InsertMenuA' : la fonction ne prend pas 4 arguments
    Apres recherche, je trouve la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define InsertMenu  InsertMenuA
    Je ne sais pas a quoi cela peut servir (ce n'est pas mon code et je ne connais rien aux mfc)

    J'ai essaye de rajouter :: devant l'appel aux deux fonctions mais il ne veut pas les prendre...

  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
    Par défaut
    salut,
    pour le TrackPopupMenu voici la correction:
    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
     
    class CMenuEx:public CMenu
    {
    public:
        CMenuEx():CMenu(){}
        // initialise le contexte avec le parent
        void InitPopupMenu(const CWnd *pWnd)
            {    
               CPoint Point;
              DWORD dwPos;
     
               dwPos = GetMessagePos(); 
           Point.x = LOWORD (dwPos);
           Point.y = HIWORD (dwPos);
     
           TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,
               Point.x,
               Point.y,
               const_cast<CWnd *>(pWnd));    // owner is the main application window     
            }
     
        // ajoute un item au menu : sa position ,son IdControle,son texte.
        void AddPopupMenuItem(const int nindex,const UINT nicmd,LPCTSTR szitem)
            {
               InsertMenu(nindex,MF_BYPOSITION | MF_STRING ,nicmd,szitem);
            } 
     
        // ajoute un item separator.
        void AddPopupMenuSeparator(const int nindex)
            {
                InsertMenu(nindex,MF_BYPOSITION | MF_SEPARATOR ,0,_T(""));
            }    
    };
    pour l'autre erreur, tu as utilisé ma classe ?
    c'est bizarre cette méthode de la classe CMenu prend bien 4 arguments.
    tu ne me dis pas tout...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Si je ne te dis pas tout, c'est vraiment a l'insu de mon plein gré la...

    Voila le code que j'ai ecris a partir du tien :
    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
     
    	// utilisation
    	char *tblm[]=
    	{
    		"Copier",
    		"Coller",
    		"Associer"
    	};
     
    	CMenu *m_pMenu = new CMenu;
            for(int i=0;i<3;i++)
    	     ::InsertMenu(i,MF_BYPOSITION | MF_STRING ,ID_TEST+ i,tblm[i]);
     
    	CPoint Point;
            DWORD dwPos;
     
            dwPos = GetMessagePos(); 
            Point.x = LOWORD (dwPos);
            Point.y = HIWORD (dwPos);
     
    	::TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, Point.x, Point.y, this);    // owner is the main application window
    Et la j'ai donc 2 erreurs de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    error C2660: 'TrackPopupMenu' : la fonction ne prend pas 4 arguments	
    error C2660: 'InsertMenuA' : la fonction ne prend pas 4 arguments
    Quand je fais un CTRL + SPACE sur InsertMenu, il me dit en effet qu'il faut 5 arguments dont le premier est un HMENU...

    De plus, quelque part dans ce code, j'ai ca dont je ne comprends pas l'utilite mais que je pressens comme etant la cause de mes ennuis de compilation...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define InsertMenu  InsertMenuA

  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
    Par défaut
    re,
    c'est bien ce que je disais ...
    tu n'utilises pas ma classe ,
    donc la fonction InsertMenu utilisée ne correspond plus à la méthode de la classe CMenu mais à l'api WIN32...
    si veux absolument travailler en api32 il faut travailler avec un handle etc...
    d'ou la remarque de mon premier post....

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Haaaa!
    Donc avec ta classe derivant de CMenu, tu pointe directement sur la bonne methode InsertMenu alors que moi, je pointe sur l'API...
    C'est bien ca?

    Humm... c'est de plus en plus louche ces MFC!

    Je test ca!

    Merci en tout cas...

  8. #8
    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
    Par défaut
    Citation Envoyé par vince3320
    Haaaa!
    Donc avec ta classe derivant de CMenu, tu pointe directement sur la bonne methode InsertMenu alors que moi, je pointe sur l'API...
    C'est bien ca?

    Humm... c'est de plus en plus louche ces MFC!

    Je test ca!

    Merci en tout cas...
    oui c'est ça,
    il n'y a rien de louche la dedans ,les MFC encapsulent l'api 32 dans des classes...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    il n'y a rien de louche la dedans ,les MFC encapsulent l'api 32 dans des classes...
    Ok!
    Je ne savais pas.
    Je n'ai pas eu le temps de me renseigner sur le fonctionnement global... C'est un peu la misere la...

    Mais alors, si j'ai bien compris, ceci devrait marcher :
    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
     
     
    	// utilisation
    	char *tblm[]=
    	{
    		"Copier",
    		"Coller",
    		"Associer"
    	};
     
    	CMenu *m_pMenu = new CMenu;
            for(int i=0;i<3;i++)
    	  m_pMenu->InsertMenu(i,MF_BYPOSITION | MF_STRING ,ID_TEST + i,tblm[i]);
     
    ....
    En fait, ce code explose sur un assert lors de l'execution...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ASSERT(::IsMenu(m_hMenu));
    Il me semble bien ne plus passer par l'API...

    PS : Je mettrai le tout proprement dans une classe apres.

  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
    Par défaut
    re,
    bon j'ai oublié l'appel à CreatePopupMenu():
    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
    // utilisation
    char *tblm[]=
    {
        "Copier",
        "Coller",
        "Associer"
    };
     
        UINT tblid[]=
        {
            ID_MENU_COPY, 
            ID_MENU_PAST,
            ID_MENU_LINK
        };
        
        CMenuEx *m_pMenu = new CMenuEx;
        m_pMenu->CreatePopupMenu(); // creation du popup menu.
        for(int i=0;i<sizeof(tblid)/sizeof(UINT);i++)
            m_pMenu->AddPopupMenuItem(i,tblid[i],tblm[i]);
    // appel
    m_pMenu->InitPopupMenu(this); // this== fenetre concernée..
    mais toi tu n'utilises toujours pas ma classe puisque tu as créés un CMenu et non un CMenuEx.....

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Oui pour le moment, j'utilise un CMenu tout court car il y a deja une classe derivant de CMenu dans mon projet.
    Donc avant de rajouter les fonctions dont j'ai besoin a cette classe, je voudrai le faire marcher avec des CMenu directement.
    Normalement, au niveau comportement, c'est la meme chose, non?

    Ce code la fonctionne :
    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
     
    	// utilisation
    	char *tblm[]=
    	{
    		"Copier",
    		"Coller",
    		"Associer"
    	};
     
    	CMenu *m_pMenu = new CMenu;
    	m_pMenu->CreatePopupMenu();
        for(int i=0;i<3;i++)
    		 m_pMenu->InsertMenu(i,MF_BYPOSITION | MF_STRING ,ID_LANGUES_DUMMY + i,tblm[i]);
     
     
    	CPoint Point;
        DWORD dwPos;
     
        dwPos = GetMessagePos(); 
        Point.x = LOWORD (dwPos);
        Point.y = HIWORD (dwPos);
     
    	m_pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, Point.x, Point.y, this);    // owner is the main application window
    Pourtant, il n'a aucune influence sur mon menu.
    A la main, j'ai cree un menu langue, dans lequel j'ai mis un item "dummy".
    J'ai reference cet item avec ID_LANGUES_DUMMY et j'ai laisse une dizaine de place derriere cet ID.
    Je pensais donc qu'il allait ecraser "dummy" par "Copier" puis mettre les autres a la suite...
    Ce n'est pas comme cela qu'il faut faire?

    Merci de ton aide!!

  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
    Par défaut
    heu ça n'a rien a voir !,
    la on créé un menu dynamique ,et maintenant tu me parles d'un menu dans les ressources .
    c'est deux choses différentes...
    pour lire un menu stocké dans les ressources il faut utiliser la fonction LoadMenu. (et donc ne plus faire CreatePopupMenu)



  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut

    Désolé...

    Bon donc, oui je voudrai un menu dans les ressources!

    J'ai donc remplacer le CreatePopupMenu par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_pMenu->LoadMenu(IDR_MAINFRAME);
    Résultat :
    pas de mise a jour de mon menu...
    Mon "dummy" apparait toujours malgre le bon deroulement du code...

    A quoi cela peut il etre du?

  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
    Par défaut
    il faut adapter les indices dans le InsertMenu.
    si ton menu existe déjà, l'indice d'insertion correspond à la numérotation des items dans le menu (voir doc MSDN: MF_BYPOSITION).
    donc si tu inseres sur un indice existant ça ne fonctionne pas...
    c'est expliqué dans la doc MSDN et il y a des exemples.
    [edit]
    de plus tu lis mainframe donc tous les menus.
    le fonctionnement des menus c'est comme un arbre chaque menu est une branche chaque item peut être une branche ou une feuille.
    LoadMenu te donne la racine ,pour acéder au premier menu il faut utiliser GetSubMenu. 0 pour le premier menu etc...
    [/edit]

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    alors, apres recherche, voici le nouveau code :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    // FindMenuItem() will find a menu item string from the specified
    // popup menu and returns its position (0-based) in the specified 
    // popup menu. It returns -1 if no such menu item string is found.
    int FindMenuItem(CMenu* Menu, LPCTSTR MenuString)
    {
       ASSERT(Menu);
       ASSERT(::IsMenu(Menu->GetSafeHmenu()));
     
       int count = Menu->GetMenuItemCount();
       for (int i = 0; i < count; i++)
       {
          CString str;
          if (Menu->GetMenuString(i, str, MF_BYPOSITION) && (strcmp(str, MenuString) == 0))
             return i;
       }
     
       return -1;
    }
     
    void CMainFrame::createLanguageMenu()
    {
    	// Recherche du menu "Fichier"
    	CMenu* mmenu = GetMenu();
     
    	int pos = FindMenuItem(mmenu, "&Fichier");
    	if (pos == -1)
          return;
     
     
    	CMenu* mmenuFichier = mmenu->GetSubMenu(pos);
    	// Recherche du menu "Langues"
    	pos = FindMenuItem(mmenuFichier, "&Langues");
    	if (pors == -1)
          return;
     
    	 CMenu* mmenuLangues = mmenuFichier->GetSubMenu(pos);
    	// Recherche du menu "dummy"
    	pos = FindMenuItem(mmenuLangues, "&dummy");
    	if (pos > -1)
    	{
    		UINT id = mmenuLangues->GetMenuItemID(pos);
    		CString lang = "coucou";
    		mmenuLangues->ModifyMenu(id, MF_BYCOMMAND, id, lang);
    	}
    ...
    }
    Il trouve bien tous mes menus (cool) mais rien ne se passe apres la modification...
    Pourtant ce code est pris sur l'exemple de la msdn...

    http://msdn.microsoft.com/library/de...insertmenu.asp

  16. #16
    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
    Par défaut
    donc finalement rien a voir avec les menus dynamiques ,tu cherches à modifier le menu principal de l'application ....
    c'est quoi ton application du SDI / MDI ?
    si c'est du MDI voir faq: http://c.developpez.com/faq/vc/?page...tMenuActiveMDI

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Je dirai du MDI a vu de nez...

    J'ai regarde le lien de la FAQ mais je ne comprends pas comment ca marche.

    En gros, il faudrait que je rajoute ceci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	CMultiDocTemplate* pDocTemplate;
    	pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMDIColorViewDoc),RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMDIColorView));
    	AddDocTemplate(pDocTemplate);
     
    	CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared);
     
    	CMenu* mmenu = pTopLevelMenu;
    ...
    Mais a quoi corresponde CMDIColorViewDoc, CChildFrame, CMDIColorView, AddDocTemplate?

  18. #18
    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
    Par défaut
    Citation Envoyé par vince3320
    Je dirai du MDI a vu de nez...

    J'ai regarde le lien de la FAQ mais je ne comprends pas comment ca marche.

    En gros, il faudrait que je rajoute ceci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMDIColorViewDoc),RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMDIColorView));
        AddDocTemplate(pDocTemplate);
     
        CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared);
     
        CMenu* mmenu = pTopLevelMenu;
    ...
    Mais a quoi corresponde CMDIColorViewDoc, CChildFrame, CMDIColorView, AddDocTemplate?
    nan ça ne fonctionne pas comme ça...
    dans Initinstance (classe d'application) tu as des CMultiDocTemplate ou un CSingleDocTemplate ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    J'ai des CMultiDocTemplate mais pas dans la classe Initinstance...

  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
    Par défaut
    Citation Envoyé par vince3320
    J'ai des CMultiDocTemplate mais pas dans la classe Initinstance...
    Farscapevince3320
    qui a dit qu'il y avait une classe InitInstance ?
    la fonction InitInstance de la classe d'application.....

    Puisque tu es en MDI ,le menu actif quand la fenêtre est ouverte sera le menu indiqué dans le CMultiDocTemplate. (cf le post de la faq)
    chaque vue à son menu chargé en memoire .
    le menu que tu as modifié c'est celui de la mainframe, il est actif quand il n'y pas de fenêtre MDI ouverte..
    donc pour modifier le menu attaché à la vue ouverte:
    à partir d'une fonction de la vue idealement : OnInitialUpdate
    tu appliques ce code de la faq pour récuperer le menu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //à partir de la view
    CMultiDocTemplate *pDocTemplate=(CMultiDocTemplate *)GetDocument()->GetDocTemplate();
    CMenu* pTopLevelMenu =CMenu::FromHandle(pDocTemplate->m_hMenuShared);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Free Pascal] Intégrer des valeurs dans un menu dynamique
    Par boullery dans le forum Free Pascal
    Réponses: 16
    Dernier message: 30/03/2005, 17h04
  2. Créer un sous-menu dynamiquement
    Par PurL dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/09/2004, 10h31
  3. [JSP]menu dynamique en jsp
    Par laouedjahmed dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 22/03/2004, 10h50
  4. Menu dynamique sous Flash MX
    Par dens63 dans le forum Flash
    Réponses: 7
    Dernier message: 29/10/2003, 15h46

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