ListView Item survolé par la souris ?

Résolu
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 - 6 juin 2007 à 21:58
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 - 9 juin 2007 à 13:09
Bonjour,

Comment peut-on récupérer l'item survolé par la souris dans un contrôle ListView ?
J'ai vu quelques sources qui font des calculs sur la position de la souris etc etc mais ça ne peut fonctionner que si la ListView n'a pas été Scrollé verticalement et c'est une technique un peu bourrine...
Je suis sur qu'il doit y avoir mieux....une idée ?

Merci.

5 réponses

cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
9 juin 2007 à 13:02
OK, j'ai trouvé une solution... Gestion du message NM_HOVER.

Au départ, on a nôtre ListView (hWndListView) contenu dans une fenêtre Dialog (hDlg)
Il faut impérativement lui mettre le style LVS_EX_TRACKSELECT sinon pas de message NM_HOVER=>
 ListView_SetExtendedListViewStyleEx(hWndListView,0,LVS_EX_TRACKSELECT);

Si on veut, on peut gérer le temp de génération du message NM_HOVER comme suit:
ListView_SetHoverTime(hWndListView,500); // 500 ms

Puis dans le fenêtre Dialog on gère le message WM_NOTIFY comme suit: (pas de gestion sur le hWnd seule ma listview envoi WM_NOTIFY... si besoin utilisez (((LPNMHDR) lParam)->hwndFrom))

  case WM_NOTIFY:
  {
   switch (((LPNMHDR) lParam)->code)
   {
    // *************************
    // Mouse Over un Item
    case NM_HOVER:
    {
    WINDOWPLACEMENT PosWinLV; // Position ListView
    GetWindowPlacement(((LPNMHDR) lParam)->hwndFrom,&PosWinLV); // Position ListView



    RECT rcDialog; // Taille Header Dialog
    GetWindowRect(hDlg,&rcDialog); // Position Dialog
    rcDialog.top+=4; 
// Décalage de 4 (Windows XP ?)



    RECT rcHead; // Taille Header ListView
    GetWindowRect(ListView_GetHeader(hWndListView),&rcHead); 
// Taille Header ListView



    POINT Souris=GetCursorPos(&Souris);
// Position Souris



    LVHITTESTINFO ht;
    ht.pt.x=Souris.x-PosWinLV.rcNormalPosition.left; // Recalcule X
    ht.pt.y=Souris.y-PosWinLV.rcNormalPosition.top-(rcHead.bottom-rcHead.top)-rcDialog.top-ECART_Y;
// Recalcule Y



       int rval = ListView_SubItemHitTest(hLV, &ht);
      // RESULTAT
      // ht.iItem => n° Item survolé
      // ht.iSubitem => n° Subitem survolé
      }
   }
}


Voili...voilou....   ceci est une solution, il y en a bien d'autre comme sous-classer mais bon, je reste avec ma gestion simple de petits message windows....

PS: Pour le décalage de 4 pixels, je ne comprends pas de trop. Si ma fenêtre est maximisée, sa position initial est :
rcDialog.top=-4 ???
3
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
6 juin 2007 à 22:10
Ok..ok, suis sur une piste => ListView_SubItemHitTest
Si je trouve je poste un bout de code, ça peut toujours servir...
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
9 juin 2007 à 10:18
salut,
En sous classant ta liste view peut être, fait une recherche sur le site plusieurs sources en parlent

+
0
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
9 juin 2007 à 13:04
Oups....juste pour dire, il y a une faute pour la souris, il faut lire:

POINT Souris;
GetCursorPos(&Souris); // Position Souris
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
9 juin 2007 à 13:09
Encore moi...hum désolé...

Il y a dans le code une constante ECART_Y.
Elle me sert suivant la plateforme sur laquelle mon soft tourne. Sous Windows XP je dois la positionner à 10 et sur Windows 2000 elle reste à zéro...bizarre ce décalage au niveau de l'écran....je comprends pas alors je palie à ça par une détection d'OS et je place ma constante (variable en fait ;-) en fonction.

Voila, c'est treminé, j'arrête...
0