WM_SERCURSOR et le curseur main

4 réponses
Avatar
Roger
C'est encore moi, bonjour,
Bon,
SetCursor(main);
SetWindowLong(diagnetkey, DWLP_MSGRESULT, TRUE);
ça marche très bien pour une procédure de dialogue.

J'ai maintenant le souhait de changer le curseur en main lors du survol d'un
bouton qui n'est plus dans une procédure de dialogue, j'ai essayé
SetCursor(main);
tout seul, ça ne marche pas,
j'ai quand même essayé comme dans la procédure de dialogue:
SetCursor(main);
SetWindowLong(diagnetkey, DWLP_MSGRESULT, TRUE);
ça marche à moitié, j'obtiens la main au survol du bouton, mais à la sortie
du survol du bouton le curseur ne redevient pas flèche, il faut pour cela
que j'aille survoler un autre contrôle de la même fenêtre.

A noter que ma fenêtre n'est pas tout à fait standard, elle ne se termine
pas par un: DefWindowProc mais par un DefMDIChildProc car c'est une fenêtre
fille d'une MDIClient.
......

4 réponses

Avatar
Roger
"Roger" a écrit dans le message de news:
50be652a$0$6453$

Petite amélioration:
Maintenant sur le WM_SETCURSOR
je teste d'abord si (HWND)wParam est bien le handle de mon bouton
et si LOWORD(lParam) == HTCLIENT
si les 2 conditions sont réunies je fait:
SetCursor(main); return true;

Résultat:
J'obtiens toujours la main quand je survole le bouton, par contre quand je
sors du bouton, ça marche une fois sur deux, parfois le curseur redevient
immédiatement flèche, parfois il reste sous forme de main jusqu'à ce que je
survole un autre contrôle...

Ca n'est donc pas encore parfait, je rappelle que je suis dans une fenêtre
fille de MDIclient
Avatar
Roger
En fait que je fasse ceci:

case WM_SETCURSOR:
if(((HWND) wParam == GetDlgItem(hwndmywind, ID_bouton))&&(LOWORD(lParam) ==
HTCLIENT))
{
GetCursorPos(&pt);
if(GetWindowLong(WindowFromPoint(pt), GWL_ID)==ID_bouton)
{
SetCursor(main);
return true;
} else return false;
} else return false;

ou bien que je fasse cela:

case WM_SETCURSOR:
if(((HWND) wParam == GetDlgItem(hwndmywind, ID_bouton))&&(LOWORD(lParam) ==
HTCLIENT))
{
GetCursorPos(&pt);
GetWindowRect(GetDlgItem(hwndmywind, ID_bouton), &rt);
if((pt.x>rt.left)&&(pt.x<rt.right)&&(pt.y>rt.top)&&(pt.y<rt.bottom))
{
SetCursor(main);
return true;
} else return false;
} else return false;


ça donne exactement le même résultat:
le curseur devient main au survol, mais lorsque je sors du bouton ça dépend
en fait de la vitesse à laquelle je sors, si j'en sors très lentement c'est
OK le curseur redevient flèche, par contre si j'en sors un peu plus vite le
curseur reste main jusqu'à ce que je survole un autre contrôle quelconque
Avatar
Christian ASTOR
Roger a écrit :

Ca n'est donc pas encore parfait, je rappelle que je suis dans une fenêtre
fille de MDIclient




Chez moi, ceci a l'air de marcher... =>

case WM_SETCURSOR:
{
if((HWND) wParam == GetDlgItem(hwnd, ID_bouton))
{
SetCursor(LoadCursor(NULL, IDC_HAND));
return TRUE;
}
else
{
DefMDIChildProc (hwnd, message, wParam, lParam);
return FALSE;
}
}
break;
Avatar
Roger
Chez moi, ceci a l'air de marcher... =>
else
{
DefMDIChildProc (hwnd, message, wParam, lParam);
return FALSE;
}



Effectivement, en rajoutant le DefMDIChildProc avant le return false ça
marche correctement c'est ça que je ne faisais pas.
Par la même occasion je me suis rendu compte que les tests supplémentaires
que je faisais par exemple sur le HTCLIENT ou le GetCursorPos ne me
servaient à rien alors que j'ai vu plein d'exemples sur Internet qui les
utilisent.
Merci