Graphics in C Language
Graphics in C Language
Initgraph initializes the graphics system by loading a graphics driver from disk (or
validating a registered driver) then putting the system into
graphics mode.Initgraph also resets all graphics settings (color, palette, current position,
viewport, etc.) to their defaults, then resets graphresult to 0.
*graphdriver
Integer that specifies the graphics driver to be used. You can give graphdriver a value
using a constant of the graphics_drivers enumeration type.
*graphmode
Integer that specifies the initial graphics mode (unless *graphdriver = DETECT). If
*graphdriver = DETECT, initgraph sets *graphmode to the highest resolution available
for the detected driver. You can give *graphmode a value using a constant of the
graphics_modes enumeration type.
*pathtodriver
Specifies the directory path where initgraph looks for graphics drivers (*.BGI) first.
Normally, initgraph loads a graphics driver by allocating memory for the driver (through
_graphgetmem), then loading the appropriate .BGI file from disk.As an alternative to this
dynamic loading scheme, you can link a graphics driver file (or several of them) directly
into your executable program file.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
/* initialize graphics mode */
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* return with error code */
}
/* draw a line */
line(0, 0, getmaxx(), getmaxy());
/* clean up */
getch();
closegraph();
return 0;
}
Normally the screen which u view in DOS is in the text mode which means it is meant for
text. And for graphics u need to initialize graphics mode. And for this to happen u need to
include ?graphics.h?.
The circle command takes a X coordinate which means Vertical axis and Y coordinate
which means Horizontal axis. And the last one is the radius of the circle. closegraph();
With out this function the screen mode will still remain in graphic mode and when u
come out, to DOS u will see a different screen, which is not in the text mode.
To start with graphics programming, Turbo C is a good choice. Even though DOS has its own limitations, it
is having a large number of useful functions and is easy to program. To implement graphics algorithms, To give
graphical display of statistics, To view signals from any source, we can use C graphics. Here is a article to start
programming with Turbo C. 'Run and Learn' is our method. We have used source codes throughout the explanations.
Just execute them to understand what is happening.
/* simple.c
example 1.0
*/
#include<graphics.h>
#include<conio.h>
void main()
{
int gd=DETECT, gm;
getch();
closegraph();
}
To run this program, you need graphics.h header file, graphics.lib library file
and Graphics driver (BGI file) in the program folder. These files are part of
Turbo C package. In all our programs we used 640x480 VGA monitor. So all
the programs are according to that specification. You need to make necessary
changes to your programs according to your screen resolution. For VGA
monitor, graphics driver used is EGAVGA.BGI.
Here, initgraph() function initializes the graphics mode and clears the screen.
We will study the difference between text mode and graphics mode in detail
latter.
InitGraph:
Declaration:
void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);
Remarks: To start the graphics system, you must first call initgraph.
initgraph initializes the graphics system by loading a graphics driver from disk (or
validating a registered driver) then putting the system into graphics mode.
initgraph also resets all graphics settings (color, palette, current position, viewport, etc.) to
their defaults, then resets graphresult to 0.
Arguments:
*graphdriver: Integer that specifies the graphics driver to be used. You can give
graphdriver a value using a constant of the graphics drivers enumeration type.
*graphmode : Integer that specifies the initial graphics mode (unless *graphdriver =
DETECT). If *graphdriver = DETECT, initgraph sets *graphmode to the highest
resolution available for the detected driver. You can give *graphmode a value using a
constant of the graphics_modes enumeration type.
pathtodriver : Specifies the directory path where initgraph looks for graphics drivers
(*.BGI) first. If they're not there, initgraph looks in the current directory. If pathtodriver
is null, the driver files must be in the current directory. This is also the path settextstyle
searches for the stroked character font files (*.CHR).
closegraph() function switches back the screen from graphcs mode to text
mode. It clears the screen also. A graphics program should have a closegraph
function at the end of graphics. Otherwise DOS screen will not go to text mode
after running the program. Here, closegraph() is called after getch() since
screen should not clear until user hits a key.
If you have the BGI file in the same folder of your program, you can just
leave it as "" only. you need not mention *graphmode if you give *graphdriver
as DETECT.
/*
shapes.c
example 1.1
*/
#include<graphics.h>
#include<conio.h>
void main()
{
int gd=DETECT, gm;
int poly[12]={350,450, 350,410, 430,400,
350,350, 300,430, 350,450 };
initgraph(&gd, &gm, "");
circle(100,100,50);
outtextxy(75,170, "Circle");
rectangle(200,50,350,150);
outtextxy(240, 170, "Rectangle");
ellipse(500, 100,0,360, 100,50);
outtextxy(480, 170, "Ellipse");
line(100,250,540,250);
outtextxy(300,260,"Line");
• void far arc(int x, int y, int stangle, int endangle, int radius);
• void far circle(int x, int y, int radius);
• void far pieslice(int x, int y, int stangle, int endangle, int radius);
Remarks:
Arguments:
Here, stangle and endangle are in degrees starting from the +ve x-axis in the
polar coordinate system in the anti-clockwise direction. if stangle is 0, endangle
is 360, it will draw a full circle. Refer this figure for clear idea: For the details
of current color, fill color and fill patterns, refer the sections Lines and Colors.
Another basic shape that we come across is a rectangle. To draw a border,
use rectangle with the coordinates of outline, to draw a square use rectangle
with same height and width. drawpoly() and fillpoly() are two functions useful
to draw any polygons. To use these functions, store coordinates of the shape in
an array and pass the address of array as an argument to the function. By
looking at the output of the previous program, you can understand what
drawpoly is. fillpoly is similar except that it fills in the shape with current fill
color.
Declaration:
• void far rectangle(int left, int top, int right, int bottom);
• void far drawpoly(int numpoints, int far *polypoints);
• void far fillpoly(int numpoints, int far *polypoints);
Remarks:
• (left,top) is the upper left corner of the rectangle, and (right,bottom) is its
lower right corner.
• numpoints: Specifies number of points
To draw a closed polygon with N points, numpoints should be N+1 and the
array polypoints[] should contain 2(N+1) integers with first 2 integers equal to
last 2 integers.
Let us study more about shapes latter. Here is some idea about colors.
There are 16 colors declared in graphics.h as listed bellow.
BLACK: 0
BLUE: 1
GREEN: 2
CYAN: 3
RED: 4
MAGENTA: 5
BROWN: 6
LIGHTGRAY: 7
DARKGRAY: 8
LIGHTBLUE: 9
LIGHTGREEN: 10
LIGHTCYAN: 11
LIGHTRED: 12
LIGHTMAGENTA: 13
YELLOW: 14
WHITE: 15
Declaration:
Remarks:
#include "graphics.h"
#include "conio.h"
#include "stdlib.h"
void main()
{
int gd,gm;
gd=DETECT;
setfillstyle(1, 14);
bar(100, 100, 540, 380);
while(!kbhit())
{
putpixel(random(439)+101,
random(279)+101,random(16));
setcolor(random(16));
circle(320,240,random(100));
}
getch();
closegraph();
}
In the next part of the article, Ranjith K. H. will explain about adding mouse to
your application. Read Part II
Tell us about this article: This is the first article of this tutorial. We are planning to
expand it. To continue with, We need your suggestions. Next part of the article will be
depending on the comments you post. Tell us which part of the article need to be
explained more, how can the article be elaborated more and how did you feel the article.
Click here to post a feed back or e-mail me: harsha@electrosoftsl.com
http://electrosofts.com/cgraphics/
In GUI's like Windows, mouse is very important for user interaction. But in DOS,
mouse will come in to picture only in some of the programs. If you are writing
DOS games or graphics programs, you can add mouse functionality to your
code. Here is how to do that.
Once the driver has been loaded, initgraph() sets up the numeric values of
the graphics mode chosen in the variables gd and gm respectively. Here we are
assuming that the driver files are in the directory 'c:\tc\bgi'. Hence the path
passed to initgraph() is 'c:\tc\bgi'.
int callmouse()
{
in.x.ax=1;
int86(51,&in,&out);
return 1;
}
void mouseposi(int &xpos,int &ypos,int &click)
{
in.x.ax=3;
int86(51,&in,&out);
click=out.x.bx;
xpos=out.x.cx;
ypos=out.x.dx;
}
int mousehide()
{
in.x.ax=2;
int86(51,&in,&out);
return 1;
}
void setposi(int &xpos,int &ypos)
{
in.x.ax=4;
in.x.cx=xpos;
in.x.dx=ypos;
int86(51,&in,&out);
}
int main()
{
int x,y,cl,a,b;
clrscr();
int g=DETECT,m;
initgraph(&g,&m,"c:\tc\bgi");
a=100;
b=400;
setposi(a,b);
callmouse();
do
{
mouseposi(x,y,cl);
gotoxy(10,9);
printf("\n\tMouse Position is: %d,%d",x,y);
printf("\n\tClick: %d",cl);
printf("\n\tPress any key to hide the mouse");
}while(!kbhit());
getch();
mousehide();
printf("\n\n\tPress any key to Exit");
getch();
}
• callmouse( )
• mouseposi( )
• mousehide( )
• setposi( )
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<dos.h>
union REGS in,out;
int callmouse()
{
in.x.ax=1;
int86(51,&in,&out);
return 1;
}
void restrictmouseptr(int x1,int y1,int x2,int y2)
{
in.x.ax=7;
in.x.cx=x1;
in.x.dx=x2;
int86(51,&in,&out);
in.x.ax=8;
in.x.cx=y1;
in.x.dx=y2;
int86(51,&in,&out);
}
int main()
{
int x,y,cl,a,b;
clrscr();
int g=DETECT,m;
initgraph(&g,&m,"c:\tc\bgi");
rectangle(100,100,550,400);
callmouse();
restrictmouseptr(100,100,550,400);
getch();
}
• Horizontal ( )
• Vertical( )
Horizontal() :- In this function AX is set to "7". Its sets the horizontal barrier
for the pointer which restricts the mouse pointer to pass that limit. CX is been
loaded with the minimum x co-ordinate and Dx is been loaded with the maximum
x co-ordinate.
Vertical() :- In this function AX is set to "8".Its sets the vertical barrier for
the pointer which restricts the mouse pointer to pass that limit. CX is been loaded
with the minimum y co-ordinate and Dx is been loaded with the maximum y co-
ordinate.