【问题标题】:Send scroll event to form向表单发送滚动事件
【发布时间】:2016-08-29 10:13:53
【问题描述】:

在我的 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 事件仅在垂直滚动条已经可见时才会触发。

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

【问题讨论】:

    标签: c# winforms scrollbar richtextbox


    【解决方案1】:

    我认为您可以在 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 中进行了解释。

    【讨论】:

    • 谢谢,当滚动条不可见时,此 MouseWheel 事件也会触发。我建议进行编辑以添加将滚动值发送到面板的代码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多