WM_MOUSEWHEEL消息不会传播到父级

时间:2012-09-21 13:25:44

标签: c# winforms

我有一个RichTextBox,ScrollBars设置为None。根据{{​​3}}

  

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

我将此解释为,我不需要挂钩消息泵(MSDN)并手动将WM_MOUSEWHEEL事件转发到包含richtextbox的父窗体。当我在RichTextBox内并执行鼠标滚动时,窗体不会滚动。为什么不?如何让表单滚动?

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

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

2 个答案:

答案 0 :(得分:3)

对于我的派生TextBox,而不是像上面那样忽略鼠标滚轮,我反而希望将它传递给我的父控件......在我看来,这就是TextBox在任何情况下应该做的事情。这是我在派生的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;
}

答案 1 :(得分:0)

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

因此,您需要实现IMessageFilter或创建RichTextEdit的子类,将WM_MOUSEWHEEL转发为shown here

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);
   }
}