Mouse Programming In C

Discussion in 'C' started by techgeek.in, Feb 28, 2010.

  1. techgeek.in

    techgeek.in New Member

    Joined:
    Dec 20, 2009
    Messages:
    572
    Likes Received:
    19
    Trophy Points:
    0
    Occupation:
    EOC (exploitation of computers)..i m a Terminator.
    Location:
    Not an alien!! for sure
    Home Page:
    http://www.techgeek.in

    Introduction



    Mouse has revolutionized the computer world. In GUI mouse is very essential for user interaction. it is a simple input device which allows you to point and execute interface in a random and faster manner than the keyboard which provides sequential interface. Mouse Programming is a topic which every C programmer needs to have in his toolbox to have a cutting edge.It will be used almost everywhere.

    Requirement



    Turbo C++ IDE installed in folder C:\TC.

    Fundamental Knowledge



    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 provided by a computer has a unique port which is a hexadecimal value which is designed to be machine independent enhancing portability of program. We access these ports in our program. Mouse has port 0X33 attached to it. 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 receive 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.
    Input --> Functions Performed with Return Param if any
    1. AX=0 --> Gets Mouse status (AX Value = FFFFh support is available. AX Value = 0 ,support is not available.)
    2. AX=1 --> Show Mouse Pointer.
    3. AX=2 --> Hide mouse pointer.
    4. AX=3 --> Mouse Position. (CX = Mouse X Coordinate, DX = Mouse Y Coordinate.)
    5. 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.)
    6. AX=7
      CX=MaxX1
      DX=MaxX2 --> Set Horizontal Limit.
    7. AX=8
      CX=MaxX1
      DX=MaxX2 --> Set Vertical Limit.

    Detecting Mouse



    Our first program checks to see if a mouse driver is loaded or not and that mouse programming is supported or not. Mouse driver is a program that senses the presence of the mouse and understands a signal coming from the mouse port before it translates these signals into relevant actions.

    If somehow mouse fails to initialise you should always make sure that either program terminates or employ a error handling approach.
    Code:
    #include <dos.h>  
    union REGS in, out;
    
    void detect_mouse ()
    {
    	in.x.ax = 0;
    	int86 (0X33,&in,&out);   //invoke interrupt
    	if (out.x.ax == 0)
    		printf ("\nMouse Failed To Initialize");
    	else
    		printf ("\nMouse was Succesfully Initialized");
    }
    
    int main ()
    {
    	detect_mouse ();
    	getch ();
    	return 0;
    }
    
    The above program declares two variables of type union REGS which is declared in dos.h, It contains two structures (struct WORDREGS x, struct BYTEREGS h).These two structures contain some 1-byte long and 2-byte long variables which indirectly represent CPU's registers. By placing 0 (sub-function) in ax register and invoking mouse interrupt(33h),we can check whether mouse driver is loaded or not. we used int86() function to invoke the interrupt.int86() takes 3 arguements:interrupt no and two union REGS type variables. If mouse driver is not loaded,it returns 0 in ax register.All return values are accessed using 'out' i.e why we have out.x.ax==0 in if statement.

    Showing Mouse



    • Mouse can be used 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
    Code:
    #include <dos.h>
    union REGS in, out;
    
    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
    Code:
    #include <dos.h>
    #include <graphics.h>
    
    union REGS 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;
    }
    
    
    In the above program, we used standard library function initgraph() to initialize graphics system. This function takes 3 arguments; graphics driver, graphics mode, path to the driver file. By using DETECT which is a macro defined in ‘graphics.h’, we tell the function to select a suitable driver by itself. When DETECT is used, no need to assign anything to graphics mode. Path is null since the driver files are located in the current directory.

    Hiding Mouse



    Code:
    void hide_mouse ()
    {
    	in.x.ax = 2;
    	int86 (0X33,&in,&out);
    }
    

    Program To Print Which Mouse Button Is Pressed



    Code:
     
    #include <dos.h>
    #include <graphics.h>
    union REGS in, out;
    void detect ()
    {
    	int button;
    	while (!kbhit () )
    	{
    		in.x.ax = 3;
    		int86 (0X33,&in,&out);
    		button=out.x.bx&7
    		switch(button)
    		{
    			case 1:
    				print(“left button pressed\n”);
    			break;
    			case 2:
    				print(“right button pressed\n”);
    			break;
    			case 4:
    				print(“middle button pressed\n”);
    			break;
    			case 3:
    				print(“left and right button pressed\n”);
    			break;
    			case 5:
    				print(“left and middle button pressed\n”);
    			break;
    			case 6:
    				print(“right and middle button pressed\n”);
    			break;
    			case 7:
    				print(“all the three buttons pressed\n”);
    			break;
    			default:
    				print(“No button pressed\n”);
    		}
    		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;
    }
    
    We used the same sub-function 3 and invoked mouse interrupt. This sub function even returns button press information in bx register. Entire button press information is stored in the first 3 bits of the bx register. So we ANDED bx with 7 to separate the first 3 bits and stored them in button variable.

    If the first bit's value is 1 then the left button is pressed, if the value is 0 then it is not pressed. If the second bit's value is 1 then the right button is pressed, if value is 0 then it is not pressed. If the last bit's value is 1 then the middle button is pressed, if value is 0 then it is not pressed.

    Program To Show The Position Of Mouse Pointer



    Code:
     
    #include <dos.h>
    #include <graphics.h>
    
    union REGS 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);
    		}
    		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;
    }
    
    In the above program we have a while loop. This loop continues until a key is hit. In loop, we used sub-function 3 and invoked mouse interrupt. Sub-function 3 returns X->co-ordinate in cx register and Y->co-ordinate in dx register. printf statements prints x and y co-ordinates as long as the loop continues. Maximum screen resolution for mouse in text mode is 640x200 and in graphics mode is 640x480.

    Program To Set The Position Of The Mouse Pointer On The Screen



    Sometimes we need to set the position of the mouse pointer, just as we set the position of the keyboard's cursor using gotoxy().The following program sets the pointer to (x=150,y=100) positon on the screen.

    Code:
     
    #include <dos.h>
    #include <graphics.h>
    
    union REGS in, out;
    void set()
    {
    	in.x.ax=4;
    	in.x.cx=150;
    	in.x.dx=100;
    	int86(0x33,&in,&out);
    }
    
    In the above program, we use sub-function 4 to set the pointer's position. We set the X->co-ordinate by placing a value in the cx register and Y->co-ordinate by placing a value in the dx register.

    Program To Restrict The Mouse Pointer Within A Boundary


    Code:
    #include <dos.h>
    #include <graphics.h>
    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);
    }
    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;
    }
    
    In the above program, sub function 7 is used to specify two x->co-ordinates and sub-function 8 is used to specify two y->co-ordinates and these co-ordinates form a rectangular boundary within which mouse is restricted.

    Free- Hand Drawing



    If you ever wonder, how pencil tool in paint works. Then, he following program shows how it can be written in C. The following program makes use of some of the sub function, which we already discussed above, and shows how they can be used to write useful programs like free-hand drawing. Just, go through the following program.

    Code:
    #include <graphics.h>
    #include <dos.h>
    union REGS in,out;
    show_mouse()
    {
    	i.x.ax=1;
    	int86(0x33,&i,&o);
    }
    
    hide_mouse()
    {
    	i.x.ax=2;
    	int86(0x33,&i,&o);
    }
    get_mouse_pos(int *x,int *y,int *button)
    {
    	i.x.ax=3;
    	int86(0x33,&i,&o);
    	*x=o.x.cx;
    	*y=o.x.dx;
    	*button=o.x.bx&1;
    }
    main()
    {
    	int gdriver = DETECT, gmode, errorcode,button,x1,y1,x2,y2;
    	initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
    	detect_mouse ();
    	outtextxy(230,400,"Press any key to exit....");
    	while(!kbhit())
    	{
    		show_mouse();
    		get_mouse_pos(&x1,&y1,&button);
    		x2=x1;
    		y2=y1;
    		while(button==1)
    		{
    			hide_mouse();
    			line(x1,y1,x2,y2) ;
    			x1=x2;
    			y1=y2;
    			get_mouse_pos(&x2,&y2,&button);
    		}
    	}
    }
    
     
    verygood likes this.
  2. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    dkingkumar likes this.
  3. mohit singhal

    mohit singhal New Member

    Joined:
    Apr 1, 2010
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    sir ,
    i have made a project on library management system using "c" as front end
    and ms-access as back end.this is console based and i was used modern compiler dev c++
    because i have not found sqltypes.h header file.but i want include gui in this but mouse initializing code is not working in dev c++. so what to do. please guide me.
     
  4. techgeek.in

    techgeek.in New Member

    Joined:
    Dec 20, 2009
    Messages:
    572
    Likes Received:
    19
    Trophy Points:
    0
    Occupation:
    EOC (exploitation of computers)..i m a Terminator.
    Location:
    Not an alien!! for sure
    Home Page:
    http://www.techgeek.in
    I will look into this matter and getting back to u as soon as possible...Don't worry..gimme some time..
     
  5. dkingkumar

    dkingkumar New Member

    Joined:
    Jan 30, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    sir ,
    i am doing a project in mouse programming..for that i need how a user can set position of cursor to a specific point by giving its co-ordinates...please help me in this matter..

    thanking u..
    plz guide me accordingly..
     
  6. verygood

    verygood New Member

    Joined:
    Feb 19, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    student
    Location:
    morocco
    it seems that iam with experts
     
  7. Naveed Marwat

    Naveed Marwat New Member

    Joined:
    Feb 16, 2011
    Messages:
    4
    Likes Received:
    0
    Trophy Points:
    0
  8. msdnguide

    msdnguide New Member

    Joined:
    May 14, 2011
    Messages:
    13
    Likes Received:
    0
    Trophy Points:
    0
    Occupation:
    msdnguide
    Location:
    Delhi
    Home Page:
    http://www.msdnguide.info/
    There is a book called Graphics in C by Yashwant Kanitkar. That has many more examples
     
  9. TPrice

    TPrice New Member

    Joined:
    Aug 24, 2010
    Messages:
    9
    Likes Received:
    1
    Trophy Points:
    0
    Thanks for this article on mouse programming in C. This is a topic that has been very intimidating to me, since it seems somewhat complicated. However, due to a project that I am currently working on, I am now forced to learn about this, and hopefully gain full comprehension before I can move forward. This article should prove to be very helpful.
     
  10. Tobiasgar

    Tobiasgar New Member

    Joined:
    Aug 29, 2011
    Messages:
    12
    Likes Received:
    0
    Trophy Points:
    0
    Home Page:
    http://www.mspy.com
    Completely agree!! thanx for sharing information on the the topic of mouse programming . Now it's possible to find all the necessary information related to the topic in one place))
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice