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

Vue hybride

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

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

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