La souris [borland turbo c++ 3.0]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 682 fois - Téléchargée 37 fois

Contenu du snippet

Le programme indique la position du curseur et l'état du clic gauche et droit de la souris.

Certains codes montrent comment gérer la souris avec SetCursorPos, mais les anciens compilateurs DOS ne possèdent pas la librairie windows.h nécessaire à l'utilisation de SetCursorPos.

Pour y remédier, l'emploi du langage assembleur est obligatoire (enfin, je n'ai trouvé que cela). Il n'est pas difficile à utiliser sous Borland Turbo C++ 3.0. Il faut mettre une valeur dans le registre AX (0 à 3) et générer une interruption (ici, l'interruption n°33h).

Source / Exemple :


#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>

void main()
 {
	int x, y, clic;
	clrscr();
	_AX=0; geninterrupt(0x33);	// initialise le driver de la souris
	_AX=1; geninterrupt(0x33);	// affiche le curseur de la souris
//	_AX=2; geninterrupt(0x33);	// efface le curseur de la souris
	_setcursortype(_NOCURSOR);	// on retire le "curseur du clavier"

	do
	 {
		_AX=3; geninterrupt(0x33);	// recherche des infos de la souris
		clic=_BX;			// le clic se trouve dans _BX
		x=_CX;			// l'abscisse dans le registre _CX
		y=_DX;			// la coordonn‚e dans _DX
		gotoxy(1, 1);
		printf("Position : %d - %d   ", x, y);	// on affiche la position

		// si on ne clique pas
		if (clic == 0)
		 {
			gotoxy (1, 2);
			printf ("Clic Gauche : OFF");
			gotoxy (1, 3);
			printf ("Clic Droit : OFF ");
		 }

		// clic gauche
		if (clic & 1)
		 {
			gotoxy (1, 2);
			printf ("Clic Gauche : ON ");
		 }

		// clic droit
		if (clic & 2)
		 {
			gotoxy (1, 3);
			printf ("Clic Droit : ON  ");
		 }

	 }
	while (!kbhit());	// tant qu'on appuie sur aucune touche, on boucle
 }

Conclusion :


BeLZeL (belzel@free.fr)

A voir également

Ajouter un commentaire

Commentaires

eldered
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

Oki merci, c super, j'en avais justement besoin !!! ++
eldered
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

Salut ,

J'ai vu ton code pour la souris sur TC, qui est trés interessant d'ailleurs, et je me pose la question suivante :

Peut on modifier la valeur de _CX et _DX afin de replacer la souris à l'endroit que l'on veut ?

Je m'explique, je suis en train de programmer un casse brique et je me sert de ton code pour deplacer la raquette,
Cependant, les limites de ma table de jeux ne sont pas (0.0) / (640/480) mais (10,10) / (510/460), il faut donc,
Lorsque je me retrouve a l'exterieur de ces limites que je replace le curseur de la souris afin de ne pas attendre
Le retour du curseur par exemple.

Voila, en esperant une réponse !
@ micalement , Eddy
eldered
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

Pour ceux qui ont le meme probleme, voici la solution :

http://www.cppfrance.com/code.aspx?ID=17856

Vous y toruverez une librairie avec quelque fonction en assembleur qui permet de resoudre le probléme de "limites" que j'ai rencontré pour programmer un casse-briques. Voila !

++
cs_751
Messages postés
68
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
6 juillet 2007

Voici une solution: pour Placer la souris aux coordonées désirées, faire apparaitre, faire disparaitre, capter l'interruption, contrôler si la souris est dans le cadre( limities) désirés et ou au besoin faire les contrôles necessaires, si l'utilsateur a fait un clic avec le bouton droit ou gauche.
Pour les utilisations voir dans les progs au:
http://www.cppfrance.com/listeauteur2.aspx?ID=8416

void movetoxy(int x, int y)
{
union REGS regs;
regs.h.ah = 2; /* set cursor position */
regs.h.dh = y;
regs.h.dl = x;
regs.h.bh = 0; /* video page 0 */
int86(VIDEO, ®s, ®s);
}

void initialisersouris(int *ok,int *nbouton)
{
union REGS rin,rout;
rin.x.ax=0;
int86(0x33,&rin,&rout);
*ok=rout.x.ax;
*nbouton=rout.x.bx;
return;
}


void sourison()
{
union REGS rin,rout;
rin.x.ax=1;
int86(0x33,&rin,&rout);
return;
}

void sourisoff()
{
union REGS rin,rout;
rin.x.ax=0;
int86(0x33,&rin,&rout);
return;
}

void getsourisxy(int *xs,int *ys,int *bg,int *bd)
{
union REGS rin,rout;
rin.x.ax=3;
int86(0x33,&rin,&rout);
*xs=rout.x.cx;
*ys=rout.x.dx;
*bg=(rout.x.bx & 1)==1;
*bd=(rout.x.bx & 2)==2;
return;
}

void setsouris(int x,int y)
{
union REGS rin,rout;
rin.x.ax=4;
rin.x.cx=x;
rin.x.dx=y;
int86(0x33,&rin,&rout);
return;
}

int souris_inte(int a,int b,int c,int d)
{
int xs,ys,bd,bg;
getsourisxy(&xs,&ys,&bg,&bd);
if((a<=xs)&&(b<=ys)&&(c>=xs)&&(d>=ys))
return 1;
else
return 0;
}

int souris_ext(int a,int b,int c,int d)
{
int xs,ys,bd,bg;
getsourisxy(&xs,&ys,&bg,&bd);
if((xs<=a)||(ys<=b)||(xs>=c)||(ys>=d))
return 1;
else
return 0;
}
cs_henock
Messages postés
14
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
30 juillet 2010

c'est c'est justement ce que je cherche depuis un bon bout de temps et je crois qu'avec ça ma source paraitra bientot.merci pour la source henock

www.e-monsite.com/henockmermoz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.