2010-12-13 27 views
16

Cómo capturar la rueda del mouse en el panel en C#? estoy usando Windows FormsCómo capturar la rueda del mouse en el panel?

EDIT:

trato de hacerlo en PictureBox ahora.

Mi código:

this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);  
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick); 
private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
    MessageBox.Show("Click"); 
    } 

obras de clic. Wheelling no. ¿Por qué?

Respuesta

19

Windows envía el mensaje WM_MOUSEWHEEL al control que tiene el foco. Eso no será un Panel, no es un control que pueda enfocarse. Tan pronto como pones un control en el panel, di un botón, luego el botón obtiene el foco y el mensaje.

Sin embargo, el botón no tiene uso para el mensaje, no tiene nada para desplazarse. Windows lo nota y envía el mensaje al padre. Ese es el panel, ahora se desplazará.

Encontrará el código para un panel personalizado que puede obtener el foco en this answer.


ACTUALIZACIÓN: tenga en cuenta que este comportamiento ha cambiado en Windows 10. Las "ventanas inactivas de desplazamiento cuando se ciernen sobre ellos" está activada de forma predeterminada. Hace que el comportamiento de la rueda del mouse sea más consistente con la forma en que funciona en un navegador o, por ejemplo, en un programa de Office. En este caso específico, la caja de imágenes ahora tendrá para obtener el evento. Se cuidadoso con esto.

+0

Vea esta respuesta acerca de cómo hacer eso con un panel: http://stackoverflow.com/a/9086750/1353187 –

5

Para realizar el cableado en forma manual ...

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel); 

private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    ///process mouse event 
} 

más fácil método es en Visual Studio, haga clic en el panel, propiedades Goto viewpanel, eventos selectos, localizar y haga doble clic en el evento "mousewheel".

+2

no puedo ver la rueda del ratón. Hay MouseCaptureChanged, MouseClick, MouseDoubleClick, MouseDown, MouseEnter, MouseHover, MpouseLeave, MouseMove, MouseUp –

+1

Es extraño que tengas razón. No estoy seguro de por qué Visual Studio no lo tiene en la lista. Si lo conectas manualmente, funciona. Aquí hay un programa de ejemplo que usa el evento MouseWheel. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx –

+2

Fwiw, no aparece en el panel de propiedades porque la declaración de este evento está decorada con "[Navegable (falso)]". Además, no se mostrará en el panel de autocompletar de IntelliSense a menos que VS esté configurado para mostrar miembros avanzados (creo que VB los oculta, mientras que C# no lo hace de manera predeterminada), y esto sucede porque también está decorado con "[EditorBrowsable (EditorBrowsableState] .Avanzado)]". –

21

Si no puede ver el evento "MouseWheel" en un componente, debe crearlo manualmente. Además, debemos enfocar ese componente, de lo contrario, el evento "MouseWheel" no funcionará para ese componente. Le mostraré cómo crear un evento "MouseWheel" para "pictureBox1" y cómo funciona.

  1. dentro del constructor, cree un evento de la rueda del ratón sobre ese componente.

    InitializeComponent(); 
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel; 
    
  2. CREA LA FUNCIÓN manualmente. De acuerdo con mi ejemplo, lo llaman "pictureBox1_MouseWheel"

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) 
    { 
        //you can do anything here 
    } 
    
  3. crear un evento MouseHover en la que el componente (Ir a propiedades en PicureBox1, seleccione caso, localizar "MouseHover" y haga doble clic en el evento "MouseHover").

  4. CALL "Enfoque()"; método dentro de ese evento MouseHover.

    pictureBox1.Focus(); 
    
  5. Ahora ejecute el programa.

+1

¡Un hombre! En mi caso, no necesito el 'Mouse/Scroll EventArgs' así que he establecido' private void EventFunc (object remitente, EventArgs e) '. De esta forma puedo configurar ambos controladores (scroll y mousewheel) en la misma función :). Limpiar. – C4u

+0

¡esa es la respuesta! gracias. – jonathana

+0

debería ser la respuesta aceptada – Akumaburn

1

Conseguir eventos mousewheel es complicado. La forma más fácil es usar

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

en lugar de

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

De esta manera se forma el evento en lugar del control. De esta manera es fácil, pero tiene un problema: puede usar solo un evento de mouse en su forma.

Si usted tiene más de un control para conseguir la rueda del ratón caso la mejor manera es This answer by "Shehan Silva - weltZ"

Cuestiones relacionadas