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 :

[MFC][VC6] Pb assertion sur affichage menu contextuel


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Points : 118
    Points
    118
    Par défaut [MFC][VC6] Pb assertion sur affichage menu contextuel
    Bonsoir à toutes et à tous,

    J'ai un boîte de dialogue dans laquelle j'ai un arbre avec 3 items.

    J'ai dans mes ressources un menu que j'affiche lorsque je fais un clique droit sur un des items de mon arbre (le code est suit histoire de se faire une idée).

    Bref, j'en arrive à mon problème. Lorsque je fais un premier clique droit sur un des items le menu s'affiche correctement mais lorsque je fais un clique droit sur un autre item et que le menu est encore affiché j'ai une assertion qui claque et je ne sais pas pourquoi.

    Voici donc le code, si quelqu'un peut me donner une piste pour résoudre mon problème c'est super.

    Bonne soirée à toutes et à tous.

    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
     
    	POINT l_Point;
    	if( ::GetCursorPos(&l_Point) )
    	{
    		// Conversion des coordonnées du curseur
    		this->m_ctrlTree.ScreenToClient(&l_Point);
     
    		// Récupération du handle de l'item sous le curseur
    		HTREEITEM l_hItem = this->m_ctrlTree.HitTest(CPoint(l_Point.x, l_Point.y));
    		if( l_hItem )
    		{
    			// Mise en sélection de l'item
    			this->m_ctrlTree.SelectItem(l_hItem);
    			DWORD l_itemData = this->m_ctrlTree.GetItemData(l_hItem);
     
    			CMenu l_Menu;
    			if( l_Menu.LoadMenu(IDR_MENU) )
    			{	
    				CMenu* l_pPopupMenu = 0;
    				if( l_itemData == l_pInstance->CST_0 )
    					l_pPopupMenu = l_Menu.GetSubMenu(0);
    				else if( l_itemData == l_pInstance->CST_1 )
    					l_pPopupMenu == l_Menu.GetSubMenu(1);
    				else if( l_itemData == l_pInstance->CST_2 )
    					l_pPopupMenu == l_Menu.GetSubMenu(2);
     
    				this->m_ctrlTree.ClientToScreen(&l_Point);
    				l_pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, l_Point.x, l_Point.y, this);
     
    				l_Menu.DestroyMenu();
    			}
    		}
    	}

  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,
    la première chose tu ne vérifies pas l_pPopupMenu soit différent de NULL.
    ensuite moi je ferais en sorte que l_Menu soit persistant et non local.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Salut,

    Comme dit farscape tu doit t'assurer que l_pPopupMe n'est pas NULL

    et Enlever la ligne de code

    l_Menu->DestroyMenu();

    tu ne peux pas détruire un menu qui est encore affiché.

    A+

  4. #4
    Membre confirmé 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
    Points : 521
    Points
    521
    Par défaut
    tu ne peux pas détruire un menu qui est encore affiché.
    TrackPopupMenu() est "modale". La fonction ne rend pas la main avant que le menu est disparu de l'écran.

    @+

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Ok stephdim

    le problème qu'il pose ne dervait donc pas se produire. Le menu contextuel devrait disparaître dès le click en déhors du menu.

Discussions similaires

  1. style sur Sous-menu contextuel
    Par g0up1l dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 18/01/2010, 15h08
  2. [FAQ][VC++]Comment placer des images sur un menu contextuel
    Par Gabrielly dans le forum Contribuez
    Réponses: 0
    Dernier message: 14/04/2009, 18h48
  3. Réponses: 2
    Dernier message: 30/07/2008, 16h08
  4. rajouter une item sur le menu contextuel click droit
    Par sony351 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 23/02/2006, 14h19
  5. [MFC Visual C++]conseil sur affichage graphiques
    Par C++beginner dans le forum MFC
    Réponses: 6
    Dernier message: 10/01/2006, 06h47

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