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 :

Conflit entre ON_NOTIFY_REFLECT & ON_NOTIFY


Sujet :

MFC

  1. #1
    Membre éclairé 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
    Par défaut Conflit entre ON_NOTIFY_REFLECT & ON_NOTIFY
    Bonjour,

    Je suis entrain d'installer un controle récupérer sur CodeGuru ( http://www.codeguru.com/Cpp/controls...icle.php/c3987 ).

    En fait c'est une ListCtrl avec dans la première colonne représentant un arbre simplifier. Une sorte d'arbre simplifié avec plusieurs colonnes.

    Pour détecter un clique sur un + ( ou un -, comme dans un arbre classique ), ce contrôle utilise un ON_NOTIFY_REFLECT, qui d'ailleurs le fait très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
    Ensuite, moi dans mon code, je veux détecter un clique sur une ligne pour permettre l'affichage des propriétés avancées de la ligne sélectionnée.
    Pour cela, j'utilise un ON_NOTIFY comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_NOTIFY(NM_CLICK, IDC_TREE_LIST_CONFLICTS, OnClickTreeListConflicts)
    Mais mon programme ne veut pas s'arréter dans ma méthode de "Clique".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afx_msg void OnClickTreeListConflicts(NMHDR* pNMHDR, LRESULT* pResult);
    Par contre il s'arrete dans celle du contrôle ( grâce au ON_NOTIFY_REFLECT ).

    Et j'ai testé un truc, c'est d'enlever la ligne avec le ON_NOTIFY_REFLECT. Donc évidemment, le controle ne fonctionne plus correctement mais par contre le programme s'arrete bien dans MA fonction de "clique".

    Voici donc ma question :
    Comment puis-je faire pour récupérer dans mon code le clique du controle ?

    Merci d'avance

  2. #2
    Membre éclairé 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
    Par défaut
    Je sais que cela ne fait pas longtemps mais personne n'a d'idée. Merde alors.

    Ba en fait je m'interroge sur le sens de mon post. Il n'est peut être pas assez clair. Si c'est le cas, je pourrais éclairer les points obscures.

  3. #3
    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,
    tu peux montrer l'implementation du message :
    ON_NOTIFY_REFLECT(NM_CLICK, OnClick) ?



  4. #4
    Membre éclairé 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
    Par défaut
    Oui, je peux.

    Voici donc le code de la méthode "OnClick"
    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
    void CTreeListCtrl::OnClick
    	(
    	NMHDR*		pNMHDR,
    	LRESULT*	pResult
    	)
    {
    	LPNMITEMACTIVATE	pItemActivate = (LPNMITEMACTIVATE)pNMHDR;
     
    	CRect				rect;
     
    	GetItemRect(pItemActivate->iItem, rect, LVIR_ICON);
     
    	if (pItemActivate->ptAction.x < rect.left)
    	{
    		LVITEM	item;
     
    		item.mask		= LVIF_INDENT | LVIF_PARAM;
    		item.iItem		= pItemActivate->iItem;
    		item.iSubItem	= 0;
    		GetItem(&item);
     
    		if (pItemActivate->ptAction.x > item.iIndent * 16)
    		{
    			if (m_tree[item.lParam].m_bCollapsed)
    			{	
    				int	nInsert = pItemActivate->iItem;
    				SetRedraw(0);
    				Expand(item.lParam, false, nInsert);
    				SetRedraw(1);
    				if ( m_tree[item.lParam].m_bHasChild )
    					SetItemState(pItemActivate->iItem, INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK);
    				else
    					SetItemState(pItemActivate->iItem, INDEXTOSTATEIMAGEMASK(3), LVIS_STATEIMAGEMASK);
    			}
    			else
    			{				
    				SetRedraw(0);
    				Collapse(item.lParam, pItemActivate->iItem);
    				SetRedraw(1);
    				if ( m_tree[item.lParam].m_bHasChild )
    					SetItemState(pItemActivate->iItem, INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);
    				else
    					SetItemState(pItemActivate->iItem, INDEXTOSTATEIMAGEMASK(3), LVIS_STATEIMAGEMASK);
    			}
    		}
    	}
     
    	*pResult = 0;
    }
    On m'a parlé du fait de changer le code de retour avec *pResult pour permettre au code utilisant le contrôle de récupérer le message du clique.
    J'ai tenté de le mettre à 1, mais cette modification n'a rien donnée.

  5. #5
    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,
    de toute façon (il me semble avoir deja eu le probleme),
    si le message reflect est intercepté dans la classe parent ,le notify ne sera pas envoyé sur la classe derivée.
    tu peux aussi rendre la fonction virtuelle sur la classe parent et la redefinir pour completer ton test dans la classe dérivée..

  6. #6
    Membre éclairé 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
    Par défaut
    Mais en fait la classe dans laquelle j'essaye de récupérer le clique n'est pas une classe dérivée du controle CTreeListCtrl.
    La mienne hérite d'une CDialog classique. En fait je l'utilise comme une CListCtrl classique.
    Je ne sais pas si c'est bon.

    En dernier recourt je pourrais peu être créer une classe dérivée de CTreeListCtrl qui enverra un message à ma CDialog contenant la liste les informations des lignes sélectionnées.

    Mais j'aurais aimé éviter d'en arriver là. Mais bon quand il faut, il faut.
    A moins que tu ai une idée lumineuse qui m'éviterai de créer une classe dérivée et d'envoyer des messages.

  7. #7
    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,
    il y a une actuce possible:
    renvoyer a partir du message reflect une notification Wm_NOTIFY:
    voir ce post dans la faq :
    http://c.developpez.com/faq/vc/?page...s#PrivateNotiy
    ça devrait fonctionner ...

  8. #8
    Membre éclairé 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
    Par défaut
    Effectivement c'est une bonne idée, je vais essayé et je te remercie, c'est une bonne idée.

    Merci

  9. #9
    Membre éclairé 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
    Par défaut
    Je viens de faire le test avec ta methode et c'est bon.
    J'ai bien récupéré le message du clique.

    Mais, on m'a egalement dis de changer le ON_NOTIFY_REFLECT par un ON_NOTIFY_REFLECT_EX qui possède un retour en BOOL qui permettrait de définir si on veut que le message soit redonné au parent.

    Je n'ai pas eu le temps de faire le test, mais je vais essayer bientôt.

    En tout cas merci

Discussions similaires

  1. Conflit entre javascript et script ASP
    Par Mvu dans le forum ASP
    Réponses: 2
    Dernier message: 22/02/2005, 16h28
  2. Possibles conflits entre GL, GLAUX et GLUT
    Par barthelv dans le forum GLUT
    Réponses: 1
    Dernier message: 19/11/2004, 12h31
  3. Conflit entre bases de données
    Par BRODU dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/10/2004, 11h40
  4. conflit entre couleurs
    Par khayyam90 dans le forum OpenGL
    Réponses: 2
    Dernier message: 03/07/2004, 18h00
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

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