代码之家  ›  专栏  ›  技术社区  ›  Michael Haddad

RichTextBox光标不断更改为ibeam

  •  2
  • Michael Haddad  · 技术社区  · 6 年前

    我有一个只读的 RichTextBox ,其光标设置为 Arrow . 即使如此,当我悬停它时,光标闪烁,并在 箭头 IBeam . 我怎么能让它一直开着呢 箭头 而不是闪烁?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Jimi    6 年前

    我假设这是winforms richtextbox,因为wpf-one没有这个 问题 .

    RichTextBox处理 WM_SETCURSOR 消息,将光标更改为 Cursors.Hand 如果鼠标指针指向一个链接。发展商的一条注释:

    RichTextBox使用 WME设置游标 通过链接发送消息以允许我们 将光标改为手形。它通过同步 通知消息。所以我们必须把消息传递给已解散的朝鲜民主主义人民共和国 首先,然后,如果我们同时收到通知消息 (通过更改“链接光标”指示,我们将其设置为一只手。否则, 我们称之为 WME设置游标 对控件的实现,将其设置为 用户对richtextbox光标的选择。

    您可以在鼠标进入控件边界时设置捕获,然后在鼠标指针离开该区域时释放捕获。捕获需要释放,否则,当您第一次单击另一个控件时,光标将设置为richtextbox:

    private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!richTextBox1.ClientRectangle.Contains(e.Location))
        {
            richTextBox1.Capture = false;
        }
        else if (!richTextBox1.Capture)
            richTextBox1.Capture = true;
    }
    
        2
  •  2
  •   Reza Aghaei    6 年前

    吉米的回答可以很好地阻止闪烁,但我对鼠标移动时捕捉鼠标没有好的感觉。例如,我在该解决方案中看到的一个问题是,如果您在鼠标移动时设置捕获,那么键盘快捷键如下 中高音 + F4 中高音 + 空间 将停止工作。

    我想处理一下 WndProc 并在收到时设置光标 WM_SETCURSOR :

    using System.Windows.Forms;
    public class ExRichTextBox : RichTextBox
    {
        const int WM_SETCURSOR = 0x0020;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SETCURSOR)
                Cursor.Current = this.Cursor;
            else
                base.WndProc(ref m);
        }
    }
    

    它停止闪烁。不是一个完美的解决方案,但至少那些重要的捷径将继续工作。