2009-07-27 10 views
6

Tout d'abord, l'événement mousewheel n'est pas répertorié dans le volet des événements de Visual Studio 2008, ce qui est très ennuyeux.Impossible de déclencher l'événement MouseWheel dans C# Windows Forms

J'ai trouvé le bon format en ligne cependant, et a écrit ceci dans mon code:

private void Form1_MouseWheel(object sender, MouseEventArgs e) 
    { 
     Debug.WriteLine("Foo"); 
    } 

... à partir de laquelle je reçois pas de réponse lorsque la molette de la souris est tournée. Je le fais dans la zone de classe principale de mon code, et le concepteur ne contient que la forme/fenêtre/quoi que ce soit, donc la souris ne perd pas le focus.

namespace BlahBlah 
{ 
    public partial class Form1 : Form 
    { 

Et en revanche, j'ai cette méthode juste au-dessus de la molette de la souris une et il fonctionne très bien:

private void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     Debug.WriteLine("Foo"); 
    } 

Si je devais deviner, je pense que je ne suis pas relier correctement le code à la forme (alias: tout ce que le studio visuel ferait pour moi si j'ajoutais cet événement à travers le panneau des événements du designer). Mais je peux me tromper ou simplement commettre une erreur stupide.

Pouvez-vous m'aider à obtenir TOUT type de réponse lorsque la molette de la souris est tournée? Merci!

Répondre

11

L'événement mousewheel doit être configuré.

Ajouter ce au constructeur de Form1 (Après InitalizeComponents();)

this.MouseWheel+= new MouseEventHandler(Form1_MouseWheel); 
+0

C'est tout, merci beaucoup! Side question: J'ai un pour ma méthode MouseMove ainsi (this.MouseMove + = Form1_MouseMove;), mais pas pour MouseClick. Pourquoi n'en a-t-il pas besoin? – cksubs

+1

Eh bien ... répond-il à un clic de souris? S'il n'a pas besoin de réagir aux clics de souris, il n'en aura pas besoin. Certains contrôles ont automatiquement lié des événements de clic de souris (pour le défilement et autres joyeusetés.) Cela dépend de ce que vous essayez d'accomplir. – Kurisu

+0

Je veux juste dire que ma méthode MouseClick fonctionne (feux sur un clic de souris) sans avoir besoin du truc ".... + = ...." dans le constructeur. C'est pourquoi j'ai oublié d'ajouter quelque chose comme ça pour MouseWheel, MouseClick a très bien fonctionné. – cksubs

1

Je ne sais pas comment m'abonner à cet événement particulier, mais vous pouvez substituer la méthode appropriée sur le formulaire.

6

Je n'ai pas assez réputation pour répondre à un commentaire, mais la réponse à votre question secondaire est que les délégués ne doivent être configuré. Toutefois, lorsque vous en créez un en double-cliquant dessus dans le volet des propriétés, le code est automatiquement généré et placé dans le fichier * .designer.cs de la méthode InitializeComponent.

+1

Oui, jetez un coup d'oeil dans le fichier designer.cs et regardez dans les régions, vous verrez comment le code gen a fait un peu de travail de câblage de ces événements pour vous. –

1

Il est préférable dans ce cas de remplacer la fonction membre OnMouseWheel plutôt que de s'enregistrer sur l'événement. Par exemple:

public class MyFrm : Form 
{ 
    protected override void OnMouseWheel(MouseEventArgs e) 
    { 
     /*Handle the mouse wheel here*/ 
     base.OnMouseWheel(e); 
    } 
} 
+0

Pourquoi est-ce mieux? –

+1

@JonofAllTrades Il a de meilleures performances et plus de flexibilité (vous pouvez faire votre travail avant l'un des délégués qui sont abonnés à l'événement). http://stackoverflow.com/questions/159317/when-should-you-override-onevent-as-opposed-to-subscribing-to-the-event-when-inh –