begin process at 2008 07 05 07:31:25
1 205 059 membres
45 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : ListView Item survolé par la souris ? [ Windows / GUI ] (Capa6T)

ListView Item survolé par la souris ? le 06/06/2007 21:58:12

Capa6T
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.

Re : ListView Item survolé par la souris ? le 06/06/2007 22:10:20

Capa6T
Ok..ok, suis sur une piste => ListView_SubItemHitTest
Si je trouve je poste un bout de code, ça peut toujours servir...

Re : ListView Item survolé par la souris ? le 09/06/2007 10:18:36

omnia
salut,
En sous classant ta liste view peut être, fait une recherche sur le site plusieurs sources en parlent

+

Re : ListView Item survolé par la souris ? le 09/06/2007 13:02:10

Capa6T
Réponse acceptée !

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 ???


Re : ListView Item survolé par la souris ? le 09/06/2007 13:04:41

Capa6T
Oups....juste pour dire, il y a une faute pour la souris, il faut lire:

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

Re : ListView Item survolé par la souris ? le 09/06/2007 13:09:49

Capa6T
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...


Classé sous : listview, item, souris, survolé

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS