2010-05-13 5 views
0

J'ai un problème lors de l'appel de ma méthode privée sur l'événement MouseWheel. En fait, l'événement de ma roulette de souris se déclenche correctement lorsque j'incrémente une variable ou affiche quelque chose dans la barre de titre, etc. Mais quand je veux appeler une méthode privée, cette méthode n'est appelée qu'une seule fois. méthode en fonction de la vitesse de défilement c.-à-d. lorsque défiler est fait une fois lentement appeler la méthode privée une fois, mais lorsque le défilement est fait à grande vitesse appelez la méthode privée plus d'une fois en fonction de la vitesse de défilement. Pour plus d'explications je place l'exemple de code qui affiche la valeur de i dans la barre de titre et l'ajoute correctement dans le contrôle Listbox en fonction de la vitesse de défilement mais quand je veux appeler la méthode privée plus d'une fois selon la vitesse de défilement, cette méthode est appelée seulement une fois.MouseWheel Event Fire

public partial class Form1 : Form 
{ 
    ListBox listBox1 = new ListBox(); 
    int i = 0; 

    public Form1() 
    { 
     InitializeComponent(); 

     // Settnig ListBox control properties 
     this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right))); 
     this.listBox1.FormattingEnabled = true; 
     this.listBox1.Location = new System.Drawing.Point(13, 13); 
     this.listBox1.Name = "listBox1"; 
     this.listBox1.Size = new System.Drawing.Size(259, 264); 
     this.listBox1.TabIndex = 0; 

     // Attaching Mouse Wheel Event 
     this.listBox1.MouseWheel += new MouseEventHandler(Form1_MouseWheel); 

     // Adding Control 
     this.Controls.Add(this.listBox1); 
    } 

    void Form1_MouseWheel(object sender, MouseEventArgs e) 
    { 
     i++; 
     this.Text = i.ToString(); 
     this.listBox1.Items.Add(i.ToString());    

     // Uncomment the following line to call the private method 
     // this method gets called only one time irrelevant of the 
     // mouse wheel scroll speed. 
     // this.LaunchThisEvent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.listBox1.Select(); 
    } 

    private void LaunchThisEvent() 
    { 
     // Display message each time 
     // this method gets called. 
     MessageBox.Show(i.ToString()); 
    } 
} 

Comment appeler la méthode privée plus d'une fois en fonction de la vitesse du défilement de la molette de la souris?

Répondre

2

Vous pouvez essayer d'utiliser le champ MouseEventArgs.Delta pour calculer le nombre d'appels:

 int timesToCall = Math.Abs(e.Delta/120); 

     for (int k = 0; k < timesToCall; ++k) 
     { 
      this.LaunchThisEvent(); 
     } 

`

+0

De cette façon, le timesToCall atteint son maximum à 2 mais si vous seule valeur d'affichage int i barre de titre, il est beaucoup plus gros presque 6 –

+0

Eh bien, j'ai juste essayé avec le code modifié dans lequel le timesToCall est affiché dans la barre de titre et j'en ai eu 6. Cela dépend vraiment de la vitesse de rotation de la roue. –

+0

Et, aussi, si vous changez la ligne qui ajoute des entrées à la liste pour montrer la valeur de Delta, vous verrez beaucoup d'entrées comme 360, 480, etc. C'est, bien sûr, sur mon ordinateur, et la souris est différent. –