2013-03-05 5 views
2

2 개의 버튼이있는 사용자 정의 컨트롤이 있습니다.이 컨트롤은 마우스가 컨트롤 영역 안에있을 때만 표시되어야합니다.MouseLeave가 실행되지 않았습니다. C# WinForms

private void Node_MouseEnter(object sender, EventArgs e){   
    btn1.Show(); 
    btn2.Show(); 
} 

을 그리고 다음과 같이 숨어 :

I는 다음과 같이 버튼을 보여주는거야

문제는 때때로 (임의의 상황)이 MouseLeave 이벤트가 발생하지 않는 것을

protected override void OnMouseLeave(EventArgs e){ 
    if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) 
     return; 
    else 
     base.OnMouseLeave(e); 
} 

private void Node_MouseLeave(object sender, EventArgs e){ 
    btn1.Hide(); 
    btn2.Hide(); 
} 
하고, 버튼은 컨트롤 외부에있는 마우스에서도 볼 수 있습니다.

여러 이벤트가 충돌 할 수 있습니까?

+0

중단 점을 설정하여 이벤트가 실제로 발생하지 않는지 확인할 수 있습니까? 아니면 관측 된 행동을 근거로하고 있습니까? –

+0

관찰 된 동작은이를 보여 주며 상황을 확인하는 디버깅 (콘솔에 인쇄)을하고 있습니다. – guanabara

+1

OnMouseLeave를 사용하거나 사용하지 않고 코드를 테스트했으며 두 경우 모두 정상적으로 작동합니다. OnMouseLeave 메소드를 오버라이드 (override) 해 추가 체크를하고있는 이유는 무엇입니까? 여기서는 필요하지 않습니다. – virious

답변

2

this으로 링크 상태 :

마우스 이동 메시지는 모든 횡단 픽셀가보고되는 것을 보장하지 않습니다 충분히 정확하지 않습니다. 자식 윈도우가 부모 가장자리 가까이에있을 때 마우스를 충분히 빠르게 움직이면 부모를위한 MouseEnter를 얻지 못하게됩니다.

그래서,이 솔루션은 단지 MouseEnter 이벤트를 수신 할 수 있었고,이 이벤트가 발생할 때, 나는 그것의 버튼을 숨기기 위해, 다른 컨트롤에 알림을 보낼 수 있습니다.

가장 세련된 솔루션은 아니지만 예상대로 작동합니다.

관련 문제