2014-09-19 3 views
0

Можно ли определить, входит ли мышь в Control при нажатии мыши?Обнаружение события MouseEnter во время нажатия мыши

Я предполагаю, что традиционный MouseEnter event не стреляет, если мышь нажата, потому что есть некоторые конфликты с функциональностью DragAndDrop?

Установка .Capture = false не подходит в данном случае, потому что во время MouseDownMouseMove событие должно быть снято/обработано

+0

Перетаскивание имеет собственные события DragEnter, DragOver и DragDrop. Но я не думаю, что он срабатывает, если он падает, когда он входит. – Plutonix

ответ

3

Ну, да, это технически возможно. Не то, что вы должны когда-либо делать.

Важно то, где находился курсор мыши, когда вы нажимали кнопку мыши. Это вызывает событие MouseDown в базовом элементе управления. Но делает что-то еще, он также захватывает мышь. Открывается свойство Control.Capture.

Это важно, это гарантирует, что событие MouseUp будет надежно запущено. Многие элементы управления используют это событие для запуска события Click. Как кнопка. Побочным эффектом является то, что элемент управления, на который вы двигаете мышь, удерживая кнопку, не будет видеть никаких сообщений мыши. Вместо этого они управляются щелчком. Даже если вы полностью перемещаете мышь за пределы элемента управления.

Это можно переделать. Вы могли бы, скажем, установить свойство Capture обратно на false в обработчике события MouseDown элемента управления, что фактически делает клик полностью неэффективным. Или вы можете контролировать положение мыши с помощью MouseMove и отменить захват, когда увидите, что он перемещается за пределы DisplayRectangle.

Все, что вы можете сделать, но вы, вероятно, не должны. Вы делаете свой пользовательский интерфейс по-другому, чем пользовательский интерфейс большинства других программ, с которыми пользователь знаком. Или, что еще хуже, это противоречиво в вашем собственном интерфейсе, вероятно, произойдет. Смутить такого пользователя очень редко бывает хорошей идеей. Это тебе решать.

+0

* ... это гарантирует, что событие MouseUp будет надежно запущено *. Нет. Событие * mouseup * не всегда срабатывает. Мышь и захват меняются всегда. –

+0

Это не неверно, Ctrl + Escape - это исправление босса. Я не думаю, что включение в него позволит сделать ответ более понятным, хотя :) Исключение отмечено. –

0

Прежде всего, я хотел бы поблагодарить @Hans за его ответ. Это очень информативно и хорошо структурировано +1!

Но в моем случае этот ответ был недействительным решением. Установка .Capture = False в событии MouseDown имеет слишком много недостатков.

Я решил эту проблему, передавая Controls, который должен реагировать на MouseEnter события на List(Of) в Control, который выстреливает MouseDown и MouseMove события.

В MouseMove обрабатывать проверяется, если позиция мыши находится внутри одного из List(Of)-Controls Если мышь находится в пределах одного из этих Controls, то OnMouseEnter(ByVal e as System.EventArgs) называется явным.