向表单发送滚动事件
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
此外,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;
}
}
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;
}
在我的 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
此外,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;
}
}
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;
}