2012-09-21 32 views
0

我有一个RichTextBox滚动条设置为无。根据MSDNWM_MOUSEWHEEL消息不传播给父母

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

我此解释为,我不应该需要挂接到消息泵(IMessageFilter)和手动向前WM_MOUSEWHEEL事件包含在RichTextBox的母体形式。当我在RichTextBox中并执行鼠标滚动时,表单不会滚动。为什么不?我怎样才能让窗体滚动?

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

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

回答

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

使用此代码,一旦我点击里面的RTF我失去了所有的能力滚动。即使我在框外点击,我也无法再滚动。我认为这消耗了我所有的消息。我试着检查== WM_MOUSEWHEEL而不是运行时错误。 –

+0

除非有什么更好的工作,我坚持使用IMessageFilter。 –

3

对于我得到的文本框,而不是忽略鼠标滚轮的上方呢,我而是想把它传递给我的父控件......这是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; 
}