向表单发送滚动事件

Send scroll event to form

在我的 windows 表单应用程序中,用户滚动面板然后被 richtextbox 阻止的情况经常发生。我想在 richtextbox 垂直滚动条不可见时捕获滚动事件并将其发送到面板。

我已经在这个线程中找到了检查垂直滚动条是否可见的代码: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

此外,richtextboxVScroll 事件仅在垂直滚动条已经可见时触发。

捕获鼠标滚动并将其发送到正确面板的正确方法是什么?

我认为您可以像下面的代码一样向 Form1.Designer.cs 中的富文本框添加事件:

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

并将此功能添加到您的表单中:

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

VerticalScrollBarVisible 方法在 this MSDN thread 中有解释。

@Farshad 建议的事件 MouseWheel 也会在垂直滚动条不可见时触发。然后我添加了以下代码来滚动 panel1。请注意,MouseWheel 事件未显示在 visual studio 设计器中,必须手动添加到 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;
}