2008-09-18 19 views
1

J'ai un objet de contrôle d'arbre créé en utilisant la classe MFC CTreeCtrl. Le contrôle d'arbre doit prendre en charge le changement de nom. Lorsque je clique sur l'un des éléments de l'arborescence, l'événement TVN_SELCHANGED est appelé à partir duquel je peux obtenir l'élément sélectionné de l'arborescence comme suit: HTREEITEM h = m_moveListTree.GetSelectedItem(); CString s = m_moveListTree.GetItemText (h);Problème avec TVN_SELCHANGED sur l'objet CTreeCtrl

Cependant, lorsque je clique avec le bouton droit de la souris sur un élément de l'arborescence, je n'obtiens aucun événement TVN_SELCHANGED et, par conséquent, mon élément sélectionné reste le même par clic gauche. Ce problème est à l'origine suivante: 1) l'utilisateur leftclicks sur le point A 2) utilisateur clique droit sur le point B et dit renommer 3) Étant donné que l'élément sélectionné est encore le changement de nom est l'application pour le point A.

S'il vous plaît aider dans la résolution de problème.

-Praveen

Répondre

0

J'ai créé mon propre MFC comme Home Grown bibliothèque C++ GUI au-dessus de l'API Win32 et regarder mon code, voici comment il gère cette situation:

LRESULT xTreeCtrl::onRightClick(NMHDR *) 
{ 
    xPoint pt; 

    //-- get the cursor at the time the mesage was posted 
    DWORD dwPos = ::GetMessagePos(); 

    pt.x = GET_X_LPARAM(dwPos); 
    pt.y = GET_Y_LPARAM (dwPos); 

    //-- now convert to window co-ordinates 
    pt.toWindow(this); 

    //-- check for a hit 
    HTREEITEM hItem = this->hitTest(pt); 

    //-- select any item that was hit 
    if ((int)hItem != -1) this->select(hItem); 

    //-- leave the rest to default processing 
    return 0; 
} 

Je soupçonne si vous faites quelque chose de similaire dans le MFC, faites un clic droit ou un bouton droit sur les événements qui vont résoudre le problème.

REMARQUE: Le code onRightClick ci-dessus est rien de plus que le gestionnaire pour l'WM_NOTIFY, NM_RCLICK un message.

+0

Salut Jussij, Merci pour la réponse. Où puis-je trouver la classe xPoint? ou Comment convertir l'oiint de la classe CPoint en fenêtre coordonnée –

+0

Utilisez simplement CPoint, puis appelez ScreenToClient(). – ChrisN

+0

Salut Chris, Merci pour la réponse. J'ai codé comme ceci après avoir obtenu le pt: LPPOINT p = new tagPOINT; p-> x = pt.x; p-> y = pt.y; ScreenToClient (p); pt.x = p-> x; pt.y = p-> y; HTREEITEM hItem = m_moveListTree.HitTest (pt); Mais l'objet pointé est faux. Que devrais-je faire ? –

0

Vous ne savez pas comment faire pour afficher le menu contextuel, mais vous pouvez utiliser HitTest() pour passer d'un point à un élément d'arborescence. Vous pouvez donc l'utiliser dans votre gestionnaire de clic droit. N'oubliez pas que le menu contextuel peut également être activé par une touche sur les claviers modernes raisonnables. Ensuite, vous voulez probablement utiliser l'élément sélectionné comme cible.

2

Ce problème est inhérent à la conception - un clic droit ne déplace pas la sélection.

Pour ce que vous voulez, activez le style TVS_EDITLABELS dans l'arborescence. Ensuite, vous gérez les notifications TVN_BEGINLABELEDIT et TVN_ENDLABELEDIT.