【问题标题】:Scroll a RichTextBox滚动 RichTextBox
【发布时间】:2013-10-25 16:54:21
【问题描述】:

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

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

感谢任何帮助!

【问题讨论】:

  • 旁注:在系统范围内执行此操作的 Windows 应用程序是“KatMouse”。很遗憾,我不知道如何在您的程序中自己完成。
  • 您可以将鼠标悬停在 RichTextBox 上时将其设置为选定控件。
  • 重复的问题指向一个链接。我更喜欢 King King 立即给出解决方案的答案。

标签: c# winforms scroll richtextbox


【解决方案1】:

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

注意:我使用IMessageFilterapplication-level 处捕获WM_MOUSEWHEEL 消息。我也使用Reflection 调用受保护的方法WndProc 来处理消息WM_MOUSEWHEEL,您始终可以使用SendMessage win32 函数将WM_MOUSEWHEEL 发送到richTextBox1,但它需要@987654332 @在这里导入。这取决于你。

【讨论】:

  • 谢谢,效果很好!我只是使用richTextBox1.Contains 方法来检查光标是否悬停。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2018-02-02
  • 1970-01-01
  • 2011-12-02
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多