RichTextBox光标不断更改为IBeam

时间:2019-02-07 23:39:33

标签: c# winforms cursor richtextbox

我有一个只读的RichTextBox,其光标设置为Arrow。即使如此,当我将其悬停时,光标也会闪烁,并在ArrowIBeam之间非常快速地切换。如何使它停留在Arrow上而不闪烁?

2 个答案:

答案 0 :(得分:2)

我假设这是WinForms RichTextBox,因为WPF没有这个问题

RichTextBox处理WM_SETCURSOR消息,如果鼠标指针最终出现在链接上,则将光标更改为Cursors.Hand。开发人员的说明:

  

RichTextBox通过链接上的WM_SETCURSOR消息使我们能够   将光标更改为手。它通过同步来做到这一点   通知消息。所以我们必须将消息传递给DefWndProc   首先,然后,如果我们在此期间收到通知消息   (通过更改“ LinkCursor”表示,我们将其设置为手形。否则,   我们在控件上调用WM_SETCURSOR实现,将其设置为   用户对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;
}

答案 1 :(得分:2)

Jimi的答案可以很好地阻止闪烁,但是我对在鼠标移动时捕获鼠标没有很好的感觉。例如,我在该解决方案中看到的一个问题是,如果您将捕获设置为鼠标移动,然后设置键盘快捷键,例如 Alt + F4 Alt + Space 将停止工作。

我希望处理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);
    }
}

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

相关问题