it-swarm-eu.dev

Comment capturer la molette de la souris sur le panneau?

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

ÉDITER:

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

Cliquer sur fonctionne. Wheelling ne fonctionne pas. Pourquoi?

23
Miko Kronn

Windows envoie le message WM_MOUSEWHEEL au contrôle qui a le focus. Ce ne sera pas Panel, ce n'est pas un contrôle qui peut se concentrer. Dès que vous placez un contrôle sur le panneau, dites un bouton, puis 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 le remarque et envoie le message au parent. C'est le panneau, maintenant il défilera.

Vous trouverez du code pour un panneau personnalisé qui peut obtenir le focus dans cette réponse .


MISE À JOUR: notez que ce comportement a changé dans Windows 10. La nouvelle option "Faire défiler les fenêtres inactives lorsque je les survole" est activée par défaut. Le rend le comportement de la molette de la souris plus cohérent avec la façon dont il fonctionne dans un navigateur ou, par exemple, un programme Office. Dans ce cas spécifique, la Picturebox maintenant recevra l'événement. Attention à ça.

21
Hans Passant

Si vous ne pouvez pas voir l'événement "MouseWheel" sur un composant, vous devez le créer manuellement. De plus, nous devons concentrer 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 de roue de souris sur ce composant.

    InitializeComponent();
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
    
  2. CRÉEZ LA FONCTION manuellement. Selon mon exemple, appelez-le "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 (allez dans les propriétés de PicureBox1, sélectionnez un événement, localisez "MouseHover" et double-cliquez sur l'événement "MouseHover").

  4. APPEL "Focus ()"; dans cet événement MouseHover.

    pictureBox1.Focus();
    
  5. Exécutez maintenant le programme.

35
Shehan Silva

Pour le 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
}

La méthode la plus simple consiste à cliquer sur Visual Studio dans le panneau, à afficher les propriétés, à sélectionner les événements, à localiser et à double-cliquer sur l'événement "Mousewheel".

7
Gerald Davis

Dans Winforms, ceci est réalisé en utilisant événement Control.MouseWheel

5
Ian Nelson

Obtenir des événements de roue de souris est délicat. La façon la plus simple est d'utiliser

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, le formulaire obtient l'événement au lieu du contrôle. Cette méthode est simple mais a un problème: vous ne pouvez utiliser qu'un seul événement de roue de souris dans votre formulaire.

Si vous avez plus d'un contrôle pour obtenir un événement de roue de souris, le meilleur moyen est Cette réponse de "Shehan Silva - weltZ"

1
Mokhabadi