Question

J'ai un objet de contrôle d'arborescence créé à l'aide de la classe CTreeCtrl MFC. Le contrôle d'arborescence doit prendre en charge le changement de nom. Lorsque je laisse un clic sur l'un des éléments de l'arborescence, l'événement TVN_SELCHANGED est appelé, ce qui permet d'obtenir l'élément sélectionné de l'arborescence comme ci-dessous:   HTREEITEM h = m_moveListTree.GetSelectedItem ();   CString s = m_moveListTree.GetItemText (h);

Cependant, lorsque je clique avec le bouton droit de la souris sur un élément de l’arborescence, je ne reçois aucun événement TVN_SELCHANGED et, par conséquent, mon élément sélectionné reste identique à l’événement du clic gauche. Ceci cause le problème suivant: 1) l'utilisateur clique gauche sur l'article A 2) l'utilisateur clique avec le bouton droit sur l'élément B et dit renommer 3) Puisque l'élément sélectionné est toujours A, le changement de nom s'applique à l'élément A.

Aidez-nous à résoudre le problème.

-Praveen

Était-ce utile?

La solution

J'ai créé mon propre MFC, semblable à une bibliothèque d'interface utilisateur graphique C ++ développée au-dessus de l'API Win32, et en regardant 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 que si vous faites quelque chose de similaire dans les événements de clic droit ou de bouton droit enfoncé qui permettent de résoudre le problème.

REMARQUE: le code onRightClick ci-dessus n’est rien de plus que le gestionnaire du message WM_NOTIFY , NM_RCLICK .

Autres conseils

Ce problème est inhérent au projet - 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.

Vous ne savez pas comment afficher le menu contextuel, mais vous pouvez utiliser HitTest () pour passer d'un point à un élément de l'arborescence. Vous pouvez donc utiliser ceci dans votre gestionnaire de clic droit.

N'oubliez pas que le menu contextuel peut également être activé par une touche sur des claviers modernes raisonnables. Ensuite, vous voudrez probablement utiliser l'élément sélectionné comme cible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top