【问题标题】:RichTextBox cursor keeps changing to IBeamRichTextBox 光标不断变为 I Beam
【发布时间】:2022-01-19 00:55:17
【问题描述】:

我有一个只读的RichTextBox,其光标设置为Arrow。尽管如此,当我将它悬停时,光标会闪烁,并在ArrowIBeam 之间快速切换。我怎样才能让它留在Arrow而不闪烁?

【问题讨论】:

    标签: c# winforms richtextbox mouse-cursor


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!它工作,直到用户点击它,然后它又开始闪烁。
    • 我注意到了一些事情。当我将鼠标悬停在RichTextBox 的边缘时,IBeam 有时会再次出现几分之一秒。也许对某些人来说可以忽略不计,但它让我发疯。 :D 我试图捕捉我的屏幕来显示它,但它太快了,即使是 60fps 我也无法捕捉到它......
    • 答案中解释了需要释放 Capture 的原因。另请参阅 Reza Aghaei 所写的内容。当鼠标指针离开控件区域时需要释放捕获,否则会产生一些错误行为。这也解释了。如果您决定使用自定义控件,另请参阅:How to justify text in a label。除此之外,还有一个支持块对齐(也称为完全对齐)的自定义 RichTextBox。也许你有一些用处。
    • @Jimi 我对捕获的评论是,当鼠标在控件之外时释放捕获,但是当鼠标在richtextbox上时,Alt+F4不起作用,因为richtextbox有捕获.这与鼠标离开时释放捕获无关。
    • @Reza Aghaei 是的,我知道你的意思。我的评论是关于强制释放捕获的需要,因为 OP 显然决定在事件处理程序中仅使用 richTextBox1.Capture = true;
    【解决方案2】:

    Jimi 的回答可以很好地停止闪烁,但我对在鼠标移动时捕获鼠标感觉不太好。例如,我在该解决方案中看到的一个问题是,如果您在鼠标移动时设置捕获,那么像 Alt+F4Alt这样的键盘快捷键>+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);
        }
    }
    

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

    【讨论】:

    • 为什么不完美?
    • 例如,当您将鼠标悬停在链接上时,它不会显示手形。
    • 嗯,根据我在 StackOverflow 的经验,您是该站点上最好的 WinForms 专家之一(这可能意味着您是世界上最好的专家之一)。所以我相信你有能力帮助 WinForms 社区解决这个非常重要的问题。 :D
    • 是的,这就是我不更改已接受答案的原因。 Jimi 的回答对我来说很好。
    • 根本不需要更改,除非共享一个完美的答案。我也无意影响另一个答案,另一个答案也有我的投票权。刚刚分享了另一种选择。特别是如果有人想让 Alt+F4 即使鼠标悬停在 Richtextbox 上也能正常工作。
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多