C # ListBox.MouseEnter / MouseLeave и полоса прокрутки - PullRequest
1 голос
/ 29 июня 2011

У меня есть ListBox на левой стороне моей формы. У пользователя есть возможность «автоматически скрывать» его, чтобы он исчезал слева и появлялся только тогда, когда пользователь наводит на него мышь.

Если в ListBox есть несколько элементов, эта функция прекрасно работает.

Однако, как только я поместил достаточное количество элементов в ListBox, так что теперь есть полоса прокрутки, начинают происходить забавные вещи. Код MouseEnter срабатывает только тогда, когда пользователь переместил свою мышь в ListBox за полосой прокрутки. Это означает, что у меня должно быть больше ширины полосы прокрутки, иначе они никогда не смогут это показать.

Кроме того, пользователь вообще не может прокручивать, если ListBox не в фокусе. Если они пытаются щелкнуть полосу прокрутки для прокрутки, ListBox исчезает. Если они щелкают внутри ListBox, чтобы сфокусировать его (чтобы прокрутить колесо мыши), они теряют свой выбор.

Можно ли как-нибудь расширить границы MouseEnter и MouseLeave, добавив полосу прокрутки?

1 Ответ

1 голос
/ 29 июня 2011

Это дизайн, полоса прокрутки не является частью клиентской области элемента управления. Он находится в области, не являющейся клиентом, аналогично строке заголовка в верхней части формы. Windows обрабатывает их по-разному, вместо этого сообщения о перемещении мыши, такие как WM_MOUSEMOVE, объявляются с помощью WM_NCMOUSEMOVE. У Winforms нет событий для уведомлений, не относящихся к клиенту. Это то, как вы обычно хотите, вы не хотели бы знать о манипулировании полосой прокрутки. Особенность, а не ошибка. За исключением этого случая.

В качестве обходного пути вы можете унаследовать от ListBox и переопределить WndProc () для просмотра сообщений WM_NCMOUSEMOVE (m.Msg == 0xa0). Или таймер 200 мсек, который проверяет, где находится мышь.

...