Пользовательские границы TreeNode - PullRequest
2 голосов
/ 28 декабря 2010

Как расширить стандартное поведение мыши узла TreeView (например, выбор, отслеживание в горячем режиме, расширение при двойном щелчке и т. Д.) По более широкой области узла? У меня есть пользовательский нарисованный узел, который имеет более широкую метку, чем он был бы, если бы он был нарисован системой, и он реагирует на действия мыши только тогда, когда курсор находится в пределах границ обычного узла.

Есть идеи?

Кстати, перехват TVM_GETITEMRECT и TVM_HITTEST не сработает.

Несколько слов о том, что я делаю: я разрабатываю дерево управления WinForms, которое обычно действует точно так же, как WinForms TreeView, но также позволяет добавлять специальные узлы, которые могут иметь собственные шрифты и цвета, применяемые к любым частям их ярлыки. Так что это своего рода «RichTreeView», который может, например, иметь узлы с выделенными жирным шрифтом отдельными словами в их тексте. При использовании некоторых тяжелых шрифтов метка узла может стать намного шире, чем обычная, но также и более узкой (что вызывает другую проблему подавления действий мыши), поэтому мой вопрос.

1 Ответ

2 голосов
/ 28 декабря 2010

Да, это проблема с родным элементом управления Windows.У него нет никакого способа указать границы пользовательского элемента.Уведомление TVN_GETDISPINFO, вероятно, самое близкое, но в NMTVDISPINFO отсутствует способ указания границ.Оболочка .NET не реализует это.Это действительно достаточно для реализации VirtualMode.

, который продолжает тестирование попаданий и TreeNode.Bounds на основе исходных метрик.Это особенно проблема с горизонтальной полосой прокрутки, она не будет прокручиваться достаточно далеко, чтобы показать весь нарисованный пользователем текст, если он шире оригинала.Вы можете в некоторой степени решить проблему тестирования на попадание, реализовав MouseDown и итерировав свойства TreeNode.Bounds, но не проблему с полосой прокрутки.

Чистого решения для этого нет, только ошибочноеУстановите TreeNode.Text на произвольную строку, которая достаточно широка, чтобы решить проблему.При необходимости вы можете использовать свойство Tag для хранения фактического текста.Это зависит от того, как вы рисуете, префикс текста с парой М может быть достаточно хорошим.Не очень.

...