Infobulle sur une ListView
Bonjour,
Voici mon problème :
J'ai une ListeView avec x items. Je voudrais lorsque la souris s'arrête sur un item (au bout de 2 secondes) afficher le contenu de l'item en infobulle. J'ai essayé avec les méthodes MaListeView_MouseMove et MaListeView_MouseHover, mais :
Pour MaListeView_MouseMove : l'infobulle garde le contenu que j'y mets la premiere fois
Pour MaListeView_MouseHover : dès que je bouge la souris un nouvel infobulle apparait, du coup il y en a x affichés en même temps.
De plus dans les 2 cas :
Je n'arrive pas à mettre un Timer de 2 secondes avant l'affichage.
Je n'arrive pas a killer l'infobulle affiché dès que l'uitlisateur bouge la souris.
Si vous pouvez m'aider :arf:
Merci bp
Cédric
Info Bulle, ToolTip dans ListView
Bonjour
Pour bien afficher l'info bulle, j'ai utilisé comme toi l'évènement MouseMove et un timer.
J'ai créé une variable qui désigne l'état de l'info bulle:
enum toolTipStatus{Rien,AttendDemarrageTimer,AttendAffichage,Affichage};
Rien=Info bulle effacée
AttendDemarrageTimer=On doit démarrer la tempo d'affichage de l'info bulle
AttendAffichage=On attend la fin de la tempo pour afficher l'info bulle
Affichage=Affichage de l'info bulle
On fonction de la position de la souris et de l'état courant de ma variable toolTipStatus, je modifie cette dernière:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| //On récupére l'enregistrement courant
ListViewItem lvi= malistView.GetItemAt(e.X, e.Y);
//Si on a rien, on cache l'info bulle si il y en a une
if(lvi==null)
{
m_toolTipStatus=toolTipStatus.Rien;
return;
}
switch(m_toolTipStatus)
{
case toolTipStatus.Rien: //Si on avait rien, on attend le délai avant affichage
listViewItemToolTip=lvi;
m_toolTipStatus=toolTipStatus.AttendDemarrageTimer;
break;
case toolTipStatus.AttendAffichage: //On affiche ou attend l'affichage, mais on vérifie que l'on est pas passé sur un autre enregistrement depuis
case toolTipStatus.Affichage:
if(listViewItemToolTip!=lvi)
{
listViewItemToolTip=lvi;
m_toolTipStatus=toolTipStatus.AttendDemarrageTimer;
}
break;
} |
Le timer gère l'affichage de l'info bulle et les informations à afficher en fonction de l'état de la variable toolTipStatus:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| timerToolTip.Stop(); //On stop le timer pour éviter la ré-entrance
textBoxStatus.Text=m_toolTipStatus.ToString(); //On affiche la configuration actuelle de l'info bulle
switch(m_toolTipStatus)
{
case toolTipStatus.Rien: //Si l'info bulle est affichée on la masque
if(monToolTip.Active==true)
monToolTip.Active=false;
break;
case toolTipStatus.Affichage: //Info bulle affichée
break;
case toolTipStatus.AttendAffichage: //La tempo est démarrée et on attend qu'elle soit écoulée pour afficher
//Si il est affiché, on le masque car on attend la fin de la tempo
if(monToolTip.Active==true)
monToolTip.Active=false;
//Calcul du temps écoulé
ellapse=Environment.TickCount-nDebutTempo;
if(ellapse>TOOL_TIP_DELAY)
{
//Le tempo est écoulé
//ICI ON DEFINIT LE TEXTE A AFFICHER DANS L'INFO BULLE
monToolTip.SetToolTip(malistView,listViewItemToolTip.ToString());
//On affiche l'info bulle
monToolTip.Active=true;
//On change le status
m_toolTipStatus=toolTipStatus.Affichage;
//On bouge un peux la souris, car sinon l'info bulle ne s'affiche pas
Cursor.Position=new Point(Cursor.Position.X+1,Cursor.Position.Y);
}
break;
case toolTipStatus.AttendDemarrageTimer: //On va démarrer la tempo
//Si il est affiché, on le masque car on attend la fin de la tempo
if(monToolTip.Active==true)
monToolTip.Active=false;
nDebutTempo=Environment.TickCount;
m_toolTipStatus=toolTipStatus.AttendAffichage;
break;
}
//Redémarrage timer
timerToolTip.Start(); |
J'ai écrit un petit programme en C# sur ce principe que j'ai mis sur mon serveur. Tu peux télécharge le zip avec ce lien:
http://www.artweweb.com/Forum/ListViewInfoBulle.zip
Voici une copie d'écran de l'affichage de l'info bulle avec mon programme
http://www.artweweb.com/Forum/ListViewInfoBulle.JPG
J'espère que ma réponse te conviendra
Si tu as d'autres questions n'hésite pas.
Salut
Problème scintillage info bulle
Salut
Non, je n'ai aucun problème de clignotement de l'info bulle. Par contre j'ai remarqué que lorsque la souris quitte le contrôle je n'ai pas ré-initialisé la variable toolTipStatus à "Rien" et désactivé l'info bulle.
Je te ferai une nouvelle version dans la soirée.
Le problème vient peut être de la configuration du toolTip par rapport à ton PC, et ton systeme d'exploitation.
Moi je fonctionne sous XP et le code utilise la version 1.1 du framework.
Essaye de mettre l'info bulle sur un bouton avec le paramétrage suivant et regarde si tu as toujours le problème.
Code:
1 2 3 4 5 6 7 8 9
| monToolTip= new ToolTip();
//Affichage immédiat pedant longtemps
monToolTip.AutoPopDelay = 10000;
monToolTip.InitialDelay = 1;
monToolTip.ReshowDelay = 1;
//Affiche le tool tip même si le contrôle n'est pas actif
monToolTip.ShowAlways = true; |
.
ListView, info bulle gestion MouseLeave
Salut
J'ai testé mon petit programme sur d'autres PC et je n'ai toujours pas pu mettre en évidence ton problème de clignotement. Peux tu me donner d'autres indices.
Par contre j'ai corrigé la gestion de l'info bulle quand la souris quitte le controle en mettant la variable m_toolTipStatus "Rien" sur l'évènement MouseLeave
Tu peux télécharger cette nouvelle version le lien:
http://www.artweweb.com/Forum/ListViewInfoBulle.zip