📄 图形处理.htm
字号:
<P>二、窗口内文本的输入函数 <BR> int getche(void);
该函数在前面已经讲过,需要说明的是,getche()函数从键盘上获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。<BR>下面这个程序给上例中加入了一些文本的输出函数。<BR>#include
<STDIO.H><BR>#include <CONIO.H><BR>int
main()<BR>{<BR>int i;<BR>char *c[]={"BLACK",
"BLUE", "GREEN", "CYAN", "RED",<BR>"MAGENTA",
"BROWN", "LIGHTGRAY"};<BR>textbackground(0); /*
设置屏幕背景色 */<BR>clrscr(); /* 清除文本屏幕 */<BR>for(i=1;
i<8;
i++)<BR>{<BR>window(10+i*5,5+i,30+i*5,15+i); /*
定义文本窗口 */<BR>textbackground(i); /* 定义窗口背景色
*/<BR>clrscr(); /* 清除窗口
*/<BR>}<BR>getch();<BR>return
0;<BR>}<BR>有关屏幕操作的函数<BR> void clrscr(void);
清除当前窗口中的文本内容, 并把光标定位在窗口的左上角(1, 1)处。 void
clreol(void); 清除当前窗口中从光<BR>标位置到行尾的所有字符, 光标位置不变。
void gotoxy(x, y); 该函数很有用,
它用来定位光标在当前窗口中的位置。这里x,y是指光标要<BR>定位处的坐标(相对于窗口而言),当x,y超出了窗口的大小时,该函数就不起作用了。<BR> int
gettext(int xl,int yl,int x2,int y2,void
*buffer);<BR> int puttext(int x1,int y1,int
x2,int y2,void
*buffer);<BR>gettext()函数是将屏幕上指定的矩形区域内文本内容存入buffer
指针指向的一个内存空间。内存的大小用下式计算:
所用字节大小=行数*列<BR>数*2。其中:<BR> 行数=y2-y1+1 列数=x2-x1+1
puttext()函数则是将gettext()函数存入内存buffer中的文字内容拷贝到屏幕上指定的位置。<BR> int
movetext(int x1, int x2, int y2, int x3, int y3);
movetext()函数将屏幕上左上角为(x1, y1),右下角为(x2,
y2)的一矩形窗口内的文本内容拷贝到左上角为(x3,
y3)的新的位置。该函数的坐标也是相对于整个屏幕而言的。<BR>注意:<BR> 1.
gettext()函数和puttext() 函数中的坐标是对整个屏幕而言的,
即是屏幕的绝对坐标,而不是相对窗口的坐标。<BR> 2.
movetext()函数是拷贝而不是移动窗口区域内容, 即使用该函数后,
原位置区域的文本内容仍然存在。<BR>#include<CONIO.H><BR>main()<BR>{<BR>int
i;<BR>char *f[]={"Load F3","Pick Alt-F3","New
",<BR>"Save F2","Write to
","Directory",<BR>"Change dir","Os shell ","Quit
Alt-X"};<BR>char
buf[11*16*2];<BR>clrscr();<BR>textcolor(YELLOW);<BR>textbackground(BLUE);<BR>clrscr();<BR>gettext(10,
2, 24, 11, buf);<BR>window(10, 2, 24,
11);<BR>textbackground(RED);<BR>textcolor(YELLOW);<BR>clrscr();<BR>for(i=0;
i<9; i++)<BR>{<BR>gotoxy(1,
i+1);<BR>cprintf("%s",
f[i]);<BR>}<BR>getch();<BR>movetext(10, 2, 24, 11,
40, 10);<BR>puttext(10, 2, 24, 11,
buf);<BR>getch();<BR>}<BR>下面再介绍一些函数:<BR> void
highvideo(void); 设置显示器高亮度显示字符<BR> void
lowvideo(void); 设置显示器低亮度显示字符<BR> void
normvideo(void); 使显示器返回到程序运行前的显示方式<BR> int
wherex(void); 这两个函数返回当前窗口下光标的x,y坐标<BR> int
wherey(void); Turbo C
提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h
中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphics
lib选为on,只有这样才能保证正确使用图形函数。图形模式的初始化不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:<BR> void
far initgraph(int far *gdriver, int far
*gmode,char
*path);<BR> 其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见下表。<BR> 图形驱动程序由Turbo
C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、
VGA 图形适配器就调用驱动程序EGAVGA.BGI。 <BR>图形驱动器、模式的符号常数及数值
<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR>图形驱动器(gdriver)
图形模式(gmode)<BR>───────────────────── 色调
分辨率<BR>符号常数 数值 符号常数
数值<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR>CGA 1
CGAC0 0 C0 320*200<BR>CGAC1 1 C1 320*200<BR>CGAC2
2 C2 320*200<BR>CGAC3 3 C3 320*200<BR>CGAHI 4 2色
640*200<BR>──────────────────────────────<BR>MCGA
2 MCGAC0 0 C0 320*200<BR>MCGAC1 1 C1
320*200<BR>MCGAC2 2 C2 320*200<BR>MCGAC3 3 C3
320*200<BR>MCGAMED 4 2色 640*200<BR>MCGAHI 5 2色
640*480<BR>──────────────────────────────<BR>EGA 3
EGALO 0 16色 640*200<BR>EGAHI 1 16色
640*350<BR>──────────────────────────────<BR>EGA64
4 EGA64LO 0 16色 640*200<BR>EGA64HI 1 4色
640*350<BR>──────────────────────────────<BR>EGAMON
5 EGAMONHI 0 2色
640*350<BR>──────────────────────────────<BR>IBM8514
6 IBM8514LO 0 256色 640*480<BR>IBM8514HI 1 256色
1024*768<BR>──────────────────────────────<BR>HERC
7 HERCMONOHI 0 2色
720*348<BR>──────────────────────────────<BR>ATT400
8 ATT400C0 0 C0 320*200<BR>ATT400C1 1 C1
320*200<BR>ATT400C2 2 C2 320*200<BR>ATT400C3 3 C3
320*200<BR>ATT400MED 4 2色 320*200<BR>ATT400HI 5 2色
320*200<BR>──────────────────────────────<BR>VGA 9
VGALO 0 16色 640*200<BR>VGAMED 1 16色
640*350<BR>VGAHI 2 16色
640*480<BR>──────────────────────────────<BR>PC3270
10 PC3270HI 0 2色
720*350<BR>──────────────────────────────<BR>DETECT
0
用于硬件测试<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR>使用图形初始化函数设置VGA高分辨率图形模式#include
<GRAPHICS.H><BR>int main()<BR>{<BR>int gdriver,
gmode;<BR>gdriver=VGA;<BR>gmode=VGAHI;<BR>initgraph(&gdriver,
&gmode, "c:\\caic\\bgi");<BR>bar3d(100, 100,
300, 250, 50, 1);
/*画一长方体*/<BR>getch();<BR>closegraph();<BR>return
0;<BR>}<BR> 有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo
C 提供了一个自动检测显示器硬件的函数,其调用格式为: void far
detectgraph(int *gdriver, *gmode);
其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化#include
<GRAPHICS.H><BR>int main()<BR>{<BR>int gdriver,
gmode;<BR>detectgraph(&gdriver, &gmode);
/*自动测试硬件*/<BR>printf("the graphics driver is %d,
mode is %d\n",<BR>gdriver,gmode);
/*输出测试结果*/<BR>getch();<BR>initgraph(&gdriver,
&gmode, "c:\\caic\\bgi");<BR>/*
根据测试结果初始化图形*/<BR>bar3d(10, 10, 130, 250, 20,
1);<BR>getch();<BR>closegraph();<BR>return
0;<BR>}<BR> 上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo
C提供了一种更简单的方法, 即用driver=DETECT
语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:<BR>#include
<GRAPHICS.H><BR>int main()<BR>{<BR>int
gdriver=DETECT, gmode;<BR>initgraph(&gdriver,
&gmode, "c:\\caic\\bgi");<BR>bar3d(50, 50,
150, 30, 50,
1);<BR>getch();<BR>closegraph();<BR>return
0;<BR>}<BR> 另外,Turbo C
提供了退出图形状态的函数closegraph(),其调用格式为: void far
closegraph(void); 调用该函数后可退出图形状态而进入文本方式( Turbo C
默认方式),并释放用于保存图形驱动程序和字体的系统内存。独立图形运行程序的建立Turbo
C对于用initgraph()函数直接进行的图形初始化程序,在编译和链接时并没有将相应的驱动程序(*.BGI)
装入到执行程序,当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char
*path中所规定的路径中去找相应的驱动程序。若没有驱动程序,则在C:\TC中去找,如C:\TC中仍没有或TC不存在,将会出现错误:<BR>BGI
Error: Graphics not initialized (use 'initgraph')
<BR> 因此,为了使用方便,应该建立一个不需要驱动程序就能独立运行的可执行图形程序,Turbo
C中规定用下述步骤(这里以EGA、VGA显示器为例):<BR> 1.
在C:\TC子目录下输入命令:BGIOBJ
EGAVGA此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。<BR> 2.
在C:\TC子目录下输入命令:TLIB
LIB\GRAPHICS.LIB+EGAVGA此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文<BR>件中。<BR> 3.
在程序中initgraph()函数调用之前加上一句:
registerbgidriver(EGAVGA_driver):该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。<BR> 经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。假设已作了前两个步骤,若再向例6中加registerbgidriver()函数则变成:<BR>#include<STDIO.H><BR>#include<GRAPHICS.H><BR>int
main()<BR>{<BR>int
gdriver=DETECT,gmode;<BR>registerbgidriver(EGAVGA_driver);<BR>/*建立独立图形运行程序
*/<BR>initgraph(gdriver,
gmode,"c:\\caic\\bgi");<BR>bar3d(50,50,250,150,20,1);<BR>getch();<BR>closegraph();<BR>return
0;<BR>}<BR> 上例编译链接后产生的执行程序可独立运行。如不初始化成EGA或CGA分辨率,而想初始化为CGA分辨率,
则只需要将上述步骤中有EGAVGA的地方用CGA代替即可。屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。<BR> 在Turbo
C中分别用下面两个函数。 设置背景色: void far setbkcolor(int
color); 设置作图色: void far setcolor(int color);
其中color
为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见下表所示。<BR>有关屏幕颜色的符号常数表:<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR>符号常数
数值 含义 符号常数 数值
含义<BR>──────────────────────────────<BR>BLACK 0 黑色
DARKGRAY 8 深灰<BR>BLUE 1 兰色 LIGHTBLUE 9 深兰<BR>GREEN
2 绿色 LIGHTGREEN 10 淡绿<BR>CYAN 3 青色 LIGHTCYAN 11
淡青<BR>RED 4 红色 LIGHTRED 12 淡红<BR>MAGENTA 5 洋红
LIGHTMAGENTA 13 淡洋红<BR>BROWN 6 棕色 YELLOW 14
黄色<BR>LIGHTGRAY 7 淡灰 WHITE 15
白色<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR> 对于CGA适配器,背景色可以为表3中16种颜色的一种,但前景色<BR>依赖于不同的调色板。共有四种调色板,每种调色板上有四种颜色可<BR>供选择。不同调色板所对应的原色见下表:</P>
<P>CGA调色板与颜色值表:<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<BR>调色板
颜色值<BR>──────────────────────────────<BR>符号常数 数值 0
1 2 3<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR>C0 0 背景
绿 红 黄<BR>C1 1 背景 青 洋红 白<BR>C2 2 背景 淡绿 淡红 黄<BR>C3 3
背景 淡青 淡洋红
白<BR>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<BR> 清除图形屏幕内容使用清屏函数,其调用格式如下:
voide far cleardevice(void);
有关颜色设置、清屏函数的使用请看例8。#include<STDIO.H><BR>#include<GRAPHICS.H><BR>int
main()<BR>{<BR>int gdriver, gmode,
i;<BR>gdriver=DETECT;<BR>initgraph(&gdriver,
&gmode, "c:\\caic\\bgi");
/*图形初始化*/<BR>setbkcolor(0);
/*设置图形背景*/<BR>cleardevice();<BR>for(i=0; i<=15;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -