Afficher l'infobulle sur le curseur de la souris d'un texte

je veux afficher un tooltip lorsque la souris survole un lien dans mon contrôle d'édition rich personnalisé. Considérons le texte suivant:

nous tous sommeil la nuit .

Dans mon cas, le mot sommeil est un lien.

quand l'utilisateur déplace la souris sous le lien, dans ce cas "sleep", je veux afficher une infobulle pour le lien.

La suite est venu à mon esprit, mais ils ne sont pas travailler

1) Trappe Àmousehover

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

Mais cela ne fonctionne pas.

UPDATE

Les liens mentionnés sont URLs, I. e ce sont des liens personnalisés, donc Regex ne sera pas d'une grande aide ici, il peut être n'importe quel texte. L'utilisateur peut choisir de créer un lien.

Bien que je n'ai pas essayé GetPosition méthode, Je ne pense pas que ce serait aussi élégant en termes de conception et d'entretien.

Laissez me dire que j'ai la ligne suivante, dans mon richedit boîte

Nous sommeil la nuit. Mais les chauves-souris séjour réveillez-vous. Les cafards deviennent active la nuit.

dans la phrase ci-dessus, je veux trois tooltips différents, quand la souris plane dessus.

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

je trouve OnMouseMove comme suit:

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

Pas de Travailler avec info-bulle - info-bulle ne s'affiche pas

OnMouseMove( MouseventArgs e )
{

   if(cursor.current == cursors.hand )
   {
     tooltip.show(richeditbox,e.x,e.y,1000);
   }
}
18
demandé sur Jim Fell 2009-05-17 00:05:39

9 réponses

Eh bien, regardez, cela fonctionne, si vous avez des problèmes s'il vous plaît dites-moi:

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", "");
        }
    }
}
12
répondu Shimmy 2009-05-17 05:28:45

il suffit d'ajouter L'outil ToolTip de toolbox à la forme et d'ajouter ce code dans un événement mousemove de n'importe quel contrôle que vous voulez faire démarrer l'outil tooltip sur son 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
    }

j'espère que ça aide

paix

10
répondu Mawardy 2015-09-02 18:43:46

Vous ne devriez pas utiliser le tooltip privé de contrôle, mais formulaire. Cet exemple fonctionne 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
    {
    }

}
5
répondu serhio 2009-11-30 10:32:48

Ce n'est pas élégant, mais vous pourriez être en mesure d'utiliser la RichTextBox.Getcharindexfromposition méthode pour retourner à vous l'index du caractère que la souris est actuellement plus, et puis utiliser cet index pour comprendre si elle est au-dessus d'un lien, hotspot, ou toute autre zone spéciale. Si c'est le cas, montrez votre tooltip (et vous voudrez probablement passer les coordonnées de la souris dans la méthode D'affichage de tooltip, au lieu de simplement passer dans la zone de texte, de sorte que le tooltip peut être placé à côté du lien.)

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

2
répondu jean 2009-05-16 20:30:40

Utilisation:

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

Utilisez la fonction GetWord de mon autre réponse pour obtenir le mot caché. Utilisez la logique du minuteur pour désactiver reshow the tooltip comme dans prev. exemple.

dans cet exemple ci-dessus, le bout de l'outil affiche le mot en vol stationnaire en cochant le pointeur de la souris.

si cette réponse n'est toujours pas ce que vous cherchez, veuillez préciser la condition qui caractérise le mot que vous voulez utiliser tooltip on. Si vous le voulez pour le mot en caractères gras, s'il vous plaît dire je.

0
répondu Shimmy 2009-05-18 11:13:40

je voudrais aussi ajouter quelque chose ici que si vous chargez forme désirée qui contiennent tooltip controll avant l'exécution du programme alors le contrôle de pointe d'outil sur ce formulaire ne fonctionnera pas comme décrit ci-dessous...

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


    }

alors j'ai résolu ce problème en suivant le code dans la procédure D'événement Fram_main_load comme ceci

    private void Frm_Main_Load(object sender, EventArgs e)
    {
        Program.Showtop();
    }
0
répondu Shujaat Abdi 2013-05-09 11:27:20

Comme il n'y a rien dans cette question (mais son âge) qui nécessite une solution Windows.Forms, voici un moyen de le faire dans WPF EN code-derrière.

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
répondu Jesse Chisholm 2015-04-08 23:21:47

si vous utilisez RichTextBox control. Vous pouvez simplement définir L'objet ToolTip et afficher la pointe de l'outil lorsque le texte est sélectionné en déplaçant la souris à l'intérieur de la commande 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
répondu S G 2017-11-20 09:49:22

Pour des raisons de facilité d'utilisation et de compréhension.

vous pouvez simplement mettre une infobulle n'importe où sur votre formulaire (de la boîte à outils). Vous recevrez alors une option dans les propriétés de tout le reste dans votre forme pour déterminer ce qui est affiché dans cette Tooltip (il lit quelque chose comme "ToolTip on toolTip1"). Chaque fois que vous passez sur un objet, le texte de cette propriété sera affiché comme une infobulle.

ne pas couverture sur mesure à la volée la question initiale est posée. Mais je laisse cela ici pour d'autres qui n'ont pas besoin

0
répondu RugerSR9 2018-03-05 20:25:31