21 Stimmen

Anzeige eines Tooltips bei Mausverschiebung eines Textes

Ich möchte einen Tooltip anzeigen, wenn die Maus über einen Link in meinem benutzerdefinierten Rich-Edit-Steuerelement schwebt. Betrachten Sie den folgenden Text:

Wir alle schlafen in der Nacht.

In meinem Fall ist das Wort schlafen ist ein Link.

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

Mir fielen folgende Möglichkeiten ein, aber sie funktionieren nicht

1) Überfüllen von OnMouseHover

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

Aber das klappt nicht.

UPDATE

Die genannten Links sind no URLs, d.h. es handelt sich um benutzerdefinierte Links, so dass Regex hier keine große Hilfe sein wird, es kann ein beliebiger Text sein. Der Benutzer kann wählen, ob er einen Link erstellen möchte.

Ich habe zwar nicht versucht GetPosition Ich glaube nicht, dass es in Bezug auf Design und Wartung so elegant wäre.

Ich habe zum Beispiel folgende Zeile in meiner Richedit-Box

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

In dem obigen Satz möchte ich drei verschiedene Tooltips haben, wenn die Maus über sie fährt.

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

I gefangen OnMouseMove wie folgt:

Arbeiten 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 wird nicht angezeigt

OnMouseMove( MouseventArgs e )
{

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

0 Stimmen

So hat es geklappt .. tooltip.Active = true

1 Stimmen

Oh, mir war nicht klar, dass Ihr Problem der Tooltip selbst ist... Wie auch immer, verwenden Sie System.Windows.Forms.Cursor.Current, um statisch den aktuellen Mauszeiger zu erhalten, wie in meiner letzten Antwort.

23voto

Mawardy Punkte 2961

Fügen Sie einfach das Tool ToolTip aus der Toolbox in das Formular ein und fügen Sie den folgenden Code in das Mousemove-Ereignis eines beliebigen Steuerelements ein, um den Tooltip bei dessen Mousemove zu starten

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
    }

Ich hoffe, es hilft

Frieden

2 Stimmen

Es genügt, toolTip1.SetToolTip(textBox3, "Tooltip text"); nur einmal zu setzen, nicht jedes Mal, wenn das Mousemove-Ereignis ausgelöst wird.

16voto

Shimmy Weitzhandler Punkte 97197

Schauen Sie mal, das funktioniert. Wenn Sie Probleme haben, sagen Sie es mir bitte:

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

5voto

serhio Punkte 27312

Sie sollten nicht verwenden der private Tooltip des Steuerelements aber die ein Formular . 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
    {
    }

}

2voto

jean Punkte 987

Das ist nicht elegant, aber Sie könnten die Methode RichTextBox.GetCharIndexFromPosition verwenden, um den Index des Zeichens zu ermitteln, über dem sich die Maus gerade befindet, und diesen Index dann verwenden, um herauszufinden, ob es sich über einem Link, Hotspot oder einem anderen speziellen Bereich befindet. Wenn ja, zeigen Sie Ihren Tooltip an (und Sie möchten wahrscheinlich die Mauskoordinaten an die Show-Methode des Tooltips übergeben, anstatt nur das Textfeld zu übergeben, damit 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 Stimmen

Ich tat das folgende; nur zum Testen in der MouseMove-Ereignis der Richedit-Box. if(Cursor.Current == Cursors.Hand) Messagebox.Show("My Tooltip); Aber mein Tooltip wird nicht angezeigt, sobald ich die Messagebox mit der tooltip.show() wie unten ersetzen if(Cursor.Current == Cursors.Hand) this.ttpLink.Show("Hover",txtBox,e.X,e.Y,1000); Bin ich etwas übersehen?

0 Stimmen

Jean, auch wenn ich den Text erhalte, wie kann ich wissen, dass der Ring ein Link ist,

0voto

Shimmy Weitzhandler Punkte 97197

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 Sie die Funktion GetWord aus meiner anderen Antwort, um das verschobene Wort zu erhalten. Verwenden Sie die Timer-Logik, um die erneute Anzeige des Tooltips wie im vorherigen Beispiel zu deaktivieren.

In diesem Beispiel oben zeigt der Tooltip das Wort an, über dem der Mauszeiger schwebt.

Wenn diese Antwort immer noch nicht das ist, wonach Sie suchen, geben Sie bitte die Bedingung an, die das Wort charakterisiert, für das Sie die QuickInfo verwenden möchten. Wenn Sie es für das fettgedruckte Wort wünschen, sagen Sie es mir bitte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X