cs_Capa6T
Messages postés36Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention15 août 2012
-
6 juin 2007 à 21:58
cs_Capa6T
Messages postés36Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention15 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 ?
cs_Capa6T
Messages postés36Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention15 août 20123 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 ?)
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
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 ???
cs_Capa6T
Messages postés36Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention15 août 20123 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.