Проблема с TVN_SELCHANGED для объекта CTreeCtrl
-
01-07-2019 - |
Вопрос
У меня есть объект управления деревом, созданный с использованием класса 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(), чтобы перейти от точки к элементу дерева.Таким образом, вы могли бы использовать это в своем обработчике щелчков правой кнопкой мыши.
Не забывайте, что контекстное меню также может быть активировано клавишей на разумных современных клавиатурах.Тогда вы, вероятно, захотите использовать выбранный элемент в качестве целевого.