Pregunta

Necesito disparar un evento cuando el mouse está arriba de un PictureBox con el botón del mouse ya presionado y presionado.

Problemas:

Los controladores de eventos MouseDown y MouseEnter no funcionan muy bien juntos.

Por ejemplo, una vez que se hace clic y se mantiene presionado el botón del mouse, C # disparará el controlador de eventos MouseDown, pero cuando el cursor se desplace sobre el PictureBox, el evento MouseEnter no se activará, hasta que se suelte el botón del mouse.

¿Fue útil?

Solución

Cuando se presiona el mouse, la mayoría de los controles luego Control.Capture la entrada del mouse. Esto significa que todos los eventos de MouseMove se envían al control original que capturó en lugar del control sobre el que pasa el mouse. Esto continúa hasta que el mouse pierde la captura, lo que generalmente ocurre con el mouse arriba.

Si realmente necesitas saber cuándo el mouse está sobre tu control, incluso cuando otro control haya capturado la entrada del mouse, entonces solo tienes una forma. Debe fisgonear los mensajes de Windows destinados a otros controles dentro de su aplicación. Para ello necesitas agregar un filtro de mensajes ...

Application.AddMessageFilter(myFilterClassInstance);

Entonces necesitas implementar el IMessageFilter en una clase adecuada ...

public class MyFilterClass : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_MOUSEMOVE)
            // Check if mouse is over my picture box!

        return false;
    }
}

Luego, observa los eventos de movimiento del mouse y comprueba si están sobre el cuadro de imagen y hace lo que quieras hacer.

Otros consejos

Eventos del mouse

Use el evento MouseDown para detectar simplemente presionar un botón del mouse y configurar esto. Capture a true para que luego obtenga otros eventos del mouse, incluso cuando el mouse abandone el control (es decir, no obtendrá un evento MouseLeave) porque has capturado el ratón). Libere la captura configurando esto. Capture en falso cuando se produce MouseUp.

Solo comprobando el estado del mouse

Esto puede no ser relevante, pero puede verificar System.Windows.Control.MousePosition y ver si está en el PictureBox.ClientRectangle , luego verifique el Control.MouseButtons propiedad estática para la cual los botones pueden estar inactivos en cualquier momento.

Como en:

if  (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition)))
{
   if ((Control.MouseButtons & MouseButtons.Left) != 0)
   {
     // Left button is down.
   }
}

Configure un evento MouseMove dentro del control PictureBox:

this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove);

Luego, dentro de su controlador de eventos MouseMove, verifique si se presiona el botón izquierdo del mouse (o lo que sea):

private void myPictureBox_MouseMove(object sender, MouseEventArgs e)
{  
     if (e.Button == MouseButtons.Left)
         // Do what you want to do
}

Si está intentando implementar una operación de arrastrar y soltar de algún tipo, los eventos de arrastre ... (DragEnter, DragDrop, etc.) en el cuadro de imagen de recepción son lo que desea usar. Básicamente, inicia la operación de arrastre utilizando el método DoDragDrop del control de origen, y luego cualquier control que arrastre tendrá sus eventos de arrastre ... levantados.

Buscar " DoDragDrop " en MSDN para ver cómo implementar esto.

La mejor forma de mover un formulario basado en la posición del mouse y la posición relativa de control es similar a lo que publicó Ian Campbell.

    private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2);
            Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); 
        }

    }

Donde imgMoveWindow es un control PictureBox.

Bruno Ratnieks

Redes de rastreo

establece una bandera o un estado con el mouse hacia abajo. suéltalo en el mouse arriba. Cuando se pasa el mouse sobre el fuego para el cuadro de imagen, verifique su estado. Ahora puedes detectar cuándo una persona está arrastrando algo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top