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, définir les ID


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut Menu Dynamique, définir les ID
    Bonjour,

    j'utilise des menus créés avec le "resource view" de visual. J'aimerais ajouter dynamiquement des éléments a ces menus.

    Pour ce faire j'utilise la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsertMenuA(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LCPTSTR lpszNewItem = 0);
    j'ai besoin pour mon application de récupérer l'ID des nouveaux Items que je crée dans mes menus. Il faut donc que je donne une valeur a "nIDNewItem" (il ne se passe rien si je le laisse a 0) et cette valeur doit etre différente pour chaque item, sinon tous les items réagissent de la meme façon.

    De plus, je ne peux pas donner une valeur en dur a ces Items car rien ne me dit qu'en avançant dans mon projet, Visual n'attribura pas cette valeur à autre chose.

    J'ai vu que Visual defini : _APS_NEXT_COMMAND_VALUE qui est (entre autre) l'ID disponible pour le prochain élément des menus. Existe-t-il une fonction qui permet d'utiliser cette valeur et de l'incrémenter? ou dois-je partir vers une autre voie pour créer les items?

    merci

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Bonjour,

    Il y a une discussion récente qui pourra t'aider, je pense...

    Quant à utiliser _APS_NEXT_COMMAND_VALUE, tu peux oublier tout de suite, sa valeur étant très peu fiable...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une solution peut aussi passer par MNS_NOTIFYBYPOS. Alors tu n'utilise plus d'ID mais la position. Si ton menu est complètement dynamique, ça peut être plus pratique que les IDs. Si tu as des éléments non dynamique, il vaut mieux mixer avec GetMenuItemID pour ne pas être trop dépendant (pour les éléments statiques) de la structure du menu.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut
    Salut et merci pour le lien petit papa noel,

    C'est exactement ce que je veux faire à un petit détail près et donc ca ne marche pas

    Je précise que mon application est basé sur une dialogbox et que je suis donc dans le DoModal() de mon application.

    j'utilise la fonction de test :

    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
     
    void CMonMenu::InsertNewItemTop(CString value)
    {
    	m_Menu.InsertMenuA(0,MF_BYPOSITION|MF_STRING,GetNewWndId(theApp.m_pMainWnd),(LPCTSTR)value);
    }
     
    UINT CMonMenu::GetNewWndId( CWnd * pWnd )
    {
    	for ( int i = MAXINT_PTR - 1; i >= 0; i-- )
    	{
    		if ( pWnd->GetDlgItem ( i ) == NULL )
    			return i;
    	}
     
    	return MAXUINT_PTR;
    }
    Ce qu'il se passe, c'est que le GetDlgItem(i) renvoie toujours NULL. J'ai essayé plusieurs valeurs de i, j'ai essayé plusieurs CWnd* (j'ai 4 ou 5 DialogBox pour le moment dans mon appli) mais le résultat est toujours le même.

    Une recherche dans msdn montre pour le 3eme argument :
    "nIDNewItem
    Specifies either the command ID of the new menu item or, if nFlags is set to MF_POPUP, the menu handle (HMENU) of the pop-up menu. The nIDNewItem parameter is ignored (not needed) if nFlags is set to MF_SEPARATOR."


    Le fait qu'il s'agisse d'un "command ID" peut-il faire que GetDlgItem ne renvoie rien? peut etre que InsertMenuA ne crée pas d'Item finalement...

    Petite précision : les nouveaux éléments apparaissent bien dans mes menus, mais les actions associées sont toutes identiques et correspondent à celle associée au premier Item créé.

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    déjà ça ne va pas coller le MF_BYPOSITION en lui donnant un ID, puisqu'il faut lui donner une position

    ensuite les GetDlgItem() ne marche pas avec les ID de menu ...

    @+

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut
    Le MF_BYPOSITION est relatif au premier argument de la fonction.
    En écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Menu.InsertMenuA(0,MF_BYPOSITION.....)
    je dis que le nouvel Item doit prendre la premiere place dans le menu.
    (c'est ce que j'ai compris en lisant msdn mais je peux me tromper, en tout cas, ça a l'air de fonctionner comme ça).

    Merci sinon pour la confirmation que GetDlgItem ne fonctionne pas avec les ID de menu.

    J'essaye de voir avec ce qu'à donné 3DArchi, mais je galère un peu pour le moment, je repasse plus tard.

    merci, pour les infos

    [edit] je vois pas trop comment utiliser le "GetMenuItemID" puisque celui-ci me renvoie l'ID de l'élément n°x de mon menu mais ne me permet pas de tester une nouvelle ID pour savoir si celle-ci est libre... Y a-t-il une fonction qui permette de faire l'inverse? une sorte de GetDlgItem mais qui fonctionne aussi avec les ID de menu?

    Sinon, j'arrive pas a récupérer les LPMENUINFO avec GetMenuInfoA. j'ai a chaque fois une erreur de lecture d'adresse non initialisée. Dois-je forcement passer par les INFO pour utiliser le MNS_NOTIFYBYPOS?

Discussions similaires

  1. [PHP 5.2] Menu dynamique récupérer les pages
    Par Tartuffe245 dans le forum Langage
    Réponses: 3
    Dernier message: 22/01/2010, 17h26
  2. [XL-2007] Définir des références dynamiques pour les formules internes d'un tableau
    Par SilkyRoad dans le forum Contribuez
    Réponses: 0
    Dernier message: 10/05/2009, 13h05
  3. définir un menu contextuel sur les items d'un treeview
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 05/05/2008, 19h51
  4. [JSP]menu dynamique en jsp
    Par laouedjahmed dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 22/03/2004, 10h50
  5. 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