2009-05-16 10 views
18

Ich möchte eine QuickInfo anzeigen, wenn der Mauszeiger über einen Link in meinem benutzerdefinierten Rich-Edit-Steuerelement bewegt wird. Betrachten Sie den folgenden Text:Anzeige der QuickInfo beim Mauszeiger über einen Text

Wir alle schlafen in der Nacht.

In meinem Fall das Wort Schlaf ist ein Link.

Wenn der Benutzer die Maus unter dem Link bewegt, in diesem Fall "Schlaf", möchte ich einen Tooltip für den Link anzeigen.

Im Folgenden kam mir in den Sinn, aber sie arbeiten nicht

1) Trapping OnMouseHover

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

Aber dies nicht funktioniert.

UPDATE

Die Links erwähnt sind nicht URLs, das heißt diese benutzerdefinierten Links sind, so Regex hier nicht viel helfen wird, es ein Text sein kann. Der Benutzer kann wählen, ob er einen Link erstellen möchte.

Obwohl ich GetPosition Methode nicht versucht habe, denke ich nicht, dass es das hinsichtlich Design und Wartung elegant sein würde.

Lassen Sie mich sagen, ich habe die folgende Zeile in meinem Richedit Box

Wir Schlaf in der Nacht. Aber die Fledermäuse bleiben wach. Kakerlaken werden aktiv in der Nacht.

In dem obigen Satz möchte ich drei verschiedene Tooltips, wenn die Maus über sie schwebt.

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

I OnMouseMove gefangen wie folgt:

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

funktioniert nicht - mit Tooltip - Tooltip erscheinen nicht

OnMouseMove(MouseventArgs e) 
{ 

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

Das tat den Trick .. tooltip.Active = true –

+1

Oh, ich wusste nicht, Ihr Problem war der Tooltip selbst ... Wie auch immer, verwenden Sie System.Windows. Forms.Cursor.Current um den aktuellen Mauszeiger statisch zu bekommen, wie in meiner letzten Antwort. – Shimmy

Antwort

2

Dies ist nicht elegant, aber Sie können möglicherweise die RichTextBox.GetCharIndexFromPosition-Methode verwenden, um Ihnen den Index des Zeichens zurückzugeben, über dem sich die Maus gerade befindet, und dann anhand dieses Indexes herauszufinden, ob es sich um einen Link, Hotspot, oder irgendein anderes spezielles Gebiet.Wenn dies der Fall ist, zeigen Sie Ihren Tooltip an (und Sie möchten wahrscheinlich die Mauskoordinaten in die Show-Methode des Tooltips eingeben, anstatt nur das Textfeld zu übergeben, sodass der Tooltip neben dem Link positioniert werden kann).

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

+0

Ich habe folgendes getan; nur zum Testen im MouseMove-Ereignis der Richit-Box. if (Cursor.Current == Cursors.Hand) Messagebox.Show ("My Tooltip); Aber mein Tooltip nicht angezeigt bekommen, sobald ich die Messagebox mit dem tooltip.show(), wie unten ersetzen, wenn (Cursor.Current == Cursors.Hand) this.ttpLink.Show ("Schweben", txtBox, eX, eY, 1000); Vermisse ich etwas? –

+0

Jean, auch ich bekomme den Text wie kann ich das wissen atring ia link, –

12

Nun, werfen Sie einen Blick, das funktioniert, wenn Sie Probleme haben, bitte sagen Sie mir:

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

Verwendung:

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

Verwenden GetWord Funktion von meiner anderen Antwort, um das gehobene Wort zu bekommen. Verwenden Sie die Timer-Logik, um den Tooltip wie in prev zu deaktivieren. Beispiel.

In diesem Beispiel rechts oben zeigt die QuickInfo das verschobene Wort durch Markieren des Mauszeigers an.

Wenn diese Antwort immer noch nicht das ist, wonach Sie suchen, geben Sie bitte die Bedingung an, die das Wort kennzeichnet, für das Sie Tooltip verwenden möchten. Wenn Sie es für bolded Wort wollen, bitte sagen Sie mir.

4

Sie sollten nicht verwenden die Steuerelement private Tooltipp, aber die Form eine. Dieses Beispiel funktioniert gut:

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

ich auch hier etwas hinzufügen möchte, dass, wenn Sie gewünschte Form laden, die Tooltip controll vor der Programmdurchlauf dann Werkzeugspitze Kontrolle auf dem Formular enthalten, werden nicht wie unten beschrieben arbeiten ...

[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 löste ich dieses Problem durch folgenden Code in Fram_main_load Ereignisprozedur wie diese

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

fügen Sie einfach Quick-Info-Tool aus Toolbox auf das Formular ein puting nd fügen Sie diesen Code in einem mousemove- Fall einer Kontrolle, die Sie den Tooltip auf seinen mousemove- beginnen machen wollen

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 
    } 

hoffen, es hilft

Frieden

+0

es genügt, set toolTip1.SetToolTip (textBox3, "Tooltip text") zu setzen, nur einmal, nicht jedes Mal, wenn das mousemove-Ereignis ausgelöst wird. – anion

0

Da gibt es nichts in dieser Frage (aber sein Alter), die eine Lösung in Windows.Forms erfordert, hier ist eine Möglichkeit, dies in WPF in Code-behind zu tun.

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

Wenn Sie RichTextBox-Steuerelement verwenden. Sie können einfach das QuickInfo-Objekt definieren und das QuickInfo-Tool anzeigen, während der Text ausgewählt wird, indem Sie die Maus innerhalb des RichTextBox-Steuerelements bewegen.

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

Aus Gründen der Benutzerfreundlichkeit und Verständlichkeit.

Sie können einfach einen Tooltip überall in Ihrem Formular (aus der Toolbox) platzieren. Sie erhalten dann eine Option in den Eigenschaften von allem anderen in Ihrem Formular, um zu bestimmen, was in diesem Tooltip angezeigt wird (es liest etwas wie "ToolTip auf ToolTip1"). Jedes Mal, wenn Sie auf ein Objekt zeigen, wird der Text in dieser Eigenschaft als QuickInfo angezeigt.

Diese nicht Abdeckung benutzerdefinierte On-the-Fly-Tooltips wie die ursprüngliche Frage verlangt. Aber ich lasse dieses hier für andere, die nicht brauchen

Verwandte Themen