2012-09-20 11 views
10

tengo un control de usuariodetectar si el cursor está dentro de los límites de un control

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; 
    } 
} 

Cuando flotar sobre el control de usuario contenida en un formulario principal, el punto de interrupción no se ve afectado. El punto de interrupción se golpea muy cerca, pero puedo estar en un cuadro de texto real dentro del control del usuario y no recibir un golpe. ¿Cómo puedo determinar con precisión si estoy dentro de los límites de este control de usuario?

FWIW, tengo dos monitores. No parece marcar la diferencia qué monitor estoy usando.

+0

posible duplicado del [cursor sobre el control WinForm (C#, WinForm 4.0)] (http://stackoverflow.com/questions/5620276/cursor-over-winform-control-c-winform-4-0) –

+0

@ DanielA.White Las respuestas que veo en su enlace son específicas de un solo control. Tenga en cuenta que aquí estoy enganchado en un filtro de mensajes global. No creo que esos funcionen. Eventualmente necesito saber exactamente qué control se ha realizado, no solo el control general del usuario que contiene los controles secundarios. –

Respuesta

39

probar su prueba de posicionamiento en contra Control.ClientRectangle en lugar de Control.Bounds:

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

Si esto es de 'MouseEventArgs' incluso puedes simplemente tomar la propiedad' Location' de eso, sin el 'PointToClient'. – Nyerguds

-2

solo para truco rápido, puede activar el control de todos los usuarios con un evento y manejar el mouse sobre los eventos. por ejemplo, si tiene dos cuadro de texto en su usercontrol

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

Tenga en cuenta que al menos algunos controles activan el evento mousemove cuando reciben un evento de mouse-down. La mejor forma que encontré para tratar esto es verificar dos veces en el controlador de eventos del movimiento del mouse, si el puntero del mouse realmente está fuera del control. – xDisruptor

Cuestiones relacionadas