Win32 : Galère avec un "ownerdrawn button" quand la souris le survole

Résolu
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008 - 4 avril 2008 à 10:43
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008 - 4 avril 2008 à 14:41
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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
4 avril 2008 à 13:39
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 );
3
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
4 avril 2008 à 14:41
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+ !
0
Rejoignez-nous