2009-05-16 21 views
18

Quiero mostrar una información sobre herramientas cuando el mouse se desplaza sobre un enlace en mi control personalizado rich edit. Considere el siguiente texto:Mostrar información sobre herramientas en el mouse sobre un texto

Todos sueño en la noche.

En mi caso la palabra sueño 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.

El siguiente vino a mi mente, pero no están trabajando

1) El atrapar OnMouseHover

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

pero esto no funcionó.

ACTUALIZACIÓN

Los enlaces mencionados son no URL, es decir estos son enlaces personalizados, por lo 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 richedit

Nos sueño por la noche. Pero los murciélagos se quedan despierto. Las cucarachas se convierten en active en la noche.

En la frase 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 

I atrapado OnMouseMove de la siguiente manera:

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

que no trabaja - con Tooltip - Información sobre herramientas no aparece

OnMouseMove(MouseventArgs e) 
{ 

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

Esto funcionó ... tooltip.Active = true –

+1

Oh, no me di cuenta de que su problema era la información sobre herramientas ... De todos modos, use System.Windows. Forms.Cursor.Current para obtener estáticamente el cursor del mouse actual, como en mi última respuesta. – Shimmy

Respuesta

2

Esto no es elegante, pero es posible que pueda usar el método RichTextBox.GetCharIndexFromPosition para devolverle el índice del personaje sobre el que está actualmente el mouse, y luego usar ese índice para averiguar si se trata de un enlace, punto de acceso, o 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

+0

Hice lo siguiente; solo para probar en el evento MouseMove del cuadro richedit. si (== Cursor.Current Cursors.Hand) Messagebox.Show ("Mi información sobre herramientas); pero no está consiguiendo muestra mi información de herramienta, una vez que se sustituye la Messagebox con el tooltip.show() de la siguiente manera si (Cursor.Current == Cursors.Hand) this.ttpLink.Show ("Hover", txtBox, eX, eY, 1000); ¿Me falta algo? –

+0

Jean, incluso obtengo el texto ¿cómo sé el atring ia link, –

12

Bueno, echar un vistazo, esto funciona, Si tiene problemas por favor dígame:

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

Uso:

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

Utilice la función Getword de mi otra respuesta para obtener la palabra suspendida. Use la lógica del temporizador para deshabilitar la función de volver a mostrar la información sobre herramientas como en prev. ejemplo.

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

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

4

No debe usar la información de herramientas privada de control, pero la forma una. 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 
    { 
    } 

} 
0

También me gustaría añadir algo aquí que si se carga forma deseada que contiene información sobre herramientas controll antes de correr a continuación, herramienta de control de la punta del programa en esa forma 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); 


    } 

por lo que resolvió este problema que pone el siguiente código en el procedimiento de evento como éste Fram_main_load

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

Sólo tiene que añadir herramienta de información sobre herramientas de la caja de herramientas a la forma de una nd añadir este código en un evento MouseMove de cualquier control que desea realizar la descripción inicia por sí 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 
    } 

creo que sirve

paz

+0

es suficiente para establecer set toolTip1.SetToolTip (textBox3, "Texto de información sobre herramientas"), solo una vez, no cada vez que se produce el mousemove-event. – anion

0

Como no hay nada en esta pregunta (pero su edad) que requiere una solución en Windows.Forms, aquí hay una manera de hacerlo 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; 
0

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

Por la facilidad de uso y 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.

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

Cuestiones relacionadas