如何将鼠标悬停在富文本框中的文本上时创建新事件

本文关键字:文本 创建 新事件 事件 鼠标 悬停 | 更新日期: 2023-09-27 18:32:26

我有一个包含字符串的RichTextBox,例如:"Hello",我想在将鼠标悬停在单词"Hello"上时创建一个新事件,或者为了简化,将鼠标悬停在单词"Hello"上时显示一个消息框。那么如何实现这一目标呢?

如何将鼠标悬停在富文本框中的文本上时创建新事件

首先,让我们定义一个获取最接近光标的单词的方法:

public static class Helper
{
    public static string GetWordUnderCursor(RichTextBox control, MouseEventArgs e)
    {
        //check if there's any text entered
        if (string.IsNullOrWhiteSpace(control.Text))
            return null;
        //get index of nearest character
        var index = control.GetCharIndexFromPosition(e.Location);
        //check if mouse is above a word (non-whitespace character)
        if (char.IsWhiteSpace(control.Text[index]))
            return null;
        //find the start index of the word
        var start = index;
        while (start > 0 && !char.IsWhiteSpace(control.Text[start - 1]))
            start--;
        //find the end index of the word
        var end = index;
        while (end < control.Text.Length - 1 && !char.IsWhiteSpace(control.Text[end + 1]))
            end++;
        //get and return the whole word
        return control.Text.Substring(start, end - start + 1);
    }
}

为了仅在光标高于RichTextBox并且最近的单词"Hello"时引发MouseMove事件,您需要定义自己的从RichTextBox派生的控件并重写OnMouseMove方法,并在窗体中使用它,而不是RichTextBox

public class MyRichTextBox : RichTextBox
{
    protected override void OnMouseMove(MouseEventArgs e)
    {
        //get the word under the cursor
        var word = Helper.GetWordUnderCursor(this, e);
        if (string.Equals(word, "Hello"))
        {
            //let RichTextBox raise the event
            base.OnMouseMove(e);
        }
    }
}

但是,在我看来,最好让RichTextBox正常提出MouseMove事件,只有在满足条件时才采取行动。为此,您只需要注册MouseMove处理程序并检查条件:

private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
    var control = sender as RichTextBox;
    //get the word under the cursor
    var word = Helper.GetWordUnderCursor(control, e);
    if (string.Equals(word, "Hello"))
    {
        //do your stuff
    }
}

我认为您可以使用 Cursor 类来实现这一点。有些人试图实现类似的事情。看看这里。

确保将

事件"richTextBox1_MouseHover"连接到富文本框的悬停上。

private void richTextBox1_MouseHover(object sender, EventArgs e)
{
    MessageBox.Show("Hello");
}