2010-01-19 6 views
13

événement mouseWheel ne se déclenche pas quand je me sers de tout contrôle (ListBox, panneau, TextBox) avec des barres de défilement.événement MouseWheel ne se déclenche pas lorsque vous utilisez un contrôle avec scrolbars (en C# Windows Forms)

Pour reproduire le problème:

public class Form1 : Form 
{ 
    private readonly Button button1; 
    private readonly TextBox textBox1; 

    private void button1_MouseWheel(object sender, MouseEventArgs e) 
    { 
    ToString(); // doesn't fire when uncomment lines below 
    } 

    public Form1() 
    { 
    button1 = new Button(); 
    textBox1 = new TextBox(); 
    SuspendLayout(); 

    button1.Location = new System.Drawing.Point(80, 105); 
    button1.Size = new System.Drawing.Size(75, 23); 
    button1.MouseWheel += button1_MouseWheel; 
    button1.Click += button1_Click; 

    textBox1.Location = new System.Drawing.Point(338, 105); 
    //textBox1.Multiline = true; // uncomment this 
    //textBox1.ScrollBars = ScrollBars.Vertical; // uncomment this 
    textBox1.Size = new System.Drawing.Size(100, 92); 

    ClientSize = new System.Drawing.Size(604, 257); 
    Controls.Add(textBox1); 
    Controls.Add(button1); 
    ResumeLayout(false); 
    PerformLayout(); 
    } 

    // Clicking the button sets Focus, but even I do it explicit Focus() or Select() 
    // still doesn't work 
    private void button1_Click(object sender, System.EventArgs e) 
    { 
    button1.Focus(); 
    button1.Select(); 
    } 
} 
+0

Peut-être que le problème est dans la souris, utiliser "Lenovo USB Optical Wheel Mouse" (configuration par défaut fonction "Bouton Whell" "Quick/AutoScroll") – halorty

+0

J'utilise: Windows Vista Buisness, Net Framework 3.5 SP1 , Visual Studio 2008 Standard Edition (tous les correctifs officiels). Build Debug: Target Framework = .Net Framework 3.5, Type de sortie = Windows Application – halorty

+0

Configuration de la souris: Panneau de configuration/Souris/Roue/Poussoir-> Activer le défilement universel; Panneau de configuration/Souris/Roue/Bouton de commande-> Rapide/AutoScrol; Panneau de configuration/Souris/Roue/Vitesse de défilement-> Défilement = 10 ligne (s) par note; – halorty

Répondre

2

J'ai trouvé la solution, gility est par défaut "Configuration de la souris". Lenovo configuration par défaut optique USB Wheel Mouse est:

Panneau de configuration/Souris/Roue/Whell->Activer Scrolling Universal;

j'ai changé:

Panneau de configuration/Souris/Roue/Whell->Utilisez Microsoft Office 97 Scrolling Emulation seulement

maintenant dans le code .net MouseWheel travailler avec Axécontrôle.


Mais les questions sont les suivantes:

  • comment puis-je fixer dans le code .net?
  • comment puis-je détecter cette situation dans le code .net?

Des idées?

+0

Utilisez Spy ++ et vérifier quels messages sont envoyés aux commandes. – SLaks

2

Vous devez normalement pour vous assurer que le contrôle que vous voulez gérer l'événement MouseWheel est actif. Par exemple, essayez d'appeler button1.Select() dans l'événement Form Load (ou Shown), puis d'utiliser la molette de défilement.

par exemple:

private void Form1_Load(object sender, EventArgs e) 
{ 
    button1.MouseWheel += new MouseEventHandler(button1_MouseWheel); 

    button1.Select(); 
} 
+0

Toujours rien, même problème, c'est très étrange, mais dans mon cas ça ne marche pas. Même si je mets Focus ou Select, et que Cursor est sur le buton1, quand j'utilise la molette de la souris, il défile textbox1 (sic!) – halorty

0

J'ai essayé votre exemple, et, si les lignes ont été commentées ou non, l'événement MouseWheel ne se déclenche que si le bouton est concentré. Ce comportement est voulu par la conception. (L'événement MouseWheel, comme les événements de clavier, va au contrôle ciblé)

+0

Je lis sur la documentation, mais c'est très étrange, mais dans mon cas ça ne marche pas : Ajoutez au code: public Form1() { (...) button1.Click + = button1_Click; (...) } private void button1_Click (expéditeur d'objet, System.EventArgs e) { button1.Focus(); } ne fonctionne pas, même je mis au point, et le curseur est sur la buton1, quand j'utiliser la molette de la souris, il défile textbox1 (sic!) – halorty

12

J'avais le même problème, et ce qui a fonctionné pour moi était d'ajouter un gestionnaire pour l'événement MouseEnter dans le contrôle, celui qui est déclenché avec ou sans focus.

private void chart1_MouseEnter(object sender, EventArgs e) 
{ 
    chart1.Focus(); 
} 

Après cela, j'ai pu obtenir les événements mouseWheel sans problème.

Questions connexes