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 :

Concaténer deux menus


Sujet :

MFC

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Concaténer deux menus
    Bonjour,

    Lors d'un développement, je devait concaténer deux CMenu.

    J'ai réalisé un bout de code pour y arriver.

    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
    void GE_AppendMenu ( CMenu * pMenu, CMenu * pNewMenu )
    {
    	ASSERT ( pMenu && pNewMenu );
    	if ( pMenu == NULL || pNewMenu == NULL )
    		return;
     
     
    	UINT uPos = pMenu->GetMenuItemCount ( );
    	CMenu subMenu;
    	char sText [ 128 ];
     
    	MENUITEMINFO info = {0};
    	info.cbSize = sizeof (MENUITEMINFO); // must fill up this field
    	info.fMask = MIIM_STATE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU;
    	info.dwTypeData = sText;
    	info.cch = sizeof ( sText );
    	for ( UINT i = 0; i < pNewMenu->GetMenuItemCount ( ); i++ )
    	{
    		memset ( sText, '\0', sizeof ( sText ) );
     
    		if ( pNewMenu->GetMenuItemInfo ( i, &info, TRUE ) == FALSE )
    		{
    			DWORD dwError = GetLastError ( );
    			ASSERT ( FALSE );
    			continue;
    		}
     
    		if ( info.hSubMenu != NULL )
    		{
    			ASSERT ( FALSE );
    		}
     
    		InsertMenuItem ( pMenu->m_hMenu, uPos++, TRUE, &info );
    	}
    }
    Ca marche relativement mais j'ai quelques soucis. D'une je n'ai pas encore géré les sous menus et leurs récursivités.
    Le second soucis, c'est au niveau du texte. Le premier élément du menu fraichement ajouté est correct mais pour les autres éléments du menu le texte est tronqué au bout de 15 caractères.

    Quelqu'un aurait une idée voir une solution à mon problème ?

    Merci d'avance

  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,
    bon je ne vois pas pourquoi tu ne recuperes que 15 caractéres .
    essaye avec la fonction GetMenuString.
    pour le parcours de l'arbre des menus tu peux faire une fonction recursive en utilisant GetSubMenu pour obtenir le pointeur sur le sous menu .

  3. #3
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    A y est je viens de trouver.

    En fait au début de mon code j'avais initialisé ma structure MENUITEMINFO pour qu'elle soit correcte. Logique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	MENUITEMINFO info = {0};
    	info.cbSize = sizeof (MENUITEMINFO); // must fill up this field
    	info.fMask = MIIM_STATE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU;
    	info.dwTypeData = sText;
    	info.cch = sizeof ( sText );
    Par contre j'ai constaté qu'après avoir utilisé la fonction GetMenuItemInfo, la variable info.cch était passé de 128 à 16. D'où mes 15 caractères.

    Il faut donc ABSOLUMENT ré-initialiser info.cch avant d'utiliser la fonction GetMenuItemInfo.

    Bon j'en ai profité également pour remettre à zéro info.dwTypeData.

    Voilà le nouveau code avec les deux lignes en plus
    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
    void GE_AppendMenu ( CMenu * pMenu, CMenu * pNewMenu )
    {
    	ASSERT ( pMenu && pNewMenu );
    	if ( pMenu == NULL || pNewMenu == NULL )
    		return;
     
     
    	UINT uPos = pMenu->GetMenuItemCount ( );
    	CMenu subMenu;
    	char sText [ 128 ];
     
    	MENUITEMINFO info = {0};
    	info.cbSize = sizeof (MENUITEMINFO); // must fill up this field
    	info.fMask = MIIM_STATE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU;
    	info.dwTypeData = sText;
    	info.cch = sizeof ( sText );
    	for ( UINT i = 0; i < pNewMenu->GetMenuItemCount ( ); i++ )
    	{
    			// Initialisation de la structure
    		memset ( sText, '\0', sizeof ( sText ) );
    		info.cch = sizeof ( sText );
     
    		if ( pNewMenu->GetMenuItemInfo ( i, &info, TRUE ) == FALSE )
    		{
    			DWORD dwError = GetLastError ( );
    			ASSERT ( FALSE );
    			continue;
    		}
     
    		if ( info.hSubMenu != NULL )
    		{
    			ASSERT ( FALSE );
    		}
     
    		InsertMenuItem ( pMenu->m_hMenu, uPos++, TRUE, &info );
    	}
    }
    Par contre, je n'ai pas encore bossé sur le récursivité du code. A suivre donc.

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

Discussions similaires

  1. [MenuItems] Merger deux menus à la main
    Par Manopower dans le forum Delphi
    Réponses: 3
    Dernier message: 13/12/2006, 13h43
  2. Concaténer deux fichiers binaires
    Par mickael.be dans le forum Delphi
    Réponses: 7
    Dernier message: 30/07/2006, 13h11
  3. Concaténer deux listes
    Par Dunk dans le forum Pascal
    Réponses: 13
    Dernier message: 25/04/2006, 18h09
  4. Réponses: 6
    Dernier message: 27/05/2004, 10h41
  5. Concaténer deux variables ?
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 19/12/2003, 13h53

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