在鼠标hover文本时显示工具提示

当鼠标hover在我的自定义富编辑控件中的链接上时,我想显示工具提示。 请考虑以下文本:

我们都在晚上睡觉

就我而言, 睡眠这个词就是一个链接。

当用户在链接下移动鼠标时,在这种情况下“睡眠”,我想显示链接的工具提示。

以下是我的想法,但他们没有工作

1)捕获OnMouseHover

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

但这没有用。

UPDATE

提到的链接不是 URL,即这些是自定义链接,因此Regex在这里不会有太多帮助,它可以是任何文本。 用户可以选择创建链接。

虽然我没有尝试过GetPosition方法,但我认为它在设计和维护方面不会那么优雅。

让我说我在我的richedit框中有以下行

我们晚上睡觉 。 但蝙蝠保持清醒 。 蟑螂在夜间变得活跃

在上面的句子中,当鼠标hover在它们上面时,我想要三个不同的工具提示。

 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,ex,ey,1000); } } 

好吧,看看,这个工作,如果你有问题请告诉我:

 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 ia 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, pX + eX, pY + eY + 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", ""); } } } 

只需将工具箱中的工具提示工具添加到表单中,并将此代码添加到任何控件的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 } 

希望能帮助到你

和平

您不应该使用控件私有工具提示 ,而是表单一 。 这个例子效果很好:

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

这不是很优雅,但您可以使用RichTextBox.GetCharIndexFromPosition方法返回鼠标当前所在字符的索引,然后使用该索引来确定它是通过链接,热点还是任何其他特殊区域。 如果是,请显示您的工具提示(并且您可能希望将鼠标坐标传递到工具提示的Show方法,而不是仅仅传入文本框,以便工具提示可以放置在链接旁边)。

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

使用:

 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, pX + eX, pY + eY + 32, 1000); } } 

使用我的其他答案中的GetWord函数来获取hover的单词。 使用计时器逻辑禁用如上所述重新显示工具提示。 例。

在上面的示例中,工具提示通过检查鼠标指针来显示hover的单词。

如果这个答案仍然不是您想要的,请指定表征您要使用工具提示的单词的条件。 如果你想要粗体字,请告诉我。

我还想在这里添加一些内容,如果你在程序运行之前加载包含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); } 

所以我通过在Fram_main_load事件过程中放下以下代码来解决这个问题

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

由于这个问题(但它的年龄)中没有任何内容需要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; 

如果您使用的是RichTextBox控件。 您可以通过在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); } } 

为了便于使用和理解。

您只需将工具提示放在表单的任何位置(从工具箱中)即可。 然后,您将在表单中的其他所有属性中获得一个选项,以确定该工具提示中显示的内容(它的内容类似于“ToolTip on ToolTip1”)。 只要您将鼠标hover在某个对象上,该属性中的文本就会显示为工具提示。

包括原始问题所要求的自定义动态工具提示。 但是我把这个留给了其他不需要的人