1

我有一个 ScrollBars 设置为 None 的 RichTextBox。根据MSDN

DefWindowProc 函数将消息传播到窗口的父级。不应该有消息的内部转发,因为 DefWindowProc 将它向上传播到父链,直到它找到一个处理它的窗口。

我将其解释为,我不需要连接到消息泵 ( IMessageFilter ) 并手动将 WM_MOUSEWHEEL 事件转发到包含富文本框的父窗体。当我在 RichTextBox 内并执行鼠标滚动时,表单不会滚动。为什么不?如何让表单滚动?

请记住,RichTextBox 的滚动条设置为 none,并为 Form 启用。那么为什么表单没有得到滚动事件呢?

public partial class Form4 : Form
{
    public Form4()
    {
        InitializeComponent();
        this.AutoScroll = true;
        richTextBox1.ScrollBars = RichTextBoxScrollBars.None;
    }
}
4

2 回答 2

4

对于我的派生文本框,我不想像上面那样忽略鼠标滚轮,而是想将它传递给我的父控件……在我看来,这是文本框在任何情况下都应该做的。这是我在派生的 TextBox 的 WndProc 中放入的内容:

switch (m.Msg)
{
    case 0x020A: // WM_MOUSEWHEEL
    case 0x020E: // WM_MOUSEHWHEEL
        if (this.ScrollBars == ScrollBars.None && this.Parent != null)
            m.HWnd = this.Parent.Handle; // forward this to your parent
        base.WndProc(ref m);
        break;

    default:
        base.WndProc(ref m);
        break;
}
于 2012-11-08T16:35:38.727 回答
1

表单不会滚动,因为 RichTextBox 自己处理 WM_MOUSEWHEEL 并且不会调用DefWindowProc将其转发给其父级。显然,禁用滚动条时这不会改变。

因此,您需要实现IMessageFilter或创建 RichTextEdit 的子类,它将转发 WM_MOUSEWHEEL,如下所示

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);
   }
}
于 2012-09-21T14:33:57.043 回答