Проблема с TVN_SELCHANGED на объекте CTreeCtrl - PullRequest
1 голос
/ 18 сентября 2008

У меня есть объект управления деревом, созданный с использованием класса CTreeCtrl MFC. Дерево управления должно поддерживать переименование. Когда я щелкаю левой кнопкой мыши по любому элементу в Дереве, вызывается событие TVN_SELCHANGED, из которого я могу получить выбранный элемент дерева, как показано ниже: HTREEITEM h = m_moveListTree.GetSelectedItem (); CString s = m_moveListTree.GetItemText (h);

Однако, когда я щелкаю правой кнопкой мыши по любому элементу в дереве, я не получаю никакого события TVN_SELCHANGED, и, следовательно, мой выбранный элемент остается тем же самым из события левого щелчка. Это вызывает следующую проблему: 1) Пользователь щелкнул левой кнопкой мыши на элементе A 2) пользователь нажимает правую кнопку мыши на элементе B и говорит, что переименовывает 3) Поскольку выбранный элемент все еще A, переименование применяется для элемента A.

Пожалуйста, помогите в решении проблемы.

-Praveen

Ответы [ 3 ]

2 голосов
/ 18 сентября 2008

Такое поведение является заданным - щелчок правой кнопкой мыши не перемещает выделение.

Для того, что вы хотите, включите стиль TVS_EDITLABELS в древовидном представлении. Затем вы обрабатываете уведомления TVN_BEGINLABELEDIT и TVN_ENDLABELEDIT.

0 голосов
/ 18 сентября 2008

Не знаю, как вы всплыли в контекстном меню, но вы можете использовать HitTest (), чтобы перейти от точки к элементу дерева. Так что вы можете использовать это в своем обработчике правой кнопки мыши.

Не забывайте, что контекстное меню также можно активировать клавишей на разумных современных клавиатурах. Тогда вы, вероятно, захотите использовать выбранный предмет в качестве цели.

0 голосов
/ 18 сентября 2008

Я создал свою собственную MFC, как домашнюю библиотеку C ++ GUI, поверх Win32 API и, глядя на мой код, вот как она справляется с этой ситуацией:

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;
}

Я подозреваю, что если вы сделаете что-то подобное в событиях правой или правой кнопки мыши MFC, которые устранят проблему.

ПРИМЕЧАНИЕ. Приведенный выше код onRightClick - не более чем обработчик для сообщения WM_NOTIFY , NM_RCLICK .

...