Отображение подсказки при наведении курсора мыши на текст

Я хочу отобразить всплывающую подсказку, когда мышь наводится на ссылку в моем настраиваемом редакторе редактирования. Рассмотрим следующий текст:

Мы все спать ночью.

В моем случае слово sleep - это ссылка.

Когда пользователь перемещает мышь по ссылке, в этом случае "sleep", я хочу отобразить всплывающую подсказку для ссылки.

Мне пришло в голову следующее: они не работают

1) Ловушка OnMouseHover

if(this.Cursor == Cursors.Hand)
   tooltip.Show(textbox,"My tooltip");
else
   tooltip.Hide(textbox);

Но это не сработает.

UPDATE

Указанные ссылки - это не URL-адреса, т.е. это настраиваемые ссылки, поэтому Regex здесь не будет очень полезной, это может быть любой текст. Пользователь может создать для него ссылку.

Хотя я не пробовал метод GetPosition, я не думаю, что это было бы элегантно с точки зрения дизайна и обслуживания.

Позвольте мне сказать, что у меня есть следующая строка, в моей ячейке richedit

Мы спать ночью. Но летучие мыши остаются бодрствующими. Тараканы становятся активными ночью.

В приведенном выше предложении я хочу три разных подсказки, когда мышь на них наводится.

sleep -> Human beings
awake -> Nightwatchman here
active -> My day begins

Я попал в ловушку OnMouseMove следующим образом:

Работа с Messagebox

OnMouseMove( )
{

   // check to see if the cursor is over a link
   // though this is not the correct approach, I am worried why does not a tooltip show up
   if(this.Cursor.current == Cursors.hand )
   {
     Messagebox.show("you are under a link");
   }
}

Не работает - с помощью всплывающей подсказки - всплывающая подсказка не отображается

OnMouseMove( MouseventArgs e )
{

   if(cursor.current == cursors.hand )
   {
     tooltip.show(richeditbox,e.x,e.y,1000);
   }
}

Ответ 1

Хорошо, посмотрите, это работает, Если у вас есть проблемы, пожалуйста, скажите мне:

using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1() { InitializeComponent(); }

        ToolTip tip = new ToolTip();
        void richTextBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (!timer1.Enabled)
            {
                string link = GetWord(richTextBox1.Text, richTextBox1.GetCharIndexFromPosition(e.Location));
                //Checks whether the current word i a URL, change the regex to whatever you want, I found it on www.regexlib.com.
//you could also check if current word is bold, underlined etc. but I didn't dig into it.
                if (System.Text.RegularExpressions.Regex.IsMatch(link, @"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$"))
                {
                    tip.ToolTipTitle = link;
                    Point p = richTextBox1.Location;
                    tip.Show(link, this, p.X + e.X,
                        p.Y + e.Y + 32, //You can change it (the 35) to the tooltip height - controls the tooltips position.
                        1000);
                    timer1.Enabled = true;
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e) //The timer is to control the tooltip, it shouldn't redraw on each mouse move.
        {
            timer1.Enabled = false;
        }

        public static string GetWord(string input, int position) //Extracts the whole word the mouse is currently focused on.
        {
            char s = input[position];
            int sp1 = 0, sp2 = input.Length;
            for (int i = position; i > 0; i--)
            {
                char ch = input[i];
                if (ch == ' ' || ch == '\n')
                {
                    sp1 = i;
                    break;
                }
            }

            for (int i = position; i < input.Length; i++)
            {
                char ch = input[i];
                if (ch == ' ' || ch == '\n')
                {
                    sp2 = i;
                    break;
                }
            }

            return input.Substring(sp1, sp2 - sp1).Replace("\n", "");
        }
    }
}

Ответ 2

Просто добавьте инструмент ToolTip из панели инструментов в форму и добавьте этот код в событие mousemove любого элемента управления, с которого вы хотите заставить всплывающую подсказку начать свою mousemove

private void textBox3_MouseMove(object sender, MouseEventArgs e)
    {
      toolTip1.SetToolTip(textBox3,"Tooltip text"); // you can change the first parameter (textbox3) on any control you wanna focus
    }

надеюсь, что это поможет

мир

Ответ 3

Вы не должны использовать личную подсказку control, но форму. Этот пример хорошо работает:

public partial class Form1 : Form
{
    private System.Windows.Forms.ToolTip toolTip1;

    public Form1()
    {
        InitializeComponent();
        this.components = new System.ComponentModel.Container();
        this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);

