RichTextBox的光标不断变化来我梁

问题描述 投票:2回答:2

我有一个只读RichTextBox,其设置光标Arrow。即便如此,当我将鼠标悬停它,光标闪烁,并很快切换ArrowIBeam之间。我怎样才能使它留在Arrow,而不是忽悠?

c# winforms cursor richtextbox
2个回答
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;
}

2
投票

吉米的回答能很好地停止闪烁,但我没有关于鼠标移动鼠标捕获一个很好的感觉。例如,一个问题,我在这个解决方案看,是如果你设置上移动鼠标捕获,然后键盘快捷键像Alt + F4键或Alt +空格键将停止工作。

我更愿意处理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);
    }
}

它停止闪烁。没有一个完美的解决方案,但至少这些重要的快捷方式将继续工作。

© www.soinside.com 2019 - 2024. All rights reserved.