2016-08-29 3 views
0

Dans mon application de formulaires Windows, il arrive fréquemment qu'un utilisateur défile dans un panneau et soit ensuite bloqué par un richtextbox. Je voudrais attraper l'événement de défilement et l'envoyer au panneau lorsque la barre de défilement verticale richtextbox n'est pas visible.Envoyer l'événement de défilement au formulaire

je l'ai déjà trouvé le code pour vérifier si la barre de défilement vertical est visible dans ce fil: https://social.msdn.microsoft.com/Forums/en-US/a3facad3-0eae-4610-9a63-1b6c7a718bf5/how-do-you-determine-if-vertical-scroll-bar-is-visible-in-richtextbox?forum=winforms

également l'événement VScroll d'une seule richtextbox est déclenchée lorsque le verticalScrollBar est déjà visible.

Quelle serait la bonne façon d'attraper le mousescroll et de l'envoyer au bon panneau?

Répondre

1

Je pense que vous pouvez ajouter un événement à votre zone de texte enrichi dans vos Form1.Designer.cs comme ce code:

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

et ajoutez cette fonction à votre formulaire:

private void richTextBox1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    Control control = sender as Control; 
    if (!NativeMethods.VerticalScrollBarVisible(control)) 
    { 
     int numberOfTextLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines; 
     int numberOfPixelsToMove = numberOfTextLinesToMove * Convert.ToInt32(control.Font.Size); 
     if (panel1.VerticalScroll.Value - numberOfPixelsToMove < panel1.VerticalScroll.Minimum) 
      panel1.VerticalScroll.Value = panel1.VerticalScroll.Minimum; 
     else if (panel1.VerticalScroll.Value - numberOfPixelsToMove > panel1.VerticalScroll.Maximum) 
      panel1.VerticalScroll.Value = panel1.VerticalScroll.Maximum; 
     else 
      panel1.VerticalScroll.Value -= numberOfPixelsToMove; 
    } 
} 

Le VerticalScrollBarVisible méthode est expliquée dans this MSDN thread.

+0

Merci, cet événement MouseWheel se déclenche également lorsque la barre de défilement n'est pas visible. J'ai suggéré une modification pour ajouter le code qui envoie la valeur de défilement à un panneau. –

0

L'événement MouseWheel suggéré par @Farshad se déclenche également lorsque la barre de défilement verticale n'est pas visible. J'ai ensuite ajouté le code suivant pour faire défiler panel1. Notez que l'événement MouseWheel n'est pas affiché dans le concepteur de studio visuel et doit être ajouté manuellement à Form.Designer.cs.

private void richTextBox1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    Control control = sender as Control; 
    if (!VerticalScrollBarVisible(control)) 
    { 
     int numberOfTextLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines; 
     int numberOfPixelsToMove = numberOfTextLinesToMove * Convert.ToInt32(control.Font.Size); 
     if (panel1.VerticalScroll.Value - numberOfPixelsToMove < panel1.VerticalScroll.Minimum) 
      panel1.VerticalScroll.Value = panel1.VerticalScroll.Minimum; 
     else if (panel1.VerticalScroll.Value - numberOfPixelsToMove > panel1.VerticalScroll.Maximum) 
      panel1.VerticalScroll.Value = panel1.VerticalScroll.Maximum; 
     else 
      panel1.VerticalScroll.Value -= numberOfPixelsToMove; 
    } 
} 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private extern static int GetWindowLong(IntPtr hWnd, int index); 

public static bool VerticalScrollBarVisible(Control ctl) { 
    int style = GetWindowLong(ctl.Handle, -16); 
    return (style & 0x200000) != 0; 
}