2016-08-29 6 views
0

In meiner Windows Forms-Anwendung tritt häufig auf, dass ein Benutzer durch ein Panel scrollt und dann von einem richtextbox blockiert wird. Ich möchte das Bildlaufereignis abfangen und an das Panel senden, wenn die vertikale Bildlaufleiste richtextbox nicht sichtbar ist.Scroll-Ereignis senden an Formular

Ich fand schon den Code, wenn die vertikale Bildlaufleiste in diesem Thread sichtbar zu überprüfen: 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

Auch die VScroll Falle eines richtextbox wird nur dann ausgelöst, wenn der verticalScrollBar bereits sichtbar ist.

Was wäre der richtige Weg, um die Mousecroll zu fangen und an das richtige Panel zu senden?

Antwort

1

glaube ich Ihnen einen Termin in Ihrem Rich-Text-Feld in Ihrem Form1.Designer.cs wie dieser Code hinzufügen:

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

und fügen Sie diese Funktion, um Ihre Form:

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

Die VerticalScrollBarVisible Methode ist in this MSDN thread erläutert.

+0

Vielen Dank, dieses MouseWheel-Ereignis wird auch ausgelöst, wenn die Bildlaufleiste nicht sichtbar ist. Ich habe eine Änderung vorgeschlagen, um den Code hinzuzufügen, der den Bildlaufwert an ein Panel sendet. –

0

Das von @Farshad vorgeschlagene Ereignis MouseWheel wird auch ausgelöst, wenn die vertikale Bildlaufleiste nicht sichtbar ist. Ich fügte dann den folgenden Code hinzu, um zu scrollen panel1. Beachten Sie, dass das Ereignis MouseWheel nicht im Visual Studio Designer angezeigt wird und manuell zu Form.Designer.cs hinzugefügt werden muss.

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