2008-10-04 28 views
11

Necesito disparar un evento cuando el mouse está sobre un PictureBox con el botón del mouse ya hecho clic y mantenido presionado.¿Cómo puedo detectar un botón sostenido del mouse sobre un PictureBox?

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 un botón del mouse, C# disparará el controlador de eventos MouseDown, pero cuando el cursor se mueve sobre el PictureBox, el evento MouseEnter no se dispara, hasta que se suelte el botón del mouse.

Respuesta

14

Cuando el ratón se presiona hacia abajo la mayoría de los controles será entonces Control.Capture la entrada del ratón. Esto significa que todos los eventos MouseMove se envían al control original que se capturó en lugar del control por el que pasa el mouse. Esto continúa hasta que el mouse pierda la captura, lo que generalmente sucede con el mouse hacia arriba.

Si realmente necesita saber cuando el mouse está sobre su control, incluso cuando otro control ha capturado la entrada del mouse, solo tiene una manera. Necesita curiosear los mensajes de Windows destinados a otros controles dentro de su aplicación. Para ello es necesario añadir un filtro de mensajes ...

Application.AddMessageFilter(myFilterClassInstance); 

Luego hay que poner en práctica 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; 
    } 
} 

Entonces detectar eventos de movimiento del ratón y compruebe si están sobre tu cuadro de imagen y haz lo que sea que quieras hacer.

-1

establece una bandera o un estado con el mouse hacia abajo. liberarlo en el mouse hacia arriba. Cuando se enciende el mouse sobre el cuadro de imagen, compruebe su estado. Ahora puede detectar cuando una persona está arrastrando algo.

eventos
13

ratón

Utilice el evento MouseDown para detectar sólo presione un botón del ratón y establecer this.Capture a true para que a continuación, obtener otros eventos de ratón, incluso cuando el ratón sale del control (es decir, no obtendrá un evento MouseLeave porque capturó el mouse). Libere la captura estableciendo esto. Capture en falso cuando se produce MouseUp.

Sólo comprobar el estado del ratón

Esto puede no ser relevante, pero se puede comprobar System.Windows.Control.MousePosition y ver si está en el PictureBox.ClientRectangle, a continuación, comprobar la propiedad estática Control.MouseButtons por qué botones podrían colgar el en cualquier momento.

como en:

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

muuuy cerca !! Borrar this.capture funciona para MouseLeave, pero no MouseEnter (de otro PictureBox) –

+0

No entendí completamente lo que intentabas lograr, así que no, esto no funcionará desafortunadamente. –

3

Si está intentando implementar una operación de arrastrar y soltar de algún tipo, los eventos Arrastrar ... (DragEnter, DragDrop etc.) en el cuadro de imagen de recepción son los 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 Arrastrar ... levantados.

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

+0

Por el sonido de las cosas, este es probablemente el camino correcto a seguir. Si la interfaz de usuario no está orientada para arrastrar y soltar, ¿por qué estamos buscando eventos de mouse que comenzaron en un control y terminan en otro? :) –

5

Establecer un evento MouseMove en el control de cuadro de imagen:

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

Luego, dentro de su controlador de eventos MouseMove, comprobar para ver si se pulsa el botón izquierdo del ratón (o lo que sea):

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

Nota: Esta es una API de WinForms, no un WPF (¡+1 de todos modos!) – Li3ro

0

La mejor forma de mover un formulario basado en la posición del mouse y controlar la posición relativa 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 PictureBox Control.

Bruno Ratnieks

Sniffer Redes

Cuestiones relacionadas