2012-09-20 2 views
10

의 범위 내에 있으면 나는 부모 폼에 포함 된 사용자 컨트롤 위에 떠 언제 사용자 컨트롤커서 제어

public partial class UserControl1 : UserControl, IMessageFilter 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     var mouseLocation = Cursor.Position; 

     if (Bounds.Contains(PointToClient(mouseLocation))) 
     { 
      bool aBool = true;//breakpoint 
      bool two = aBool;//just assignment so compiler doesn't optimize my bool out 
     } 
     if (m.Msg != 0x20a) // Scrolling Message 
     { 
      return false;//ignore message 
     } 
     return false; 
    } 
} 

이 감지 중단 점을 공격하지 않습니다. 중단 점은 가까운 거리에서 발생하지만 사용자 컨트롤 내부의 실제 텍스트 상자에있을 수 있습니다. 이 사용자 정의 컨트롤의 범위 내에 있는지 정확하게 판단하려면 어떻게합니까?

FWIW, 두 대의 모니터가 있습니다. 그것은 내가 사용하고있는 모니터를 변화시키는 것처럼 보이지 않습니다.

+0

[의 WinForm 제어를 통해 커서 (C#을,의 WinForm 4.0)]의 중복 가능성 (http://stackoverflow.com/questions/5620276/cursor-over-winform-control-c-winform-4-0) –

+0

@ DanielA.White 귀하의 링크에서 볼 수있는 답변은 하나의 컨트롤에만 해당됩니다. 여기서 나는 전역 메시지 필터에 연결하고있다. 나는 그것이 효과가 있다고 생각하지 않는다. 결국 마우스 컨트롤이 자식 컨트롤을 포함하는 일반 사용자 컨트롤뿐만 아니라 정확히 무엇인지 알아야합니다. –

답변

39

Control.ClientRectangle보다는 Control.Bounds에 대한 귀하의 히트 테스트를 시도하여 UserControl을 두 텍스트 상자가 있다면 예를 들어 :

if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) { 
    bool aBool = true;//breakpoint 
    bool two = aBool; 
} 
+0

이것이'MouseEventArgs'에서 온 것이면'PointToClient'가 없어도'Location' 속성을 취할 수 있습니다. – Nyerguds

-2

빠른 트릭을 위해서, 하나의 이벤트로 모든 사용자 컨트롤의 컨트롤을 트리거하고 이벤트에 마우스를 처리 할 수 ​​있습니다. 당신이

textBox1.MouseMove += new MouseEventHandler(controls_MouseMove); 
    textBox2.MouseMove += new MouseEventHandler(controls_MouseMove); 
    ... 

    void controls_MouseMove(object sender, MouseEventArgs e) 
    { 
     Control subc=sender as Control; 
     int mouseX = MousePosition.X; 
     .... 
    } 
+0

적어도 일부 컨트롤은 마우스 다운 이벤트를받을 때 mousemove 이벤트를 발생시킵니다. 이 문제를 해결하기 위해 발견 된 가장 좋은 방법은 마우스 포인터가 실제로 컨트롤 밖에 있는지 마우스 이동의 이벤트 처리기 내에서 두 번씩 확인하는 것입니다. – xDisruptor