4

我想控制RichTextBox滚动,但在控件中找不到任何方法来执行此操作。

这样做的原因是,当鼠标光标位于RichTextBox控件上时,我希望鼠标滚轮滚动有效(它没有活动焦点:鼠标滚轮事件由表单处理)。

任何帮助表示赞赏!

4

1 回答 1

2

这有点简单win32。给你:

//must add using System.Reflection
public partial class Form1 : Form, IMessageFilter 
{
    bool hovered;
    MethodInfo wndProc;

    public Form1() 
    {
       InitializeComponent();
       Application.AddMessageFilter(this);
       richTextBox1.MouseEnter += (s, e) => { hovered = true; };
       richTextBox1.MouseLeave += (s, e) => { hovered = false; };
       wndProc = typeof(Control).GetMethod("WndProc", BindingFlags.NonPublic | 
                                                      BindingFlags.Instance);
    }

    public bool PreFilterMessage(ref Message m) 
    {
        if (m.Msg == 0x20a && hovered) //WM_MOUSEWHEEL = 0x20a
        {
           Message msg = Message.Create(richTextBox1.Handle, m.Msg, m.WParam, m.LParam);
           wndProc.Invoke(richTextBox1, new object[] { msg });
        }
        return false;
    }
}

注意:我使用IMessageFilteranWM_MOUSEWHEELapplication-level. 我也使用Reflection调用受保护的方法WndProc来处理消息WM_MOUSEWHEEL,你总是可以使用SendMessagewin32 函数来发送WM_MOUSEWHEELrichTextBox1,但它需要在declaration这里导入。由你决定。

于 2013-10-17T09:49:27.163 回答