        MyRitchTextBox myRTB = new MyRitchTextBox();
        this.Controls.Add(myRTB);

        myRTB.Location = new Point(10, 10);
        myRTB.MouseEnter += new EventHandler(myRTB_MouseEnter);
        myRTB.MouseLeave += new EventHandler(myRTB_MouseLeave);
    }


    void myRTB_MouseEnter(object sender, EventArgs e)
    {
        MyRitchTextBox rtb = (sender as MyRitchTextBox);
        if (rtb != null)
        {
            this.toolTip1.Show("Hello!!!", rtb);
        }
    }

    void myRTB_MouseLeave(object sender, EventArgs e)
    {
        MyRitchTextBox rtb = (sender as MyRitchTextBox);
        if (rtb != null)
        {
            this.toolTip1.Hide(rtb);
        }
    }


    public class MyRitchTextBox : RichTextBox
    {
    }

}

Ответ 4

Это не изящно, но вы можете использовать метод RichTextBox.GetCharIndexFromPosition, чтобы вернуть вам индекс символа, который в данный момент находится в курсе мыши, а затем использовать этот индекс, чтобы выяснить, находится ли он по ссылке, горячую точку или любую другую специальную область. Если это так, покажите свою подсказку (и вы, вероятно, захотите передать координаты мыши в подсказку Show method вместо простого прохождения в текстовое поле, чтобы всплывающая подсказка располагалась рядом со ссылкой).

Пример здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getcharindexfromposition(VS.80).aspx

Ответ 5

Использование:

ToolTip tip = new ToolTip();
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
    Cursor a = System.Windows.Forms.Cursor.Current;
    if (a == Cursors.Hand)
    {
        Point p = richTextBox1.Location;
        tip.Show(
            GetWord(richTextBox1.Text,
                richTextBox1.GetCharIndexFromPosition(e.Location)),
            this,
            p.X + e.X,
            p.Y + e.Y + 32,
            1000);
    }
}

Используйте функцию GetWord из моего другого ответа, чтобы получить зависающее слово. Используйте таймерную логику для отключения всплывающей подсказки, как в предыдущем. Пример.

В этом примере, приведенном выше, подсказка инструмента показывает зависающее слово, указав указатель мыши.

Если этот ответ по-прежнему не является тем, что вы ищете, укажите условие, которое характеризует слово, в которое вы хотите использовать всплывающую подсказку. Если вы хотите его для жирного слова, пожалуйста, скажите мне.

Ответ 6

Я также хотел бы добавить что-то здесь, что если вы загрузите желаемую форму, содержащую tooltip controll, перед запуском программы, то управление подсказкой в ​​этой форме не будет работать, как описано ниже...

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        objfrmmain = new Frm_Main();
        Showtop();//this is procedure in program.cs to load an other form, so if that contain tool tip control then it will not work
        Application.Run(objfrmmain);


    }

поэтому я решил эту проблему, поставив следующий код в процедуре события Fram_main_load, подобный этому

    private void Frm_Main_Load(object sender, EventArgs e)
    {
        Program.Showtop();
    }

Ответ 7

Поскольку в этом вопросе (но его возрасте) нет ничего, что требует решения в Windows.Forms, вот способ сделать это в WPF в коде.

TextBlock tb = new TextBlock();
tb.Inlines.Add(new Run("Background indicates packet repeat status:"));
tb.Inlines.Add(new LineBreak());
tb.Inlines.Add(new LineBreak());
Run r = new Run("White");
r.Background = Brushes.White;
r.ToolTip = "This word has a White background";
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Identical Packet received at this time."));
tb.Inlines.Add(new LineBreak());
r = new Run("SkyBlue");
r.ToolTip = "This word has a SkyBlue background";
r.Background = new SolidColorBrush(Colors.SkyBlue);
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Original Packet received at this time."));

myControl.Content = tb;

Ответ 8

Если вы используете элемент управления RichTextBox. Вы можете просто определить объект ToolTip и показать подсказку, поскольку текст выбран, перемещая мышь внутри элемента управления RichTextBox.

    ToolTip m_ttInput = new ToolTip(); // define as member variable

    private void rtbInput_SelectionChanged(object sender, EventArgs e)
    {
        if (rtbInput.SelectedText.Length > 0) 
        {
            m_ttInput.Show(rtbInput.SelectedText.Length.ToString(), rtbInput, 1000);
        }
    }