简体   繁体   English

在鼠标悬停文本时显示工具提示

[英]Displaying tooltip on mouse hover of a text

I want to display a tooltip when the mouse hovers over a link in my custom rich edit control. 当鼠标悬停在我的自定义富编辑控件中的链接上时,我想显示工具提示。 Consider the following text: 请考虑以下文本:

We all sleep at night . 我们都晚上睡觉

In my case the word sleep is a link. 就我而言, 睡眠这个词就是一个链接。

When the user moves the mouse under the link, in this case "sleep", I want to display a tooltip for the link. 当用户在链接下移动鼠标时,在这种情况下“睡眠”,我想显示链接的工具提示。

The following came to my mind, but they are not working 以下是我的想法,但他们没有工作

1) Trapping OnMouseHover 1)捕获OnMouseHover

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

But this does not work out. 但这没有用。

UPDATE UPDATE

The links mentioned are not URLs, ie these are custom links, so Regex won't be of much help here, it can be any text. 提到的链接不是 URL,即这些是自定义链接,因此Regex在这里不会有太多帮助,它可以是任何文本。 The user can choose to create it aa link. 用户可以选择创建链接。

Though I have not tried GetPosition method, I dont think it would be that elegant in terms of design and maintenance. 虽然我没有尝试过GetPosition方法,但我认为在设计和维护方面它不会那么优雅。

Let me say I have the following line, in my richedit box 让我说我在我的richedit框中有以下行

We sleep at night. 我们晚上睡觉 But the bats stay awake . 但蝙蝠保持清醒 Cockroaches become active at night. 蟑螂在夜间变得活跃

In the above sentence, I want three different tooltips, when the mouse hovers over them. 在上面的句子中,当鼠标悬停在它们上面时,我想要三个不同的工具提示。

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

I trapped OnMouseMove as follows: 我将OnMouseMove困住如下:

Working- with Messagebox 使用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");
   }
}

Not Working - with Tooltip - Tooltip does not show up 不工作 - 使用工具提示 - 工具提示不会显示

OnMouseMove( MouseventArgs e )
{

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

Well, take a look, this works, If you have problems please tell me: 好吧,看看,这个有效,如果你有问题请告诉我:

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

Just add ToolTip tool from toolbox to the form and add this code in a mousemove event of any control you want to make the tooltip start on its 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
    }

hope it helps 希望能帮助到你

peace 和平

You shouldn't use the control private tooltip , but the form one . 您不应该使用控件私有工具提示 ,而是使用表单 This example works well: 这个例子效果很好:

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

}

This is not elegant, but you might be able to use the RichTextBox.GetCharIndexFromPosition method to return to you the index of the character that the mouse is currently over, and then use that index to figure out if it's over a link, hotspot, or any other special area. 这不是很优雅,但您可以使用RichTextBox.GetCharIndexFromPosition方法返回鼠标当前所在字符的索引,然后使用该索引来确定它是通过链接,热点还是任何其他特殊区域。 If it is, show your tooltip (and you'd probably want to pass the mouse coordinates into the tooltip's Show method, instead of just passing in the textbox, so that the tooltip can be positioned next to the link). 如果是,请显示您的工具提示(并且您可能希望将鼠标坐标传递到工具提示的Show方法,而不是仅仅传入文本框,以便工具提示可以放置在链接旁边)。

Example here: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getcharindexfromposition(VS.80).aspx 示例: http//msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getcharindexfromposition(VS.80).aspx

I would also like to add something here that if you load desired form that contain tooltip controll before the program's run then tool tip control on that form will not work as described below... 我还想在这里添加一些内容,如果你在程序运行之前加载包含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's tool tip control then it will not work
        Application.Run(objfrmmain);


    }

so I solved this problem by puting following code in Fram_main_load event procedure like this 所以我通过在Fram_main_load事件过程中放下以下代码来解决这个问题

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

As there is nothing in this question (but its age) that requires a solution in Windows.Forms , here is a way to do this in WPF in code-behind. 由于这个问题(但它的年龄)中没有任何内容需要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;

If you are using RichTextBox control. 如果您使用的是RichTextBox控件。 You can simply define the ToolTip object and show the tool-tip as the text is selected by moving the mouse inside the RichTextBox control. 您可以通过在RichTextBox控件中移动鼠标来简单地定义ToolTip对象并显示工具提示,因为选择了文本。

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

For the sake of ease of use and understandability. 为了便于使用和理解。

You can simply put a Tooltip anywhere on your form (from toolbox). 您只需将工具提示放在表单的任何位置(从工具箱中)即可。 You will then be given an options in the Properties of everything else in your form to determine what is displayed in that Tooltip (it reads something like "ToolTip on toolTip1"). 然后,您将在表单中的其他所有属性中获得一个选项,以确定该工具提示中显示的内容(它的内容类似于“ToolTip on ToolTip1”)。 Anytime you hover on an object, the text in that property will be displayed as a tooltip. 只要您将鼠标悬停在某个对象上,该属性中的文本就会显示为工具提示。

This does not cover custom on-the-fly tooltips like the original question is asking for. 包括原始问题所要求的自定义动态工具提示。 But I am leaving this here for others that do not need 但是我把这个留给了其他不需要的人

Use: 使用:

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

Use the GetWord function from my other answer to get the hovered word. 使用我的其他答案中的GetWord函数来获取悬停的单词。 Use timer logic to disable reshow the tooltip as in prev. 使用计时器逻辑禁用如上所述重新显示工具提示。 example. 例。

In this example right above, the tool tip shows the hovered word by checking the mouse pointer. 在上面的示例中,工具提示通过检查鼠标指针来显示悬停的单词。

If this answer is still not what you are looking fo, please specify the condition that characterizes the word you want to use tooltip on. 如果这个答案仍然不是你想要的,请指定表征你要使用工具提示的单词的条件。 If you want it for bolded word, please tell me. 如果你想要粗体字,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM