Mouse Programming is a topic which every C programmer from  beginner to professional needs to have in his toolbox to have a cutting 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 Funda
 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                  Get  Mouse Status           AX Value = FFFFh support is  available.
                                                                       AX Value = 0 ,support is not available.
  
 AX = 1                  Show  Mouse Pointer                   Nothing
  
 AX = 2                  Hide  Mouse Pointer                    Nothing
  
 AX = 3                  Mouse  Position                 CX = Mouse X  Coordinate
                                                                          DX = Mouse Y Coordinate
  
 Ax = 3                  Mouse  Button Press           BX = 0 No Key Is Pressed
                                                                         BX = 1 Left Button is Pressed
                                                                         BX = 2 Right Button is Pressed
                                                                        BX = 3 Centre Button is Pressed
  
 Ax = 7                 Set Horizontal  Limit                     Nothing
 CX = MaxX1 
 DX =MaxX2           
  
 Ax = 8                 Set Vertical  Limit                         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 . We use a function  called int86() to access "interupts".
 To detect mouse we use a function name detect_mouse() which has following  code -
  
 #include 
 
 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
    printf ("\nMouse was  Succesfully Initialized");
  }
 
 int main ()
 
 {
   detect_mouse  ();
   getch ();
   return 0;
 }
  
  
 Showing and Hiding Mouse
  
 Now first we show mouse on screen . 
 - 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 
 
 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
  printf ("\nMouse was Succesfully  Initialized");
 }
 
 void showmouse_text ()
 
 {
  in.x.ax = 1;
  int86  (0X33,&in,&out);
 }
 
 int main ()
 
 {
  detect_mouse ();
  showmouse_text ();
  getch ();
  return 0;
 }
  
 Mouse Programming in Graphics Mode
  
 This is achieved using a function showmouse_graphics() added to above code  while removing showmouse_text() from main.
  
 #include 
 #include  
 
 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
  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 ();
 }
 
 int main ()
 
 {
  detect_mouse ();
  showmouse_graphics  ();
  getch ();
  return 0;
 }
             
  
 Next we do realtively simple task of hiding mouse using a function  hide_mouse() as shown below -
  
 #include 
 #include  
 
 union REGS in, out;
 
 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 ()
 
 {
   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 ()
 {
   in.x.ax = 2;
   int86  (0X33,&in,&out);
 }
 
 int main ()
 
 {
   detect_mouse  ();
   showmouse_graphics  ();
   hide_mouse  ();
   getch ();
   return 0;
 }
  
 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.
 kbhit() is used to run an infinite while loop.
 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 
 #include  
 
 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
  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 ()
 
 {
  in.x.ax = 2;
  int86  (0X33,&in,&out);
 }
 
 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.
 Code will be as followed -
  
 #include 
 #include  
 
 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
   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 ()
  {
    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;
           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 now restrict the mouse in particular rectangle .
 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.
  
 Final code of the tutorial -
 #include 
 #include 
 
 union REGS in, out;
 
 void restrict (int x1,int y1,int x2, int  y2)
 
 {
   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)
   printf ("\nMouse Fail To  Initialize");
   else
   printf ("\nMouse Succesfully  Initialize");
 }
 
 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 ()
 {
   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;
            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  ();
   restrict (100,100,500,500);  // Change values here to create different mouse movement space.
   detect ();
   hide_mouse ();
   getch ();
   return 0;
 }
  
 This was the most basic tutorial in Mouse Programming. We will be back with  more advanced once very soon.
refferd from botskool.com
 
No comments:
Post a Comment