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