[MFC] Gestion des clics : comportement étrange...

Gestion des clics : comportement étrange... [MFC] - C++ - Programmation

Marsh Posté le 25-01-2005 à 23:15:56    

Bonsoir ;)
 
J'ai réalisé un programme complet, et je viens de m'apercevoir d'un bug bien étrange.
 
En fait mon prog est de style Document/View, dans la view on remplir des cases en cliquant dessus, ou tout en maintenant le bouton de la souris appuyé (ON_WM_LBUTTONDOWN et ON_WM_MOUSEMOVE où je vérifie que le flags est bien = MK_LBUTTON).
 
Mon problème peut surgir dans deux cas.
- Fichier->ouvrir, je cherche le fichier à ouvrir et double clic dessus. Le fichier s'ouvre et un autre clic s'effectue sur ma view, qui me remplie alors une case.
- Lorsque je double clic sur la barre de titre de la view pour la mettre en plein écran. Pareil, une fois que la view est en plein écran, l'endroit où j'avais double clické est noirci !
 
Seule solution que j'ai trouvé pour éviter ce problème : dans mon OnMouseMove, au lieu de ne spécifier que nFlags == MK_LBUTTON pour effectuer un clic, je fais nFlags == MK_LBUTTON + MK_SHIFT.
 
C'est un peu embétant, maintenant je suis obligé d'appuyer sur shift pour peindre à l'aide de la souris ! Il doit bien y avoir un autre moyen... je vous remercie de votre aide :)

Reply

Marsh Posté le 25-01-2005 à 23:15:56   

Reply

Marsh Posté le 25-01-2005 à 23:41:46    

Pas facile à comprendre. Commence par tracer l'exécution de ton OnLButtonDown/OnMouseMove. Ca se dessiner pas tout seul, c'est ton code qui le fait il faut trouver de manière précise quand.
Tracer le bouton enfoncé est un peu plus complexe. Il faut capturer la souris (SetCapture) pour pas être grujé quand la souris sort de la fenêtre, et gérer WM_LBUTTONUP biensûr.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-01-2005 à 23:46:44    

Le problème c'est que la souris ne sort pas de la fenêtre, evidemment je ne fait aucune action quand elle est en dehors de la grille de dessin... il s'agit des deux cas que j'ai cité, et seulement dans ces cas (et les deux sont avec un double clic, soit sur un fichier, soit sur la barre de titre).
 
J'ai déjà catché le double clic pour voir mais ça n'y fait rien.

Reply

Marsh Posté le 26-01-2005 à 00:03:27    

Tu ne reçois que les message destinés à ta fenêtre. Si le mec
- enfonce le bouton
- sort de la fenêtre
- relache le bouton
 
tu recois que WM_LBUTTONDOWN, pas le UP.

Citation :

Le problème c'est que la souris ne sort pas de la fenêtre


et qu'est-ce qui l'en empêche ? Le menu ne fait pas partie de la partie cliente, ni la barre de titres. Essaye voir : enfonce le bouton dans ta fenêtre, fait glisser en dehors, et regarde ce qui se passe... T'auras sûrement le même genre de pblm.
Fait un SetCapture dans ButtonDown et un ReleaseCapture dans ButtonUp.
http://www.mvps.org/user32/setcapture.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-01-2005 à 00:17:24    

En fait pour le DOWN et UP j'ai pas de problème. A la limite y'a aussi la technique de sauvegarder la position entre le UP et le DOWN et lors du UP si la position est égale à la précedente alors on clic vraiment.
 
Je ne rencontre le problème avec MOUSEMOVE, je reçois l'événèment dans OnMouseMove et en plus il me dit dans les arguments qu'un bouton est cliqué alors que non... le problème est très spécifique :(
 
En effet avec SetCapture et ReleaseCapture je pense que c'est faisable, mais je suis certain que y'a une autre solution...

Reply

Marsh Posté le 26-01-2005 à 00:19:02    

Faut plutot gérer l'appui du boutton a la main et pas utiliser les flags passés à OnMouseMove vu qu'apparement ca merdoie.
 
avec un TrackMouseEvent pour gérer la sortie de la fenetre.
 
le .h avec la MESSAGE_MAP :

Code :
  1. //}}AFX_MSG
  2. afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
  3. DECLARE_MESSAGE_MAP()
  4. private:
  5. bool m_bMouseTracking;
  6. bool m_lButtonDown;


 
le cpp (avec la message map a pas oublier) :

Code :
  1. ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
  2. END_MESSAGE_MAP()
  3. void CTestMouseDownView::OnMouseMove(UINT nFlags, CPoint point)
  4. {
  5. // TODO: Add your message handler code here and/or call default
  6. if(!m_bMouseTracking)
  7. {
  8.  TRACKMOUSEEVENT tme;
  9.  tme.cbSize = sizeof(TRACKMOUSEEVENT);
  10.  tme.dwFlags = TME_LEAVE;
  11.  tme.hwndTrack = this->m_hWnd;
  12.  if (::_TrackMouseEvent(&tme))
  13.  {
  14.   m_bMouseTracking = TRUE;
  15.  }
  16. }
  17. if(m_lButtonDown)
  18.  TRACE("toto\n" );
  19. CView::OnMouseMove(nFlags, point);
  20. }
  21. LRESULT CTestMouseDownView::OnMouseLeave(WPARAM wParam, LPARAM lParam)
  22. {
  23. TRACE("MouseLeave\n" );
  24. m_lButtonDown = false;
  25. m_bMouseTracking = FALSE;
  26. return TRUE;
  27. }
  28. void CTestMouseDownView::OnLButtonDown(UINT nFlags, CPoint point)
  29. {
  30. m_lButtonDown = true;
  31. CView::OnLButtonDown(nFlags, point);
  32. }
  33. void CTestMouseDownView::OnLButtonUp(UINT nFlags, CPoint point)
  34. {
  35. m_lButtonDown = false;
  36. CView::OnLButtonUp(nFlags, point);
  37. }


 
ca doit marcher.
 
 
[edit]pas oublier d'initialiser l'état des boolééens qque part.


Message édité par SquiZZ le 26-01-2005 à 00:20:03
Reply

Marsh Posté le 26-01-2005 à 00:59:41    

Ca marche même super bien ;)
Je ne connaissais pas du tout cette technique en tout cas... j'applique et je retiens ! Merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed