我有一个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;
}
}
答案 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);
}
}