【问题标题】:RichTextBox & Disabling Mouse ScrollingRichTextBox 和禁用鼠标滚动
【发布时间】:2010-08-29 00:50:09
【问题描述】:

我想使用鼠标中键清除 RichTextBox,但它也会激活鼠标滚动功能,类似于您在网络浏览器中找到的功能。当垂直滚动条可见(有足够的数据)并且您按鼠标中键时,会出现滚动光标,您可以通过向上或向下移动光标来向上或向下滚动。如何禁用鼠标滚动?

鼠标滚动似乎是 Windows(或鼠标驱动程序)的一项功能,那么如何阻止 MouseDown 事件(如果按下鼠标中键)到达负责鼠标滚动的任何例程?

【问题讨论】:

    标签: c# scroll mouse richtextbox


    【解决方案1】:

    检查 0x207 和 0x208,中间按钮向下和向上:

    using System;
    using System.Windows.Forms;
    
    class MyRtb : RichTextBox {
        protected override void WndProc(ref Message m) {
            if (m.Msg == 0x207) this.Clear();
            else if (m.Msg != 0x208) base.WndProc(ref m);
        }
    }
    

    【讨论】:

    • 代码需要稍作修正。正如您所说,消息是 0x207 和 0x208,但代码使用 0x208 和 0x209。
    • 在调试应用程序时,我看到此方法的迭代次数过多。它看起来不是一个有效的解决方案,尤其是当 RichTextBox 用于显示来自串口的数据时,它似乎处理了所有与 RichTextBox 相关的消息。
    • 天啊。所花费的 3 纳秒会显着拖累事情吗?
    • 在 C# 中是否可以在某个方法对 MouseDown/Up 事件进行操作后停止它,因为这就是问题所在,事件被执行,但其他例程也被激活。建议让事件顺其自然,但这只是一个 RichTextBox,必须有一种方法可以永久处理它,例如按键的 e.hanlded。
    • 这就是代码的作用,它确保本机 Windows 控件无法看到该消息。我完全不清楚你为什么认为这有问题。
    【解决方案2】:

    无需滚动 RichTextBox,只需从 RichTextBox 继承即可。

    public class NoScrollRichTextBox : RichTextBox
    {
       const int WM_MOUSEWHEEL = 0x020A;
    
       protected override void WndProc(ref Message m)
       {
          // This will completely ignore the mouse wheel, which will disable zooming as well
          if (m.Msg != WM_MOUSEWHEEL)
             base.WndProc(ref m);
       }
    }
    

    【讨论】:

    • 我明白了,但我不想禁用“鼠标滚轮滚动”,我想禁用“鼠标移动滚动”。您是否了解如何在单击鼠标滚轮后通过移动鼠标在网页中向各个方向滚动?我也不想禁用鼠标滚轮点击,因为我想用它来清除richtextbox的内容而不激活“鼠标移动滚动”光标。
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2011-09-18
    • 2012-02-08
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多