begin process at 2012 05 30 20:00:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 4 avril 2008 à 10:43:59 | Win32 : Galère avec un "ownerdrawn button" quand la souris le survole

shuttleur

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

vendredi 4 avril 2008 à 13:39:32 | Re : Win32 : Galère avec un "ownerdrawn button" quand la souris le survole

SnOOpss

Réponse acceptée !
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 );
vendredi 4 avril 2008 à 14:41:38 | Re : Win32 : Galère avec un "ownerdrawn button" quand la souris le survole

shuttleur

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+ !


Cette discussion est classée dans : bouton, souris, tme, quitbutton, ownerdrawn


Répondre à ce message

Sujets en rapport avec ce message

Clique de souris apres xx milisecondes... [ par 33man ] Hmm j'aimerai faire un prog tout simple pas d interface graphique mais qui simule un clique de souris bouton gauche en bas et apres xx miliseconde le Evènement relachement du bouton gauche de la souris...?? [ par liv ] Bonjour,Je cherche à identifier l'évènement "je relâche le bouton gauche de la souris lors d'un redimmensionnement de ma boîte de dialogue". En somme. recuperer l'etat du bouton de la souris [ par kor6k ] bonjour,Je crois que mon titre est assez explicite mais je vais quand même apporter plus de précisions:Je suis en train de creer une classe bouton pou détecter bouton enfoncé [ par F0ra ] Bonjour,Je voudrais savoir comment détecter si le bouton de la souris est toujours enfoncé avec la position souris x,y. En cherchant, j'ai trouvé qu Position souris sur un bouton avec vc++6 [ par hadrien1 ] Bonjour, Voila j'ai fabriqué une classe CBtButton dérivé de CButton, j'ai ajouté aussi la gestion du message WM_MOUSEMOVE jusque la impecable. J'ai Simuler le click de la souris sur un bouton de windows media player [ par poutchou24 ] Bonjour, Je cherche à simuler le click de la souris sur le bouton Play de Windows Media Player sans avoir à déplacer le curseur ( je veux garder WMP Message souris sur bouton... [ par ndubien ] Bonjour,Comment savoir lorsque la souris se trouve sur un bouton/une zone de texte de la fenêtre?En C API Win32 Merci gestion click puis deplacement de la souris et relachement du bouton de la souris [ par FlaMMe34 ] Bonjour, Je cherche à gérer le fait de clicker puis déplacer la souris puis relâcher le bouton de le souris. Afin de calculer le déplacement entre l Hook Souris, et copie d'une zone texte selectionné. [ par guitz2fr ] Bonjour, Voila, concrètement, j'ai besoin de pouvoir intercepter des zone de texte sélection via un click souris et sur des fenetres autres que cell Associer au click d'un bouton l'affichage du contenu d'une variable dans une textbox [ par johnASP ] Bonjours à tous!! Donc voilà, je débute avec le logiciel Microsoft Visual Studio 2005 ainsi qu'en C++. Pour l'instant je n'arrive qu'a afficher le co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales