2012-09-21 33 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; 
}