2010-12-13 42 views
16

Comment capturer la molette de la souris sur le panneau en C#? J'utilise WinFormsComment capturer la molette de la souris sur le panneau?

EDIT:

J'essaie de le faire sur PictureBox maintenant.

Mon code:

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

œuvres cliquant dessus. Wheelling ne fait pas. Pourquoi?

Répondre

19

Windows envoie le message WM_MOUSEWHEEL au contrôle qui a le focus. Ce ne sera pas un panel, ce n'est pas un contrôle qui peut être ciblé. Dès que vous mettez un contrôle sur le panneau, dites un bouton, le bouton obtient le focus et le message.

Le bouton n'a cependant aucune utilité pour le message, il n'a rien à faire défiler. Windows remarque cela et envoie le message au parent. C'est le panneau, maintenant il va défiler.

Vous trouverez du code pour un panneau personnalisé que peut obtenir le focus dans this answer.


MISE À JOUR: Notez que ce comportement a changé dans Windows 10. L'option « défilement des fenêtres inactives quand je passe la souris sur eux » est activée par défaut. Cela rend le comportement de la molette de la souris plus cohérent avec le fonctionnement d'un navigateur ou, disons, d'un programme Office. Dans ce cas précis, l'image va recevoir l'événement. Attention à cela.

+0

Voir cette réponse sur la façon de le faire avec un panneau: http://stackoverflow.com/a/9086750/1353187 –

5

Pour câbler manuellement ...

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éthode est plus facile en un clic studio visuel sur le panneau, les propriétés goto ViewPanel, sélectionnez les événements, localiser et double-cliquez sur l'événement "mousewheel".

+2

Je ne vois pas mousewheel. Il ya MouseCaptureChanged, MouseClick, MouseDoubleClick, MouseDown, MouseEnter, MouseHover, MpouseLeave, MouseMove, MouseUp –

+1

Bizarre, vous avez raison. Vous ne savez pas pourquoi Visual Studio ne l'a pas répertorié. Si vous le branchez manuellement cela fonctionne. Voici un exemple de programme utilisant l'événement MouseWheel. http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.mousewheel.aspx –

+2

Fwiw, il n'apparaît pas dans le panneau d'affichage Propriétés car la déclaration de cet événement est décorée avec "[Browsable (false)]". En outre, il n'apparaîtra pas dans le panneau de saisie semi-automatique d'IntelliSense sauf si VS est configuré pour afficher les membres avancés (je crois que VB les cache, alors que C# ne le fait pas par défaut) - et cela est également dû à "[EditorBrowsable (EditorBrowsableState .Avancée)]". –

21

Si vous ne voyez pas l'événement "MouseWheel" sur un composant, vous devez le créer manuellement. En outre, nous devons focaliser ce composant, sinon l'événement "MouseWheel" ne fonctionnera pas pour ce composant. Je vais vous montrer comment créer un événement "MouseWheel" pour "pictureBox1" et comment cela fonctionne.

  1. À L'INTÉRIEUR DU CONSTRUCTEUR, créez un événement mousewheel sur ce composant.

    InitializeComponent(); 
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel; 
    
  2. CRÉER LA FONCTION manuellement. Selon mon exemple, appeler « pictureBox1_MouseWheel »

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) 
    { 
        //you can do anything here 
    } 
    
  3. créer un événement MouseHover sur ce composant (Aller aux propriétés à PicureBox1, événement select, recherchez « MouseHover » et double-cliquez sur l'événement « MouseHover »).

  4. CALL "Focus()"; méthode à l'intérieur de cet événement MouseHover.

    pictureBox1.Focus(); 
    
  5. Maintenant, exécutez le programme.

+1

A w e s m e guy! Dans mon cas, je n'ai pas besoin de 'Mouse/Scroll EventArgs' donc j'ai défini' private EventidFunc (object sender, EventArgs e) '. De cette façon, je peux configurer les deux gestionnaires (scroll et mousewheel) sur la même fonction :). Nettoyer. – C4u

+0

c'est la réponse! Je vous remercie. – jonathana

+0

devrait être la réponse acceptée – Akumaburn

1

Obtenir des événements mousewheel est délicat. La façon la plus simple utilise

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

au lieu de

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

De cette façon, la forme devient l'événement au lieu de contrôle. Cette méthode est simple mais pose un problème: vous ne pouvez utiliser qu'un seul événement mousewheel dans votre formulaire.

Si vous avez plus d'un contrôle pour obtenir événement mouseWheel la meilleure façon est This answer by "Shehan Silva - weltZ"