1.1 C语言图形程序设计基础
1.1.1屏幕显示方式与坐标系
1.文本方式与坐标系
在屏幕上只能显示字符的方式称为文本方式。在文本方式下,屏幕上可以显示的最小单位就是字符。为了能在指定位置显示每个字符,C语言提供了字符坐标系,字符坐标系原点为(1,1),水平为x轴,分为若干列;垂直方向为y轴,分为若干行。
Turbo C支持以下6种不同显示方式:
v BW40: 40*25 黑白
v C40: 40*25 彩色
v BW80: 80*25 黑白
v C80: 80*25 彩色
v MONO: 80*25 单色
v C4350: EGA 80*43;VGA 80*45 彩色
2.图形方式
在屏幕上显示图形的方式称为图形方式。图形方式下,屏幕上每个像素的显示位置用点坐标来描述。在此坐标系统中,屏幕左上角为坐标原点(0,0),水平方向为x轴,自左向右;垂直方向为y轴,自上向下。分辨率不同,max x、max y也不同。
1.1.2图形驱动程序与图形模式
1.图形驱动程序
符号常量 |
数值 |
符号常量 |
数值 |
DETELT |
0 |
IBM8514 |
6 |
CGA |
1 |
HERCMONO |
7 |
MCGA |
2 |
ATT400 |
8 |
EGA |
3 |
VGA |
9 |
EGA64 |
4 |
PC3270 |
10 |
EGAMONO |
5 |
|
|
2.图形模式
驱动程序 |
图形模式 |
值 |
分辨率 |
调色板 |
CGA |
CGAC0 |
0 |
320*200 |
C0 |
CGAC1 |
1 |
320*200 |
C1 | |
CGAC2 |
2 |
320*200 |
C2 | |
CGAC3 |
3 |
320*200 |
C3 | |
CGAC4 |
4 |
640*200 |
2色 | |
EGA |
EGAHI |
0 |
640*200 |
16色 |
EGALO |
1 |
640*350 |
16色 | |
VGA |
VGALO |
0 |
640*200 |
16色 |
VGAMED |
1 |
640*350 |
16色 | |
VGAHI |
2 |
640*480 |
16色 |
1.1.3图形系统初始化和模式控制
Turbo C的图形函数均在头文件“graphics.h”中定义,所以凡是要用到这些函数的程序,在程序文件的开头都要些上文件包含命令:
#include<graphics.h>
1. 图形系统初始化函数
void for initgraph(int *gdriver,int*gmode,char*path)
gdriver:指定要装入的图形驱动程序
gmode:设置图形显示模式
path:指明驱动程序所在路径
1)已知显示器类型的图形系统初始化:
v #include <graphics.h>
v main()
v {
v int gdriver,gmode;
v gdriver=CGA;
v gmode=CGAC0;
v initgraph(&gdriver,&gmode, "g://Win-TC");
v bar3d(10,20,50,80,0,0);
v getch();
v closegraph();
v }
2)自动初始化图形系统:
v #include<graphics.h>
v main()
v {
v int gdriver=DETECT,gmode;
v initgraph(&gdriver,&gmode, "g://Win-TC");
v bar3d(10,20,50,80,0,0);
v getch();
v closegraph();
v }
2.图形系统的关闭
void far closegraph();
3.图形模式的控制
1)返回当前图形模式值int far getgraphmode(void);
2)恢复屏幕在图形初始化前模式
void far restorecrtmode(void)
3)设置系统图形模式并清屏幕
void far setgraphmode(int gmode);
4)获取图形驱动器可使用的模式范围
void far getmoderang(int driver,int *lomode,int*himode);
例:
#include<stdio.h>
#include<graphics.h>
main()
{
int gdriver,gmode,lo,hi; gdriver=CGA;
getmoderange(CGA,&lo,&hi);
printf("CGA supporting modes range from %d to %d/n",lo,hi);
Initgraph(&gdriver,&lo, "g://Win-TC");
bar3d(100,30,130,150,0,0);
getch();
gmode=getgraphmode();
restorecrtmode();
printf("now in text mode,press any key back to graphics mode./n");
getch();
setgraphmode(gmode);
rectangle(50,30,100,130);
getch();
closegraph();
}
1.1.4图形坐标的设置
1、定点
1)把当前光标移到所需的位置 void far moveto(int x,int y);
2)以增量方式移动当前光标 void far moverel(int deltax,int deltay);
2、读取当前光标位置 int far getx(void);int far gety(void);
3、读取x,y轴的最大值 int far getmaxx(void);int far getmaxy(void);
例:
显示系统中图形硬件支持的最大的x,y值
#include<stdio.h>
#include<graphics.h>
main()
{ int gdriver,gmode;
gdriver=CGAC0;
initgraph(&gdriver,&gmode, " ");
printf("max x,y is %d,%d",getmaxx(),getmaxy());
getch();
restorecrtmode();
}
例:画一王字
#include<graphics.h>
main()
{ int gdriver=DETECT,gmode;
int x,y;
initgraph(&gdriver,&gmode, " ");
cleardevice();
moveto(100,40), linerel(40,0);
x=getx(); y=gety();
moveto(x,y+20); linerel(-40,0);
moverel(0,20); linerel(40,0);
moverel(-20,0); linerel(0,-40);
getch();
closegraph();
}
1.1.5屏幕窗口操作
1、图形屏幕处理
1)清除图形屏幕void far cleardevice(void);
例:
#include<graphics.h>
main()
{
int gdriver,gmode;
gdriver=VGA;
gmode= VGALO;
initgraph(&gdriver,&gmode, " ");
cleardevice();
bar3d(10,20,50,180,0,0,);
getch();
closegraph();
}
2)设置图形输出活动页void far setactivepage(int page);
3)设置可见图形页号void far setvisualpage(int page);
#include<graphics.h>
main()
{ int gdriver,gmode;
gdriver=VGA;gmode=VGAHI;
initgraph(&gdriver,&gmode, " ");
cleardevice();
setactivepage(1);
circle(150,130,80);
setactivepage(0);
rectangle(40,160,90,180); getch();
setvisualpage(1); getch();
setvisualpage(0); getch();
closegraph();
}
2、屏幕窗口操作
1)清除当前图形窗口
void far clearviewport(void);
2)设置图形窗口
void far setviewport(int left,int top,int right,int bottom,int clipflag);
说明:若clipflag为1,则超出窗口的输出自动剪裁掉,若clipflag为0,则图形窗口之外不被剪裁
例:
#include<graphics.h>
main()
{ int gdriver=CGA,gmode=0;
initgraph(&gdriver,&gmode, " ");
rectangle(30,25,80,80);
setviewport(30,25,80,80,0);
line(0,0,100,150);getch();
clearviewport();getch();
cleardevice();getch();
setviewport(20,15,80,80,1);
rectangle(0,0,60,65);
line(0,0,100,150);getch();
closegraph();
}
1.2图形颜色设置
1.2.1颜色的设置
1.设置当前背景色 void far setbkcolor(int color);
下表列出背景色名称和数值的对应关系。缺省时,默认值为0,即黑色。
符号常量 |
数值 |
含义 |
符号常量 |
数值 |
含义 |
BLACK |
0 |
黑色 |
LIGHTBLUE |
9 |
浅蓝 |
BLUE |
1 |
蓝色 |
LIGHTGREEN |
10 |
浅绿 |
GREEN |
2 |
绿色 |
LIGHTYAN |
11 |
浅青 |
CYAN |
3 |
青色 |
LIGHTRED |
12 |
浅红 |
RED |
4 |
红色 |
LIGHTMAGENTA |
13 |
浅洋红 |
MAGENTA |
5 |
洋色 |
YELLOW |
14 |
黄色 |
BROWN |
6 |
棕色 |
WHITE |
15 |
白色 |
LIGHTGRAY |
7 |
浅灰 |
|
|
|
DARKGRAY |
8 |
深灰 |
|
|
|
2.设置当前画图颜色void far setcolor(int color)
例:将画笔设置为红色,画一圆
#include"graphics.h"
main()
{
int gdrive=EGA,gmode=EGAHI;
initgraph(&gdrive,&gmode,"");
setbkcolor(1);
setcolor(RED);
circle(120,100,50);
getch();
closegraph();
}
2.2.2调色板
根据颜色控制方法不同,可以把支持的颜色屏幕划分为两类:一类是CGA;另一类是EGA,包括EGA和VGA适配器。
1.CGA调色板
调色板号 |
颜色0 |
颜色1 |
颜色2 |
颜色3 |
CGAC0 |
背景色 |
CGA-LIGHTGREEN |
CGA-LIGHTRED |
CGA_YELLOW |
CGAC1 |
背景色 |
CGA_LIGHTCYAN |
CGA_LIGHTMAGENTA |
CGA_WHITE |
CGAC2 |
背景色 |
CGA_GREEN |
CGA_RED |
CGA_YELLOW |
CGAC3 |
背景色 |
CGA_CYAN |
CGA_MAGENTA |
CGA_YELLOW |
低分辨率方式下,显示4种颜色
高分辨率方式下,显示2种颜色
例如: int gdrive=CGA,gmode=CGAC1;
initgraph(&gdrive,&gmode,"");
……
setcolor(CGA-WHITE);
……
2.EGA调色板(共64色,调色板16色)
符号常量 |
数值 |
含义 |
符号常量 |
数值 |
含义 |
EGA-BLACK |
0 |
EGA黑色 |
EGA-DARKGRAY |
56 |
EGA深灰 |
EGA-BLUE |
1 |
EGA蓝色 |
EGA-LIGHTBLUE |
57 |
EGA浅蓝 |
EGA-GREEN |
2 |
EGA绿色 |
EGA-LIGHTGREEN |
58 |
EGA浅绿 |
EGA-CYAN |
3 |
EGA青色 |
EGA=LIGHTCYAN |
59 |
EGA浅青 |
EGA-RED |
4 |
EGA红色 |
EGA-LIGHTRED |
60 |
EGA浅红 |
EGA-MAGENTA |
5 |
EGA洋红 |
EGA-LIGHTMACENTA |
61 |
EGA浅洋红 |
EGA-LIGHTGARY |
7 |
EGA浅灰 |
EGA-YELLOW |
62 |
EGA黄色 |
EGA-BROWN |
20 |
EGA棕色 |
EGA-WHITE |
63 |
EGA白色 |
3.改变调色板的一种颜色
void far setpalette(int oldcolor,int newcolor);
CGA模式,只有背景色能改变oldcolor=0
例如:setpalette(0,GREEN);
EGA模式,oldcolor是背景色表中任一种颜色, newcolor是上表3.5任一种颜色
例如:setpalette(BLUE,EGA-GREEN);
或setpalette(1,2);
2.2.3读取颜色信息
1.读取当前背景颜色 int far getbkcolor(void)
例如:printf(“background color is %d”,getbkcolor());
2.读取当前画图颜色int far getcolor(void)
3.读取最高可用颜色数int far getmaxcolor(void)
返回当前模式下最大有效颜色值。在EGA模式下返回最大值15,在CGA模式下,返回最大值3
4.在点(x,y)处画一规定颜色点
void far putpixel(int x,int y,int color);
5.读取点(x,y)的颜色
int far getpixel(int x,int y);
例:在不同位置画点
#include"graphics.h"
main()
{ int gdriver=DETECT,gmode;
int color,i,max,bkcolor,brushcolor;
initgraph(&gdriver,&gmode,"");
max=getmaxcolor();
for(i=0;i<20;i++)
putpixel(50+i*10,20,(max-5));
color=getpixel(50,20);
putpixel(150,150,color);
brushcolor=getcolor();
bkcolor=getbkcolor();
printf("background color is %d ,brush color is %d , color is %d", bkcolor,brushcolor,color);
putpixel(200,150,brushcolor);
getch();
closegraph();
}