Я создал элементы управления деревом с помощью WinApi. Я хочу зафиксировать щелчок мышью на флажках. Уведомляющее сообщение NM_CLICK содержит NMHDR, который не имеет информации об щелчке узла. так как щелкнутый узел может отличаться от выбранного узла, должен быть способ найти, какой узел был проверен или снят, может быть HTREEITEM или lParam Inserted при добавлении элементов в древовидное представление. Я хочу захватить проверку/снятие отметки в реальном времени. Как я могу указать, какой узел проверяется/не установлен? любая помощь или ссылка оценили. mr.abzadehКак захватить, какой узел дерева отображается нажатием
ответ
Вы можете отправить сообщение TVM_HITTEST (или используйте TreeView_HitTest макрос), чтобы найти элемент представления дерева, учитывая клиент-относительные координаты.
Чтобы получить позицию курсора в то время, когда было создано сообщение NM_CLICK
, используйте API GetMessagePos.
Это позволяет вам контролировать любой щелчок мышью в клиентской области элемента управления. Если вы заинтересованы в изменениях состояния в результате реализации стандартного управления представлением дерева, вы можете обрабатывать уведомления или TVN_ITEMCHANGED. Оба поставляют структуру NMTVITEMCHANGE, где hItem
идентифицирует изменяемый элемент, а lParam
несет данные, специфичные для приложения.
Я хочу захватить проверку/снятие отметки в реальном времени. Как можно указать , какой узел проверяется/не установлен?
для этого существует уведомления TVN_ITEMCHANGING и TVN_ITEMCHANGED - искать uStateNew
и uStateOld
членов NMTVITEMCHANGE
- когда древовидные есть флажки (TVS_CHECKBOXES
стиля) он используется в качестве государственного списка изображений с 2-мя изображений - unchecked
и checked
.
так state & TVIS_STATEIMAGEMASK
будет 0
при отсутствии флажка INDEXTOSTATEIMAGEMASK(1)
для бесконтрольно и INDEXTOSTATEIMAGEMASK(2)
для проверил. на основе этой информации мы можем и захватить щелчок мышью на флажках
с помощью TVN_ITEMCHANGING вы также можете предотвратить изменение при возврате TRUE для этого уведомления. если вам нужно только уведомить - использовать TVN_ITEMCHANGED
case WM_NOTIFY:
{
union {
LPARAM lp;
NMTVITEMCHANGE *pnm;
NMHDR* phdr;
};
lp = lParam;
switch (phdr->code)
{
case TVN_ITEMCHANGING:
{
UINT CheckStateOld = pnm->uStateOld & TVIS_STATEIMAGEMASK;
UINT CheckStateNew = pnm->uStateNew & TVIS_STATEIMAGEMASK;
if (CheckStateNew != CheckStateOld)
{
PCSTR szstate = "??";
switch (CheckStateNew)
{
case INDEXTOSTATEIMAGEMASK(1):
szstate = "uncheck";
break;
case INDEXTOSTATEIMAGEMASK(2):
szstate = "check";
break;
}
DbgPrint("%p>%s\n", pnm->lParam, szstate);
}
}
return FALSE;
}
}
также прочитать How to Work With State Image Indexes
// Image 1 in the tree-view check box image list is the unchecked box. // Image 2 is the checked box. tvItem.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1));
уведомления TVN_ITEMCHANGING и TVN_ITEMCHANGED доступна начинается с Windows Vista. если вам нужна поддержка XP тоже - на xp только опция use @IInspectable solution
Важно отметить, что TVN_ITEMCHANGING доступен с Vista, иначе OP должен использовать hittesting. – AlwaysLearningNewStuff
@AlwaysLearningNewStuff да .., я пропустил это. моя ошибка – RbMm
Не ошибка, просто что-то важное. Я поддержал ваш ответ. – AlwaysLearningNewStuff
- 1. Как получить узел дерева?
- 2. Строка дерева, активированная одним нажатием
- 3. Как изменить узел Forecolor дерева?
- 4. Как отключить узел дерева easyui?
- 5. Как переименовать узел дерева JQXwidget
- 6. Wicket - Развернуть невидимый узел дерева
- 7. выражение дерева - Узел настройки
- 8. Выбранный узел дерева Dojo
- 9. Удалите один узел нажатием кнопки
- 10. Флажок «Узел дерева»
- 11. Невозможно прокручивать узел дерева
- 12. Ошибка отображения, если корневой узел дерева дерева содержит дочерний узел
- 13. Динамически увеличивая узел дерева
- 14. внешний узел двоичного дерева
- 15. C++: узел дерева не обновляется
- 16. Как можно представить узел B-дерева?
- 17. Как захватить входящий узел из HttpContext.Current
- 18. Дерево дерева Boost: удалите узел
- 19. Как добавить навигационный узел Url в узел дерева
- 20. Панель дерева перерыв этикетки узел extjs4
- 21. Найти узел при обходе дерева
- 22. Добавить узел в проблему дерева
- 23. JfreeChart не отображается перед нажатием
- 24. Сбросить узел дерева при смене
- 25. Преобразование дерева JSON в узел
- 26. Dijit.menu как узнать, какой узел был щелкнул
- 27. Как свернуть узел дерева без детей
- 28. Как выбрать случайный узел из дерева
- 29. Как найти узел двоичного дерева для строки?
- 30. Как узнать, что узел дерева частично виден?
downvote как плохое и неэффективное решение для вопроса OP - «Как я могу указать, какой узел проверяется или не установлен?» – RbMm
вы добавляете информацию об уведомлениях 'TVN_ITEMCHANGING' и' TVN_ITEMCHANGED' ** уже после ** Я написал собственный ответ с этим - что видно из истории изменений. это как минимум не приятно :) – RbMm
@RbMm: Поскольку вы не совсем поняли, как это место работает, пожалуйста, примите [тур] и посетите [помощь].Включение предложений из обратной связи ** - это правильная вещь. – IInspectable