Comparer la position du curseur à 2 instants différents [Résolu]

Signaler
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Salut,

je cherche, grâce aux APIs windows, à connaitre et comparer la position du curseur à 2 instants différents et quand le bouton gauche est enfoncé. C'est pour scroller mon programme enfaite. Vous auriez une idée de comment faire svp ?

ala, merci tout l'monde :D

15 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Justement, le premier coup tu prends x1 et y1 et leu deuxième, x2 et y2:

BOOL firstTime = TRUE;

case WM_LBUTTONDOWN:
if(firstTime)
{
x1 = LOWORD(lParam);
y1 = HIWORD(lParam);
}
else
{
x2 = LOWORD(lParam);
y2 = HIWORD(lParam);

if(x1!=x2 || y1!=y2)
MessageBeep(0);
}
firstTime ^= 1;
break;
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

regarde dans msdn les messages :
   - WM_LBUTTONDOWN (tu as X dans LOWORD(lParam) et Y dans HIWORD(lParam))
   - WM_LBUTTONUP
   - WM_MOUSEMOVE

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_lbuttondown.asp

++
24K
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Merci mais enfaite je connais ces messages, le problème c'est que je sais pas comment comparer 2positions différentes à partir de ces messages. J'suis sûr que la soluce doit etre toute conne, mais bon faut croire que je suis mauvais c'est tout ^^
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu savegarde dans une variable le premier coup, comme ca tu l'a sous la main quand tu en as besoin pour faire la "comparaison"
C'est tellement évident que je me demande si j'ai bien compris ton problème
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Oui je comprend qu'il faut que je fasse un teste grâce à 2 couples de variables, mais le problème c'est que je sais pas où faire le premier coup. Parce que si je fais ca dans le message WM_LBUTTONDOWN, comme ca :

        case WM_LBUTTONDOWN:
             x1 = LOWORD(lParam);
             y1 = HIWORD(lParam);
             x2 = LOWORD(lParam);
             y2 = HIWORD(lParam);
            
             if(x1!=x2 || y1!=y2)
              MessageBeep(0);

             break;

Ca ne pourra jamais marcher vu que les 2 couples de variables seront remplis au même moment et auront donc les mêmes valeurs.
Il faut comprendre que la différence ne peut etre que de 1 ou -1 en x et en y parce que je veux faire cette comparaison qu'à partir du moment où le bouton gauche de la souris est enfoncé(moment T1). Et le moment T2 serait donc quand je bouge.

J'espère que vous voyez sur quoi je bugge
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

J'avais meme pas pensé au booléen !  J'ai honte de moi lol

merci ;)
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

euh par contre un tit probleme là. Pour savoir comment calculer la différence, j'affiches les 4 valeurs x1 x2, y1 y2. Sauf que pour x1 et y1 j'obtient des nombres du genre 20122245565. J'crois pouvoir dire sans trop de mal que c'est pas normale

vous sauriez d'où ca vient ? Mon code =>

       case WM_MOUSEMOVE: 
            
             switch(wParam){
             case MK_LBUTTON:
                  
                  if(firstTime)
                  {
                      X1 = LOWORD(lParam);
                      Y1 = HIWORD(lParam);


                      firstTime = false;
                  }
                  else
                  {
                      X2 = LOWORD(lParam);
                      Y2 = HIWORD(lParam);
                               
                      if(X1!=X2 || Y1!=Y2)
                      {
                        char pt[20];
                        wsprintf(pt, "%i et %i, %i et %i", X1, Y1, X2, Y2);
                        MessageBox(hwnd, pt, "points", MB_OK);                        
                        
                        X1 = LOWORD(lParam);
                        Y1 = HIWORD(lParam); 
                      }
                       
                  }


                  break;
                
             }
             break;

merci
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
pour imprimer un entier c'est %d, pas %i
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Bah j'ai toujours fais %i, et ca a toujours marché. %d c'est pas pour double+int plutot ?

bref ca revient au meme
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est pas parce tes coordonnées sont négatives par hasard?
Essaie d'utiliser MAKEPOINTS (ou bien: short X1 = (short)LOWORD(lParam); etc)
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Ah oui c'est vrai que je m'apercoit que quand je met des short, les valeurs de X1 et Y1 sont 30 673 et -30 678, systématiquement. J'comprends pas ...
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Voilà j'ai enfin réussi ! c'était tout con, fallait juste pas déclarer les short dans le "WindowProc"

merci, a+
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
Salut,
j'vois pas d'où viens l'erreur, avec plus de code peut-etre, mais %i ou %d c'est exactement la meme chose.

d    Integer    signed decimal integer
i    Integer    signed decimal integer

Source :   Borland C++ User's Guide

Sinon essaie de mettre :
char pt[28];
et
wsprintf(pt, "%i et %i, %i et %i\0", X1, Y1, X2, Y2);

A+

eRoZion
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
Désolé,
j'ai répondu sans voir que le problème était solutionné, je fais toujours l'erreur avec les posts étalés sur plusieurs pages.

Ceci dit, "char pt[28];" n'est pas inutile car
"1200 et 1000, 1210 et 1010" ca fait 26 caractère et 27 avec le 0 de fin, donc 28 pour l'alignement.

++

eRoZion
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Merci quand meme. Mais le probleme n'était pas l'affichage des variables grâce à un MessageBox(), mais la validité des données dans ces variables.
Enfaite, plutot que de déclarer les variables en dehors du WindowProc, ce qui est la solution "facile" disons, il faut juste déclarer les variables en static

 ++