如何阻止RichTextBox控件中鼠标滚轮滚动延迟的问题
解决RichTextBox滚轮停止后仍持续滚动的问题
当将RichTextBox用作类控制台的只读输出框(黑色背景、窗体宽度)时,会遇到一个问题:使用鼠标滚轮滚动后,即便停止转动滚轮,控件仍会持续滚动一小段时间,且该控件没有直接调整此行为的属性。
解决方案
重写控件的WndProc()方法,拦截并自定义处理WM_MOUSEWHEEL事件即可解决,注意需要通过位运算测试IntPtr的符号来判断滚动方向。
以下是具体的实现代码:
public class CustomRichTextBox : RichTextBox { private const int WM_MOUSEWHEEL = 0x020A; protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSEWHEEL) { // 通过位运算提取滚轮滚动增量 int delta = (int)m.WParam >> 16; // 自定义滚动步长,正数对应向上滚,负数对应向下滚 int scrollStep = delta > 0 ? -10 : 10; // 直接调整选中位置并滚动到该位置,替代默认惯性滚动 this.SelectionStart = Math.Clamp(this.SelectionStart + scrollStep, 0, this.TextLength); this.ScrollToCaret(); return; // 阻止默认消息处理,取消惯性滚动 } base.WndProc(ref m); } }
这段代码通过拦截鼠标滚轮消息,手动控制滚动位置,绕过了系统默认的惯性滚动逻辑,从而实现滚轮停止转动后,控件滚动立即停止的效果。
内容的提问来源于stack exchange,提问作者Andrea Bardelli
相关产品推荐
相关产品推荐

