Win32 : Galère avec un "ownerdrawn button" quand la souris le survole [Résolu]

Signaler
Messages postés
33
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
30 juin 2008
-
Messages postés
33
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
30 juin 2008
-
Bonjour à tous,

Je deviens fou avec un bouton auquel je veux assigner un bitmap spécifique pour chacun des trois "états" suivants :
   -> pressé, relaché, survolé

Comme dans l'exemple connu de Charles Petzold (les deux boutons avec des motifs en triangle qui redimensionnent sa fenetre),
j'ai fait un bouton ownerdrawn , et j'intercepte l'evenement WM_DRAWITEM de la fenetre mère du bouton.

Là, je modifie le DC avec le bitmap de mon choix. Ca marche super, c'est très fluide, parfait.

Seulement, j'ai des problèmes en implémentant le highlight quand la souris survole.
J'ai ce code dans la procédure de mon bouton :

case WM_MOUSEMOVE:

if (quitbutton)

if(!quitbutton->mouse_over)
{
TRACKMOUSEEVENT tme;
tme.cbSize =
sizeof(tme);
tme.hwndTrack = hwnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 1;
quitbutton->mouse_over = TrackMouseEvent(&tme);
}

return CallWindowProc(quitbutton->OldProc,hwnd,uMsg,wParam,lParam);

case WM_MOUSEHOVER:

InvalidateRect(hwnd, NULL, FALSE);

break;

case WM_MOUSELEAVE:

if (quitbutton)
{
quitbutton->mouse_over=
false;

InvalidateRect(hwnd, NULL, FALSE);

}

break;

Les evenements mousehover et mouseleave arrivent parfaitement quand il faut (testé avec des messagebox) (et tiennent bien compte de la région : le bouton est circulaire)

Je n'arrive pas à faire un SendMessage(STM_SETIMAGE) au bouton ici, ca doit venir du fait qu'un bouton ownerdrawn ne gère pas ca..
Le redraw est donc forcé avec InvalideRect, mais dans le WM_DRAWITEM de la fenetre mere comment savoir si le DRAWITEM fait suite à un mouseleave ou à un mousehover ?

Avec les coordonnées de la souris, c'est une catastrophe.  (certainement à cause de la région).

Comment gérez vous le survol de la souris avec un bouton ownerdrawn ?

Merci beaucoup

2 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Perso je n'utilise pas
WM_MOUSEHOVER

    case WM_MOUSELEAVE:
        {
            dlg->hpasse = NULL;
            InvalidateRect(hwnd, 0, 1);
        }
    break;

    case WM_MOUSEMOVE:
     {

         if (dlg->hpasse != hwnd) {
            dlg->hpasse = hwnd;

            TRACKMOUSEEVENT sourie;
           
            sourie.cbSize = sizeof(TRACKMOUSEEVENT);
            sourie.hwndTrack = hwnd;
            sourie.dwHoverTime = 1;
            sourie.dwFlags = TME_LEAVE;

            _TrackMouseEvent(&sourie);

            InvalidateRect(hwnd, 0, 1);

         }
     }
     break;

case WM_DRAWITEM: {
...
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;bool bChecked (SendMessage(lpdis->hwndItem, BM_GETCHECK, 0, 0) BST_CHECKED);bool survol ( dlg->hpasse lpdis->hwndItem );
Messages postés
33
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
30 juin 2008

Merci beaucoup pour ton aide, ca marche nikel !

La solution était sous mes yeux puisque je gérais déjà le flag mouse_over dans les membres de ma classe bouton...

Merci a+ !