C# 将滚动事件发送到表单

C# 将滚动事件发送到表单,c#,winforms,scrollbar,richtextbox,C#,Winforms,Scrollbar,Richtextbox,在我的windows窗体应用程序中,经常出现用户滚动面板,然后被richtextbox阻止的情况。我想捕获滚动事件,并在richtextbox垂直滚动条不可见时将其发送到面板 我已经找到了检查垂直滚动条在此线程中是否可见的代码: 另外,richtextbox的VScroll事件仅在垂直滚动条已可见时触发 捕捉鼠标滚动并将其发送到正确的面板的正确方法是什么?我认为您可以在Form1.Designer.cs的富文本框中添加一个事件,如下代码: this.richTextBox1.MouseWheel

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

我已经找到了检查垂直滚动条在此线程中是否可见的代码:

另外,
richtextbox
VScroll
事件仅在垂直滚动条已可见时触发


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

我认为您可以在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;
    }
}
private void richTextBox1_鼠标滚轮(对象发送器,MouseEventArgs e)
{
控制=发送方作为控制;
如果(!NativeMethods.VerticalScrollBarVisible(控件))
{
int numberOfTextLinesToMove=e.Delta*SystemInformation.mouseweelScrollLines;
int numberOfPixelsToMove=numberOfTextLinesToMove*Convert.ToInt32(control.Font.Size);
if(panel1.VerticalScroll.Value-像素数移动panel1.VerticalScroll.Maximum)
panel1.VerticalScroll.Value=panel1.VerticalScroll.Maximum;
其他的
panel1.VerticalScroll.Value-=要移动的像素数;
}
}

VerticalScrollBarVisible
方法在中进行了解释。

我认为您可以向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;
    }
}
private void richTextBox1_鼠标滚轮(对象发送器,MouseEventArgs e)
{
控制=发送方作为控制;
如果(!NativeMethods.VerticalScrollBarVisible(控件))
{
int numberOfTextLinesToMove=e.Delta*SystemInformation.mouseweelScrollLines;
int numberOfPixelsToMove=numberOfTextLinesToMove*Convert.ToInt32(control.Font.Size);
if(panel1.VerticalScroll.Value-像素数移动panel1.VerticalScroll.Maximum)
panel1.VerticalScroll.Value=panel1.VerticalScroll.Maximum;
其他的
panel1.VerticalScroll.Value-=要移动的像素数;
}
}

VerticalScrollBarVisible
方法在中进行了说明。

当垂直滚动条不可见时,@Farshad建议的事件
MouseWheel
也会触发。然后,我将以下代码添加到滚动
panel1
。请注意,
mouseweel
事件不会显示在visual studio designer中,必须手动添加到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;
}
private void richTextBox1_鼠标滚轮(对象发送器,MouseEventArgs e)
{
控制=发送方作为控制;
如果(!VerticalScrollBar可见(控件))
{
int numberOfTextLinesToMove=e.Delta*SystemInformation.mouseweelScrollLines;
int numberOfPixelsToMove=numberOfTextLinesToMove*Convert.ToInt32(control.Font.Size);
if(panel1.VerticalScroll.Value-像素数移动panel1.VerticalScroll.Maximum)
panel1.VerticalScroll.Value=panel1.VerticalScroll.Maximum;
其他的
panel1.VerticalScroll.Value-=要移动的像素数;
}
}
[System.Runtime.InteropServices.DllImport(“user32.dll”)]
私有外部静态int-GetWindowLong(IntPtr-hWnd,int-index);
公共静态bool垂直滚动条可见(控制ctl){
int style=GetWindowLong(ctl.Handle,-16);
返回(样式为0x200000)!=0;
}

当垂直滚动条不可见时,@Farshad建议的事件
鼠标滚轮
也会触发。然后,我将以下代码添加到滚动
panel1
。请注意,
mouseweel
事件不会显示在visual studio designer中,必须手动添加到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;
}
private void richTextBox1_鼠标滚轮(对象发送器,MouseEventArgs e)
{
控制=发送方作为控制;
如果(!VerticalScrollBar可见(控件))
{
int numberOfTextLinesToMove=e.Delta*SystemInformation.mouseweelScrollLines;
int numberOfPixelsToMove=numberOfTextLinesToMove*Convert.ToInt32(control.Font.Size);
if(panel1.VerticalScroll.Value-像素数移动panel1.VerticalScroll.Maximum)
panel1.VerticalScroll.Value=panel1.VerticalScroll.Maximum;
其他的
panel1.VerticalScroll.Value-=要移动的像素数;
}
}
[System.Runtime.InteropServices.DllImport(“user32.dll”)]
私有外部静态int-GetWindowLong(IntPtr-hWnd,int-index);
公共静态bool垂直滚动条可见(控制ctl){
int style=GetWindowLong(ctl.Handle,-16);
返回(样式为0x200000)!=0;
}

谢谢,当滚动条不可见时,也会触发此鼠标滚轮事件。我建议编辑以添加将滚动值发送到面板的代码。谢谢,当滚动条不可见时,此鼠标滚轮事件也会触发。我建议编辑以添加将滚动值发送到面板的代码。