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

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

Мы все спим по ночам.

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

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

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

1) Захват OnMouseHover

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

Но из этого не выходит.

ОБНОВЛЕНИЕ

Упомянутые ссылки являются не 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);
   }
}

person Sujay Ghosh    schedule 16.05.2009    source источник
comment
Это помогло .. tooltip.Active = true   -  person Sujay Ghosh    schedule 17.05.2009
comment
О, я не понимал, что ваша проблема была в самой подсказке ... В любом случае, используйте System.Windows.Forms.Cursor.Current, чтобы статически получить текущий курсор мыши, как в моем последнем ответе.   -  person Shimmy Weitzhandler    schedule 18.05.2009


Ответы (9)


Просто добавьте инструмент ToolTip из панели инструментов в форму и добавьте этот код в событие 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
    }

Надеюсь, поможет

мир

person Mawardy    schedule 11.03.2015
comment
достаточно установить набор toolTip1.SetToolTip (textBox3, Tooltip text); только один раз, а не каждый раз, когда возникает событие mousemove. - person anion; 22.10.2017

Что ж, посмотрите, это работает, если у вас возникнут проблемы, скажите мне:

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's 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", "");
        }
    }
}
person Shimmy Weitzhandler    schedule 17.05.2009

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

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
    {
    }

}
person serhio    schedule 30.11.2009

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

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

person jean    schedule 16.05.2009
comment
Я сделал следующее; только для тестирования в событии MouseMove окна richedit. if (Cursor.Current == Cursors.Hand) Messagebox.Show (Моя всплывающая подсказка); Но моя всплывающая подсказка не отображается, как только я заменяю Messagebox на tooltip.show (), как показано ниже if (Cursor.Current == Cursors.Hand) this.ttpLink.Show (Hover, txtBox, e.X, e.Y, 1000); Я что-то упускаю ? - person Sujay Ghosh; 17.05.2009
comment
Джин, даже я получаю текст, откуда мне знать ссылку atring ia, - person Sujay Ghosh; 30.05.2009

Использовать:

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 из моего другого ответа, чтобы получить зависшее слово. Используйте логику таймера, чтобы отключить повторное отображение всплывающей подсказки, как в пред. пример.

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

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

person Shimmy Weitzhandler    schedule 18.05.2009

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

    [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's 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();
    }
person Shujaat Abdi    schedule 09.05.2013

Если вы используете элемент управления 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);
        }
    }
person S G    schedule 20.11.2017

Ради простоты использования и понятности.

Вы можете просто разместить всплывающую подсказку в любом месте формы (из панели инструментов). Затем вам будут предоставлены параметры в свойствах всего остального в вашей форме, чтобы определить, что отображается в этой всплывающей подсказке (она читается примерно как «Всплывающая подсказка на toolTip1»). Каждый раз, когда вы наводите курсор на объект, текст в этом свойстве будет отображаться как всплывающая подсказка.

Этот не касается настраиваемых всплывающих подсказок, которые запрашиваются в исходном вопросе. Но я оставляю это здесь для других, которым не нужно

person RugerSR9    schedule 05.03.2018

Поскольку в этом вопросе (кроме его возраста) нет ничего, что требует решения в 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;
person Jesse Chisholm    schedule 08.04.2015