Shift +鼠标滚轮水平滚动
shift +滚轮的使用对于水平滚动来说是相当常见的。
这两个都很容易捕获。 我可以使用带有KeyDown,KeyUp事件设置的标志的MouseWheel事件来跟踪按下shift键的时间。
但是,我如何实际触发水平滚动? 我知道WM_MOUSEHWHEEL,可以用来触发事件吗?
更新:对于System.Windows.Form
有一个类型为HScrollProperties
的HorizontalScroll
属性。 您可以操纵该对象上的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控件?
UPDATE
尽可能使用Alvin的解决方案 。 这样更好 。
与xixonia在VB.NET中提供的代码相同
上述就是C#学习教程:Shift +鼠标滚轮水平滚动分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Private Const WM_SCROLL As Integer = 276 Private Const SB_LINELEFT As Integer = 0 Private Const SB_LINERIGHT As Integer = 1 _ Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer End Function Private Sub RichTextBox_MouseWheel(ByVal sender As Object, ByVal 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
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/983712.html