使用shift +滚轮是相当普遍的水平滚动。
这两个都很容易捕获。我可以使用带有KeyDown, KeyUp事件设置的标志的MouseWheel事件来跟踪何时按下shift键。
然而,我该如何触发水平滚动呢?我知道WM_MOUSEHWHEEL,可以用来触发事件吗?
更新:对于一个System.Windows.Form
,有一个HorizontalScroll
性质,它的类型是HScrollProperties
。您可以操作该对象上的Value
属性来更改水平滚动条的位置。但是,到目前为止,我还没有发现任何其他控件上可以使用该对象。
如果您正在创建自己的控件,从UserControl
或ScrollControl
或Form
派生,您可以使用这个简单的解决方案:
protected override void OnMouseWheel(MouseEventArgs e)
{
if (this.VScroll && (Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
this.VScroll = false;
base.OnMouseWheel(e);
this.VScroll = true;
}
else
{
base.OnMouseWheel(e);
}
}
如果控件具有AutoScroll
并且正在显示滚动条,当您滚动鼠标滚轮时,您将获得以下行为:
- 如果不启用滚动条,则不执行任何操作。
- 如果只启用垂直滚动条,则滚动垂直滚动条。
- 如果只启用水平滚动条,则滚动水平滚动条。
- 如果同时启用垂直和水平滚动条,则滚动垂直滚动条。
注意到这种行为,我想出了这个hack重写控件的OnMouseWheel
,然后如果垂直滚动条被启用并且Shift被按住,它在调用base.OnMouseWheel
之前禁用垂直滚动条。这会欺骗控件滚动水平滚动条(如上所示的行为3)。
在您的设计器文件中,您需要手动添加MouseWheel事件委托。
this.richTextBox.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.RichTextBox_MouseWheel);
然后,在后面的代码中,您可以添加以下代码:
private const int WM_SCROLL = 276; // Horizontal scroll
private const int SB_LINELEFT = 0; // Scrolls one cell left
private const int SB_LINERIGHT = 1; // Scrolls one line right
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private void RichTextBox_MouseWheel(object sender, MouseEventArgs e)
{
if (ModifierKeys == Keys.Shift)
{
var direction = e.Delta > 0 ? SB_LINELEFT : SB_LINERIGHT;
SendMessage(this.richTextBox.Handle, WM_SCROLL, (IntPtr)direction, IntPtr.Zero);
}
}
有关const值的更多信息,请参阅以下SO:如何以编程方式滚动winforms datagridview控件?
更新尽可能使用Alvin溶液。要好得多
与xixonia在VB中提供的代码相同。净
Private Const WM_SCROLL As Integer = 276
Private Const SB_LINELEFT As Integer = 0
Private Const SB_LINERIGHT As Integer = 1
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(hWnd As IntPtr,
wMsg As UInteger,
wParam As IntPtr,
lParam As IntPtr) As Integer
End Function
Private Sub RichTextBox_MouseWheel(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseWheel
If ModifierKeys = Keys.Shift Then
Dim direction = If(e.Delta > 0, SB_LINELEFT, SB_LINERIGHT)
SendMessage(Me.RichTextBox1.Handle, WM_SCROLL, CType(direction, IntPtr), IntPtr.Zero)
End If
End Sub