Проблема с TVN_SELCHANGED на объекте CTreeCtrl

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

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

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

-Правин


person Community    schedule 18.09.2008    source источник


Ответы (3)


Я создал свою собственную 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.

person jussij    schedule 18.09.2008
comment
Привет Jussij, Спасибо за ответ. Где я могу найти класс xPoint? или Как я могу преобразовать объект из класса CPoint в согласованный с окном - person ; 18.09.2008
comment
Просто используйте CPoint, затем вызовите ScreenToClient(). - person ChrisN; 18.09.2008
comment
Привет Крис, Спасибо за ответ. Я закодировал так после получения CPoint pt: LPPOINT p = new tagPOINT ; р->х = пт.х; p-›y = pt.y; ЭкранКлиент(р); pt.x =p->x; pt.y = p-›y; HTREEITEM hItem = m_moveListTree.HitTest(pt); Но указанный пункт неправильный. Что я должен делать ? - person ; 18.09.2008
comment
Извините, Правин, это должен был быть m_moveListTree.ScreenToClient. - person ChrisN; 18.09.2008
comment
Также обратите внимание, что вам не нужно выделять объект tagPOINT с оператором new. Просто выполните: CPoint pt; пт.х = ...; пт.у = ...; m_moveListTree.ScreenToClient(pt); - person ChrisN; 18.09.2008
comment
Спасибо, Крис, это сработало. Но ScreenToClient принимает объект LPPoint и не может принимать объект CPoint. Должен ли я не использовать объект точки тега? Спасибо, Правин. - person ; 18.09.2008
comment
CPoint является производным от tagPOINT, поэтому ScreenToClient(&pt) должно быть в порядке. Моя ошибка! - person ChrisN; 18.09.2008
comment
Библиотека классов, которую я использовал, представляет собой написанный вручную слой C++ поверх Win32. Например, xPoint — это просто оболочка для структуры POINT. Другие имена будут тесно связаны с другим Win32 API. - person jussij; 29.09.2008

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

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

person Roger Lipscombe    schedule 18.09.2008

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

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

person Steffen    schedule 18.09.2008