Mostrar información sobre herramientas al pasar el mouse sobre un texto

Quiero mostrar una información sobre herramientas cuando el mouse se desplaza sobre un enlace en mi control de edición rico personalizado. Considera el siguiente texto:

Todos dormimos por la noche.

En mi caso, la palabra dormir es un enlace.

Cuando el usuario mueve el mouse debajo del enlace, en este caso “suspensión”, quiero mostrar una información sobre herramientas para el enlace.

Me vino a la mente lo siguiente, pero no están funcionando

1) Atrapando OnMouseHover

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

Pero esto no funciona.

ACTUALIZAR

Los enlaces mencionados no son URL, es decir, son enlaces personalizados, por lo que Regex no será de mucha ayuda aquí, puede ser cualquier texto. El usuario puede elegir crearlo como un enlace.

Aunque no he probado el método GetPosition , no creo que sea tan elegante en términos de diseño y mantenimiento.

Déjame decir que tengo la siguiente línea, en mi caja de richedit

Dormimos por la noche Pero los murciélagos permanecen despiertos . Las cucarachas se activan por la noche.

En la oración anterior, quiero tres información sobre herramientas diferentes, cuando el mouse se cierne sobre ellas.

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

OnMouseMove siguiente manera:

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

No funciona: con la información sobre herramientas: la información sobre herramientas no aparece

 OnMouseMove( MouseventArgs e ) { if(cursor.current == cursors.hand ) { tooltip.show(richeditbox,ex,ey,1000); } } 

Bueno, mira, esto funciona. Si tienes problemas, por favor dime:

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

Simplemente agregue la herramienta ToolTip de la caja de herramientas al formulario y agregue este código en un evento mousemove de cualquier control que desee para que la información sobre herramientas comience en su 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 } 

Espero eso ayude

paz

No debe usar el control privado de información sobre herramientas , sino el formulario uno . Este ejemplo funciona bien:

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

Esto no es elegante, pero es posible que pueda utilizar el método RichTextBox.GetCharIndexFromPosition para devolverle el índice del personaje sobre el que está actualmente el mouse, y luego usar ese índice para determinar si se trata de un enlace, un punto de acceso o un hotspot. cualquier otra área especial. Si es así, muestre su información sobre herramientas (y probablemente quiera pasar las coordenadas del mouse al método Mostrar de la información sobre herramientas, en lugar de simplemente pasar el cuadro de texto, de modo que la información sobre herramientas se pueda colocar al lado del enlace).

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

Utilizar:

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

Use la función GetWord de mi otra respuesta para obtener la palabra al revés. Use la lógica del temporizador para deshabilitar la presentación de la información sobre herramientas como en prev. ejemplo.

En este ejemplo, justo arriba, la información sobre herramientas muestra la palabra al pasar al marcar el puntero del mouse.

Si esta respuesta aún no es lo que busca, especifique la condición que caracteriza la palabra sobre la que desea usar la información sobre herramientas. Si lo quiere para una palabra en negrita, por favor dígame.

También me gustaría agregar algo aquí que si carga el formulario deseado que contiene el control tooltip antes de ejecutar el progtwig, entonces el control de la punta de la herramienta en ese formulario no funcionará como se describe a continuación …

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

así que resolví este problema al poner el siguiente código en el procedimiento de evento Fram_main_load como este

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

Como no hay nada en esta pregunta (pero su antigüedad) que requiera una solución en Windows.Forms , aquí hay una manera de hacer esto en WPF en código subyacente.

 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; 

Si está utilizando el control RichTextBox. Simplemente puede definir el objeto Información sobre herramientas y mostrar la información sobre herramientas como se selecciona el texto moviendo el mouse dentro del control 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); } } 

Por el bien de la facilidad de uso y la comprensibilidad.

Simplemente puede poner una información sobre herramientas en cualquier lugar de su formulario (desde la caja de herramientas). A continuación, se le darán opciones en las Propiedades de todo lo demás en su formulario para determinar qué se muestra en la información sobre herramientas (se lee algo así como “Información sobre herramientas en toolTip1”). Cada vez que desplace el mouse sobre un objeto, el texto en esa propiedad se mostrará como información sobre herramientas.

Esto no cubre información sobre herramientas personalizada sobre la marcha, como la pregunta original está pidiendo. Pero lo dejo aquí para otros que no necesitan