Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
910 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°962409
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 25-01-2005 à 23:15:56  profilanswer
 

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 :)

mood
Publicité
Posté le 25-01-2005 à 23:15:56  profilanswer
 

n°962420
HelloWorld
Salut tout le monde!
Posté le 25-01-2005 à 23:41:46  profilanswer
 

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
n°962422
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 25-01-2005 à 23:46:44  profilanswer
 

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.

n°962428
HelloWorld
Salut tout le monde!
Posté le 26-01-2005 à 00:03:27  profilanswer
 

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
n°962432
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 26-01-2005 à 00:17:24  profilanswer
 

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...

n°962434
SquiZZ
Posté le 26-01-2005 à 00:19:02  profilanswer
 

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
n°962446
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 26-01-2005 à 00:59:41  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Mod_Rewrite] Gestion des paramètresprix d'une page de gestion de tarifs
gestion de temps dans script AS[GDI / MFC] Clipping !
[PHP] Création d'un système de gestion d'utilisateursBesoin de creer un outil de gestion de base de données
[MFC] Pb avec la serialisationOracle - Gestion de la BDD & interfacage C++
[MFC/SDI] Comment changer la className de la fenetre principale?[C/Linux] Gestion des interruptions [edit : exploiter le driver série]
Plus de sujets relatifs à : [MFC] Gestion des clics : comportement étrange...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR