OVH Cloud OVH Cloud

Problème avec survol de boutons

15 réponses
Avatar
Roger
Bonjour,
Fenêtre dialogue créee dans fichier ressource avec contrôles statiques et
deux boutons.
Dans la CALLBACK du dialogue je teste WM_MOUSEMOVE pour récupérer la main
chaque fois que la souris se déplace sur la fenêtre du dialogue.
Puis j'utilise ChildWindowFromPoint pour savoir sur quel contrôle de la
fenêtre dialogue la souris se trouve.
La fonction ChildWindowFromPoint me fournit correctement le handle de chaque
contrôle statique chaque fois que je le survole, par contre quand je survole
les boutons, la fonction ChildWindowFromPoint continue à me fournir le
handle de la fenêtre parente (celle du dialogue) ce qui fait que je ne
détecte pas les boutons.
J'ai essayé ChildWindowFromPointEx avec le paramètre CWP_ALL, c'est pareil.
J'ai essayé de rajouter le paramètre WS_CHILD dans la description des
boutons du fichier ressource, c'est pareil.
De toutes façons les contrôles statiques du fichier ressource n'ont pas le
paramètre WS_CHILD et pourtant ça marche.
Je construis moi-même mes contrôles statiques et mes boutons (paramètres
SS_OWNERDRAW et BS_OWNERDRAW)
Est-ce normal ?
Merci

5 réponses

1 2
Avatar
Roger
Dans une DialogBox, il faut utiliser DWLP_MSGRESULT
Par exemple, pour changer le curseur en mimine juste sur un Edit
IDC_EDIT2, on fait =>

case WM_SETCURSOR:
{ if((HWND) wParam == GetDlgItem(hWnd, IDC_EDIT2))
{
SetCursor(LoadCursor(NULL, IDC_HAND));
SetWindowLong(hWnd, DWLP_MSGRESULT, TRUE);
}
else
return FALSE;
return TRUE;
}
break;




Bravo! Je n'aurais pas trouvé, faut-il se taper toute la lecture de msdn
pour trouver ce genre de truc ou existe-t-il une doc plus ergonomique, genre
bouquin, éventuellement en français avec un sommaire et un index.

En tout cas merci encore
Avatar
Roger
Dans une DialogBox, il faut utiliser DWLP_MSGRESULT
Par exemple, pour changer le curseur en mimine juste sur un Edit
IDC_EDIT2, on fait =>

case WM_SETCURSOR:
{ if((HWND) wParam == GetDlgItem(hWnd, IDC_EDIT2))
{
SetCursor(LoadCursor(NULL, IDC_HAND));
SetWindowLong(hWnd, DWLP_MSGRESULT, TRUE);
}
else
return FALSE;
return TRUE;
}
break;




Bon, j'ai lu la doc de l'API32, je n'ai quand même pas très bien compris le
fonctionnement de SetWindowLong(hWnd, DWLP_MSGRESULT, TRUE) mais de toute
évidence ça marche très bien.
J'en ai profité quand le curseur est sur le bouton pour changer la couleur
du texte du bouton, ma solution fonctionne, mais je ne suis pas sûr de m'y
être bien pris.
En gros, et pour simplifier l'explication quand le curseur est sur le bouton
je positionne un flag (en fait c'est un peu plus compliqué, mais le problème
n'est pas là) que je teste dans le traitement de WM_DRAWITEM pour choisir la
couleur. Le problème c'est qu'il faut que le WM_DRAWITEM s'exécute quand je
survole le bouton, le problème est donc de forcer Windows à repeindre le
bouton, j'ai essayé WindowUpdate(hwnddubouton) ainsi que d'envoyer
directement un sendmessage WM_PAINT au bouton mais sans succès. Pour forcer
la réécriture j'ai donc utilisé une méthode brutale qui marche: je fais un
SendMessage(..., WM_GETTEXT,...) pour lire le texte du bouton dans un
buffer, suivi d'un SendMessage(..., WM_SETTEXT,...) pour réécrire le même
texte dans le bouton, je pense que j'aurais pu aussi m'envoyer carrément un
SendMessage(..., WM_DRAWITEM,..) en construisant ma propre DRAWITEMSTRUCT,
mais sont-ce les bonnes méthodes pour simplement forcer Windows à passer
dans WM_DRAWITEM au moment opportun ?
Avatar
Christian ASTOR
Roger a écrit :
...


mais sont-ce les bonnes méthodes pour simplement forcer Windows à passer
dans WM_DRAWITEM au moment opportun ?



Pour rafraichir, il y a différentes manières, mais en général on fait :
InvalidateRect() - UpdateWindow()
Avatar
Roger
Pour rafraichir, il y a différentes manières, mais en général on fait :
InvalidateRect() - UpdateWindow()



OK, j'avais bien testé UpdateWindow(), mais je n'avais pas mis le
InvalidateRect(), maintenant ça marche. Merci.
Avatar
Thierry
"Roger" écrivait
news:50b60dc5$0$6455$:

Pour rafraichir, il y a différentes manières, mais en général on fait :
InvalidateRect() -



OK, j'avais bien testé UpdateWindow(), mais je n'avais pas mis le
InvalidateRect(), maintenant ça marche. Merci.



Wow !

Je n'étais pas passé ici depuis longtemps et revoila le thread Win32 sur
des surcharges de Winproc / setcursor.

Et toujours CAstor fidèle au poste.

Ce groupe n'a pas bougé d'un iota depuis... 13ans.

--
Vainqueur du 1er WSOFRJCP
Gros membre des Space Invaders
Sympathisant AAAAA
1 2