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