web-dev-qa-db-fra.com

Affichage d'une info-bulle sur le survol d'un texte avec la souris

Je souhaite afficher une info-bulle lorsque la souris survole un lien dans mon contrôle d'édition enrichi personnalisé. Considérez le texte suivant:

Nous tous dormons la nuit.

Dans mon cas, le mot sleep est un lien.

Lorsque l'utilisateur déplace la souris sous le lien, dans ce cas "veille", je souhaite afficher une info-bulle pour le lien.

Ce qui suit m'est venu à l'esprit, mais ils ne fonctionnent pas

1) Trapping OnMouseHover 

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

Mais ça ne marche pas.

METTRE À JOUR

Les liens mentionnés sont des URL non, c’est-à-dire des liens personnalisés. Par conséquent, Regex n’aidera pas beaucoup, il peut s'agir de texte. L'utilisateur peut choisir de créer un lien.

Bien que je n’ai pas essayé la méthode GetPosition, je ne pense pas qu’elle serait aussi élégante en termes de conception et de maintenance.

Permettez-moi de dire que j'ai la ligne suivante, dans ma boîte richedit 

Nous sleep la nuit. Mais les chauves-souris restent réveillé. Les blattes deviennent active la nuit.

Dans la phrase ci-dessus, je veux trois info-bulles différentes, lorsque la souris les survole.

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

J'ai piégé 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");
   }
}

Ne fonctionne pas - avec l'info-bulle - l'info-bulle ne s'affiche pas}

OnMouseMove( MouseventArgs e )
{

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

Eh bien, jetez un coup d'œil, ça marche, si vous avez des problèmes, 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
Shimmy

Il suffit d’ajouter l’outil info-bulle de la boîte à outils au formulaire et d’ajouter ce code dans un événement mousemove de tout contrôle que vous souhaitez faire démarrer l’aide 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
Mawardy

Vous ne devriez pas utiliser l'info-bulle de contrôle privé , mais le forme un . 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
serhio

Ce n’est pas élégant, mais vous pourrez peut-être utiliser la méthode RichTextBox.GetCharIndexFromPosition pour vous renvoyer l’index du caractère sur lequel se trouve la souris, puis l’utiliser pour déterminer s’il se trouve sur un lien, un point d'accès ou toute autre zone spéciale. Si c'est le cas, affichez votre info-bulle (et vous voudrez probablement passer les coordonnées de la souris dans la méthode Show de l'info-bulle, au lieu de simplement passer dans la zone de texte, de sorte que l'info-bulle puisse être positionnée à côté du lien).

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

2
jean

Par souci de facilité d'utilisation et de compréhensibilité.

Vous pouvez simplement mettre une info-bulle n'importe où sur votre formulaire (dans la boîte à outils). Vous aurez ensuite une option dans les propriétés de tout le reste de votre formulaire pour déterminer ce qui est affiché dans cette info-bulle (elle ressemble à quelque chose comme "Info sur info sur info-bulle1"). Chaque fois que vous passez la souris sur un objet, le texte de cette propriété sera affiché sous forme d’info-bulle.

Ceci ne ne couvre pas les info-bulles personnalisées à la volée, comme le demande la question initiale. Mais je laisse ça ici à d’autres qui n’en ont pas besoin 

0
RugerSR9

J'aimerais également ajouter quelque chose ici: si vous chargez le formulaire souhaité contenant le contrôle d'infobulle avant l'exécution du programme, le contrôle de l'info-bulle de 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);


    }

donc j'ai résolu ce problème en mettant le code suivant dans la procédure événementielle Fram_main_load comme celle-ci

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

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 survolé ..... Utilisez la logique du minuteur pour désactiver le réaffichage de l'info-bulle comme dans prev. Exemple.

Dans l'exemple ci-dessus, l'info-bulle montre le mot survolé en vérifiant le pointeur de la souris.

Si cette réponse ne correspond toujours pas à ce que vous cherchez, spécifiez la condition qui caractérise le mot sur lequel vous souhaitez utiliser l'info-bulle sur .Si vous le souhaitez comme mot en gras, veuillez me l'indiquer.

0
Shimmy

Si vous utilisez le contrôle RichTextBox. Vous pouvez simplement définir l'objet Info-bulle et afficher l'info-bulle pendant la sélection du texte en déplaçant le curseur de la souris dans le contrôle 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
S G

Comme il n'y a rien dans cette question (sauf son âge) qui nécessite une solution dans Windows.Forms, voici une façon de procéder dans WPF dans code-behind.

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
Jesse Chisholm