2014-09-19 6 views
0

마우스를 누른 상태에서 마우스가 Control으로 들어가는 지 감지 할 수 있습니까?마우스를 누르는 동안 MouseEnter 이벤트 감지

DragAndDrop 기능과 충돌이 있기 때문에 마우스를 누르면 기존 MouseEnter event이 실행되지 않는다고 가정합니까? MouseDownMouseMove 이벤트를 캡처하는 동안/

+0

끌어서 놓기에는 고유 한 DragEnter, DragOver 및 DragDrop 이벤트가 있습니다. 그러나 그것이 들어갈 때 그것이 아래로 있으면 나는 그것이 생각된다. – Plutonix

답변

3

음을 처리하기 때문에 설정 .Capture = false

가,이 경우에는 적합하지 않습니다, 그래,이 기술적으로 가능하다. 그러나 당신이해야 할 일은 아닙니다.

중요한 것은 마우스 버튼을 눌렀을 때 마우스 커서가 있던 부분입니다. 기본 컨트롤에서 MouseDown 이벤트가 발생합니다. 하지만 뭔가 다른 일을합니다. 또한 마우스를 캡처합니다. Control.Capture 속성에 의해 노출됩니다.

중요하므로 MouseUp 이벤트가 안정적으로 발생합니다. 많은 컨트롤이 해당 이벤트를 사용하여 Click 이벤트를 발생시킵니다. 버튼처럼. 부작용은 버튼을 누르고있는 동안 마우스를 움직이면 마우스 메시지가 표시되지 않는다는 것입니다. 대신 클릭 된 컨트롤로 이동합니다. 마우스를 컨트롤 외부로 완전히 옮기더라도.

이렇게하면 문제가 될 수 있습니다. 컨트롤의 MouseDown 이벤트 처리기에서 false 캡쳐 속성을 다시 설정하면 효과가 완전히 사라집니다. 또는 MouseMove를 사용하여 마우스 위치를 모니터링하고 DisplayRectangle 외부로 이동할 때 캡처를 취소 할 수 있습니다.

할 수있는 일이지만 가능하지 않아야합니다. 사용자가 익숙한 대부분의 다른 프로그램의 UI와 다르게 UI를 동작하게 만듭니다. 또는 더 나쁜 것은 UI에서 일관성이 없으며 발생 가능성이 높습니다. 이렇게 사용자를 혼란시키는 것은 거의 좋은 생각이 아닙니다. 너하기에 달렸다.

+0

* ... 그러면 MouseUp 이벤트가 안정적으로 실행됩니다. *. 아닙니다. * mouseup * 이벤트가 항상 실행되는 것은 아닙니다. mouseleave와 capturechanged는 항상 해고됩니다. –

+0

사실이 아닙니다. Ctrl + Escape는 보스 오버라이드입니다. 나는 그것을 통합하는 것이 대답을 이해하기 쉽게 만들 것이라고 생각하지 않는다. 예외는 언급했다. –

0

먼저 @Hans에게 감사의 말을 전합니다. 매우 유익하고 잘 구성된 +1입니다!

내 경우에는이 대답이 유효한 해결책이 아니 었습니다. MouseDown 이벤트 내에 .Capture = False을 설정하면 너무 많은 단점이 있습니다.

은 내가 MouseDownMouseMove 이벤트가 터 ControlList(Of)MouseEnter 이벤트에 반응해야 Controls을 전달하여 문제를 해결했다. MouseMove

마우스이 Controls 중 하나의 경계 내에있는 경우 마우스의 위치가 그 OnMouseEnter(ByVal e as System.EventArgs)가 명시 적으로 호출되면, List(Of)-Controls 중 하나 내부에있는 경우는 체크 처리합니다.