2012-09-20 21 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

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

如果這是來自'MouseEventArgs',那麼您甚至可以只使用'Location'屬性,而不使用'PointToClient'。 – 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