Вопрос

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

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

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

-Правин

Это было полезно?

Решение

Я создал свой собственный MFC, подобный домашней библиотеке графического интерфейса C ++, поверх 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 right click или right button down, это устранит проблему.

ПРИМЕЧАНИЕ:Приведенный выше код onRightClick - это не что иное, как обработчик для WM_NOTIFY - УКАЗАТЬ, NM_RCLICK Сообщение.

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top