Mouse Programing C++
Mouse Programing C++
edge.It will be used almost everywhere. It will embeded in games programming to commerical valued applications.
This tutorial is written Turbo C++ 3.0 IDE and install in folder C:\TC. I recommend to use same IDE and settings to avoid any uncompatibility.
Basic Fundamentals:
Before we start programming we must first understand some principles on which mouse programming is based.
First thing you must know how to tell a mouse to do anything. In actual we do not communicate with mouse directly but through the driver provided. We use "Interrupts" to get access to this driver. Each device provide by computer has its own port and more or less we access these ports.
Each device has a unique port which is a hexadecimal value and value is designed to be machine independent enhancing portability of program.
Mouse has port 0X33 attached to it and similarly keyboard has attach port 0X60.
We also make use of address registers. These are basically UNION of type REGS defined in "dos.h". We use two registers to communicate to a device driver one for input and one for output.
We send value to device driver through the input register and recieve information in it embedded in output register.
AX Register
We can access various mouse functions using different values of AX input Register and passing those values to mouse port using a interrupt.
The Functions are listed below - Here AX, BX, CX and DX are members of UNION REGS and more or less integers.
Input
Function Performed
Returns
AX = 0
AX = 1
Nothing
AX = 2
Nothing
AX = 3
Mouse Position
CX = Mouse X Coordinate
DX = Mouse Y Coordinate
Ax = 3
BX = 0 No Key Is Pressed
Ax = 7
Nothing
CX = MaxX1
DX =MaxX2
Ax = 8
Nothing
CX = MaxX1
DX =MaxX2
Detecting Mouse
Before you start your mouse program you should always check whether the mouse programming is supported or not.
If somehow mouse fails to initialise you should always make sure that either program terminates or employ a error handling approach that maybe shift to keyboard interface .
To do mouse programming you must include <dos.h>. We use a function called int86() to access "interupts".
To detect mouse we use a function name detect_mouse() which has following code -
#include <dos.h>
union REGS in, out; void detect_mouse () { in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize"); else
int main ()
Mouse works both in text mode and graphic mode. In text mode it looks like a square while in graphics mode it looks like a pointer.
Mouse Programming in Text Mode
It was produced from adding a function showmouse_text() to above code so code becomes -
#include <dos.h>
void detect_mouse () { in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize");
int main ()
This is achieved using a function showmouse_graphics() added to above code while removing showmouse_text() from main.
void detect_mouse () { in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize"); else printf ("\nMouse was Succesfully Initialized"); }
void showmouse_graphics () { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); in.x.ax = 1;
int main ()
Next we do realtively simple task of hiding mouse using a function hide_mouse() as shown below -
void detectmouse () { in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize"); else printf ("\nMouse was Succesfully Initialize"); }
void showmouse_text ()
void showmouse_graphics ()
{ int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); in.x.ax = 1; int86 (0X33,&in,&out); getch ();
closegraph (); }
int main ()
Detecting Input
We will now work on a important aspect of mouse programming "Detecting Clicks" i.e. Taking Inputs.
We make use of an aditional function known as kbhit ( ). This functions returns zero till any keypress and when a key is press it returns 1.
For detecting mouseclicks we use a function called detect() which displays on screen the respective button clicked. Press any keyboad key to exit the loop.
#include <dos.h>
#include <graphics.h>
void detect_mouse ()
{ in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize"); else printf ("\nMouse was Succesfully Initialized"); }
void showmouse_text ()
{ in.x.ax = 1;
int86 (0X33,&in,&out); }
void showmouse_graphics ()
{ int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); in.x.ax = 1; int86 (0X33,&in,&out); getch (); closegraph (); }
void hide_mouse ()
void detect ()
{ while (!kbhit () ) { in.x.ax = 3; int86 (0X33,&in,&out); if (out.x.bx == 1) printf ("Left"); if (out.x.bx == 2) printf ("Right");
if (out.x.bx == 3) printf ("Middle"); delay (200); // Otherwise due to quick computer response 100s of words will get print } }
int main ()
{ detect_mouse (); showmouse_text (); detect (); hide_mouse (); getch (); return 0; }
Mouse Coordinates
We can obtain the coordinates of the mouse using same service 3 but using different elments of the union .
This function has a prime use in games programming, application designing and GUI development. Different decisions are taken on same left button click, its the postion of click that matters.
BX element of output registers stores the X Coordinate of the postion of mouse at time of calling function.
CX element of output registers stores the Y Coordinate of the postion of mouse at time of calling function.
Now we demonstrate the use of this function by modifying detect function above to display x and y coordinates on screen when left click is pressed.
void detect_mouse () { in.x.ax = 0; int86 (0X33,&in,&out); if (out.x.ax == 0) printf ("\nMouse Failed To Initialize"); else printf ("\nMouse was Succesfully Initialized"); }
void showmouse_graphics () { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); in.x.ax = 1; int86 (0X33,&in,&out); getch (); closegraph (); }
if (out.x.bx == 1) { x = out.x.cx; y = out.x.dx; printf ("\nLeft || X - %d Y - %d", x, y); } if (out.x.bx == 2) printf ("\nRight"); if (out.x.bx == 3) printf ("\nMiddle"); delay (200); // Otherwise due to quick computer response 100s of words will get print } }
int main ()
{ detect_mouse (); showmouse_text (); detect (); hide_mouse (); getch (); return 0; }
Restricting Mouse
We create a function called restrict which takes four paramters, two cartesian points each containing one x coordinate and one y coordinate.
First point mentions the top of the rectangle while second point mention the bottom bottom point of rectangle.
This service can be quite handy in special circumstances, for eg - if you want to restrict your mouse in one particular size window in GUI or In Games Programming.
#include <dos.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
in.x.ax = 7;
in.x.cx = x1;
in.x.dx = x2;
int86 (0X33,&in,&out);
in.x.ax = 8;
in.x.cx = y1;
in.x.dx = y2;
int86 (0X33,&in,&out);
void detect_mouse ()
in.x.ax = 0;
int86 (0X33,&in,&out);
if (out.x.ax == 0)
else
void showmouse_text ()
in.x.ax = 1;
int86 (0X33,&in,&out);
void showmouse_graphics ()
in.x.ax = 1;
int86 (0X33,&in,&out);
getch ();
closegraph ();
void hide_mouse ()
in.x.ax = 2;
int86 (0X33,&in,&out);
void detect ()
while (!kbhit () )
int x,y;
in.x.ax = 3;
int86 (0X33,&in,&out);
if (out.x.bx == 1)
x = out.x.cx;
y = out.x.dx;
int main ()
detect_mouse ();
showmouse_text ();
detect ();
hide_mouse ();
getch ();
return 0;
PS:- library graphics.h is incompatible with vista (working in Normal mode), because Vista doesnt support TC in fullscreen mode.