[MFC] OnMouseMove() ou souris suractive

OnMouseMove() ou souris suractive [MFC] - C++ - Programmation

Marsh Posté le 05-01-2005 à 18:27:14    

Help !!!
 
La fonction CWnd::OnMouseMove, de la bibliothèque MFC, est une fonction qui ne devrait être activée que quand le curseur de la souris est en mouvement.
Plus précisément, quand la fenêtre CWnd, contenant le curseur, intercepte le message WM_MOUSEMOVE.
 
Or lorsque ma souris est immobile, cette fonction est activée !!!
 
Je le constate en mettant un point d’arrêt dans la fonction OnMouseMove associée à la classe CView de mon application.
Ma souris étant gentiment immobile, mon programme revient indéfiniment, et instantanément, à ce point d’arrêt.
Tout se passe comme si le message WM_MOUSEMOVE était envoyé indéfiniment !!!
 
Comment faire ?
N’y aurait-il pas une boucle indéfinie à interrompre ou une pile de messages à vider après chaque appel à cette fonction ?
 
Merci pour vos lumières !
 
Gilles

Reply

Marsh Posté le 05-01-2005 à 18:27:14   

Reply

Marsh Posté le 05-01-2005 à 19:34:13    

Si tu met un point d'arrêt ta souris va fatalement bouger lorsque tu va sélectionner ton éditeur

Reply

Marsh Posté le 05-01-2005 à 21:33:02    

le message n'est pas envoyé indéfiniment!
il est bien envoyé lorsque tu deplace ta souris, donc tu dois forcément la bougé!
utilise un raccourci clavier pour executer ton appli, ca evite de bouger la souris ;)  
CTRL + F5 sous Visual Studio 6

Reply

Marsh Posté le 06-01-2005 à 10:59:43    

Si si, il y a bien un souci.
Je maintiens que ma souris est immobile pendant le test !!!
 
Je suis en mode Debug.
Le point d'arrêt est un breakpoint inséré à l'aide de la touche F9 dans le code de la fonction OnMouseMove associée à la classe CView de mon application.
 
Pour éviter tout mouvement de la souris, je viens placer le curseur à l'endroit où va apparaître la fenêtre de mon application.
J'appuie alors sur F5 pour lancer l'exécution sous Debug, ma souris restant immobile sur mon bureau.
 
Instantanément, le breakpoint est activé et l’exécution s’arrête au milieu de la fonction OnMouseMove !!! Oui, oui, c’est bien là mon problème et je suis comme vous incrédule et étonné par ce comportement.
Si, sans toucher à la souris, je continue l'exécution par F5, je reviens indéfiniment sur le breakpoint.
 
Pour reproduire ceci, c'est très simple.
Créer un nouveau projet à l'aide de MFC AppWizard (exe). Prendre une Base class CView.
Ajouter un "Windows message Handler" pour intercepter le message WM_MOUSEMOUVE.
Ceci crée la fonction OnMouseMove associée à la classe CView de l'application.
Mettre un breakpoint dans le code de cette nouvelle fonction et passer au test après avoir mis le curseur à l’emplacement de la futur fenêtre de votre nouvelle application.
Ne pas toucher à la souris durant le test mais utiliser la touche F5.
 
Personne atteinte de la maladie de Parkinson s'abstenir ...
 
Merci pour votre attention.
 
Gilles
 
 

rits75 a écrit :

le message n'est pas envoyé indéfiniment!
il est bien envoyé lorsque tu deplace ta souris, donc tu dois forcément la bougé!
utilise un raccourci clavier pour executer ton appli, ca evite de bouger la souris ;)  
CTRL + F5 sous Visual Studio 6


Reply

Marsh Posté le 06-01-2005 à 16:30:26    

Citation :

Pour éviter tout mouvement de la souris, je viens placer le curseur à l'endroit où va apparaître la fenêtre de mon application.


 
quelque part c un peut normal, pour l'appli c'est comme si la souris venait d'arriver ds la fenetre! Imagine tu mets un autre curseur que la fleche pout on appli lorsque ta fenetre va s'ouvrir ton appli elle va param le curseur son icone c'est coordonnees etc...!
WM_MOUSEMOVE indique effectivement le deplacement de la souris, mais plus precesiment la nouvelle coordonees de la souris donc pour ton appli c ce qui se passe elle recupere la position de la souris pour effectuer les operations qui vont bien!
essai en mettant le curseur en dehors ce qui est qd meme + logique!!

Reply

Marsh Posté le 07-01-2005 à 09:35:12    

OK, mais pourquoi, quand on continu l'exécussion avec F5, le message WM_MOUSEMOVE est-il de nouveau envoyé ?
La position courante de la souris devrait être conservée par l'application.
 

Rits75 a écrit :

quelque part c un peut normal, pour l'appli c'est comme si la souris venait d'arriver ds la fenetre!

Reply

Marsh Posté le 07-01-2005 à 10:24:01    

Quand tu fais F5 le debuger met au premier plan ton appli, elle se retrouve sous la souris, elle reçois mouse move, le debugger revient de suite au premier plan car il a trouvé un break point. Dans de tels cas, ce que je fais c'est de réduire l'IDE dans un coin de l'écran, la fenêtre debuggée dans l'autre (pour pas qu'ils se recouvrent) je met la souris ailleurs encore et je debugge au clavier a coup de F5-F10-F11.
Note WM_MOUSEMOVE c'est pas seulement quand la souris bouge, mais aussi quand elle entre dans la fenêtre.


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

Marsh Posté le 08-01-2005 à 09:01:00    

Voici qui m'a convaincu !!!
 
Comme quoi, se mettre à la fenêtre c'est promener sa souris ...
 
Merci à tous et bon week-end.
 
Gilles
 
 
Plutôt que de jouer sur la dimension des fenêtres pour debuguer, j'ai placé le code suivant au début de l'implémentation de la fonction OnMouseMove de la CView de mon application.
 
//----------------------------------------------------------
void CxxxView::OnMouseMove(UINT nFlags, CPoint pointDC)  
//----------------------------------------------------------
{
#ifdef _DEBUG
 if(mousePoint == CPoint(0,0))
  mousePoint = pointDC;
 if(mousePoint == pointDC)
  return;
 mousePoint = pointDC;
#endif
 
NB : mousePoint est une variable de type CPoint de la classe CxxxView

Reply

Sujets relatifs:

Leave a Replay

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