Отображение всплывающей подсказки при наведении мыши на текст - PullRequest
19 голосов
/ 17 мая 2009

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

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

В моем случае слово sleep является ссылкой.

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

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

1) Trapping 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 следующим образом:

Работа с окном сообщений

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);
   }
}

Ответы [ 9 ]

12 голосов
/ 17 мая 2009

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

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", "");
        }
    }
}
10 голосов
/ 11 марта 2015

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

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
    }

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

мир

5 голосов
/ 30 ноября 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
    {
    }

}
2 голосов
/ 17 мая 2009

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

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

0 голосов
/ 05 марта 2018

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

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

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

0 голосов
/ 20 ноября 2017

Если вы используете элемент управления 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);
        }
    }
0 голосов
/ 09 апреля 2015

Поскольку в этом вопросе (кроме его возраста) нет ничего, что требовало бы решения в 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;
0 голосов
/ 09 мая 2013

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

    [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();
    }
0 голосов
/ 18 мая 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 из моего другого ответа, чтобы получить слово для поиска. Используйте таймерную логику, чтобы отключить повторное отображение всплывающей подсказки, как в предыдущем. Пример.

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

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

...