2010-01-07 3 views
0

В TreeView, ListBox или, похоже, из моего поиска Google ничего с ScrollBar, ScrollBar не считается частью элемента управления.Событие TreeView MouseLeave срабатывает при перемещении по ScrollBar

У меня есть TreeView, который я настраиваю в пользовательский элемент управления, и это Dock Fill. Таким образом, он действует как пользовательский TreeView, у которого есть вся наша логика, чтобы управлять им в одном месте.

В некоторых частях нашей программы мы выдвигаем его на основе события MouseEnter и помещаем его обратно в событие MouseLeave, однако в настоящее время мы используем TreeView для сторонней библиотеки для этого, которому мне было поручено заменить.

Итак, я переместил все на Windows TreeView, но не могу найти способ надежного захвата MouseLeave - только если он покидает весь TreeView, включая полосу прокрутки.

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

Вкратце:

скроллбара не срабатывает MouseEnter или MouseLeave для контроля, и что делает использование MouseEnter/MouseLeave для выскальзывания управления непригодным, так как пользователь не может использовать ScrollBar.

Каков предпочтительный способ обработки этой ситуации?

ответ

1

Запустите Spy ++ и выберите окно Treeview. Переместите мышь на полосу прокрутки. Много работы там, WM_NCMOUSEMOVE выглядит как хороший для меня. Поймать его в переопределении WndProc().

+0

Это .net, не имеет доступа к WndProc или WM_NCMOUSEMOVE –

+1

Уверен, что WndProc() - это метод класса TreeView, который можно перегрузить в свой производный класс. WM_NCMOUSEMOVE - это число, оно равно 0xa0. Проверьте документы MSDN. –

1

Поместите панель с точным размером ListBox, включая панель прокрутки в списке. Затем введите событие мыши на панель.