C语言图形编程.docx
- 文档编号:7845671
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:21
- 大小:53.24KB
C语言图形编程.docx
《C语言图形编程.docx》由会员分享,可在线阅读,更多相关《C语言图形编程.docx(21页珍藏版)》请在冰豆网上搜索。
C语言图形编程
C的图形编程
一、屏幕显示模式
1、文本模式
在文本模式又称字符模式。
在此模式下整个屏幕被划分成(25行,80列),共25*80个文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。
坐标原点在屏幕的左上角。
如下图所示:
在
(1)定义一个文本窗口
voidwindow(intleft,inttop,intright,intbottom);
如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:
window(20,5,50,25);
(2) 文本窗口颜色的设置
voidtextbackground(intcolor);//设置背景颜色:
voidtextcolor(intcolor);//设置字符颜色:
有关颜色的定义见表1。
(3)光标定位
voidgotoxy(intx,inty);
(4)清屏
voidclrscr(void);
(5)其它函数
一、窗口内文本的输出函数
intcprintf("<格式化字符串>",<变量表>);
intcputs(char*string);
intputch(intch);
cprintf()函数输出一个格式化的字符串或数值到窗口中。
它与printf()函数的用法完全一样,区别在于cprintf()函数的输出受窗口限制,而printf()函数的输出为整个屏幕。
cputs()函数输出一个字符串到屏幕上,它与puts()函数用法完全一样, 只是受窗口大小的限制。
putch()函数输出一个字符到窗口内。
二、窗口内文本的输入函数
intgetche(void);
getche()函数从键盘上获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。
例1:
下面这个程序使用了关于窗口大小的定义、颜色的设置等函数,在一个屏幕上不同位置定义了7个窗口,其背景色分别使用了7种不同的颜色。
#include
#include
voidmain(void)
{inti;
char*c[]={"BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTGRAY"};
textbackground(0);/*设置屏幕背景色*/
clrscr();/*清除文本屏幕*/
cputs(c[0]);
for(i=1;i<8;i++)
{window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/
textbackground(i);/*定义窗口背景色*/
clrscr();
cputs(c[i]);/*清除窗口*/
}
getch();
}
表1.有关颜色的定义
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义 字符或背景
───────────────────────────
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 白 只用于字符
BLINK 128 闪烁 只用于字符
━━━━━━━━━━━━━━━━━━━━━━━━━━━
例2:
捕获键盘按键。
键盘扫描码:
每个键都有一个两字节的扫描码,其格式:
#defineESC0x011B
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineENTER0x1C0D
在头文件
intbioskey(intmode);//此函数声明于bios.h
mode为1时,如有按键盘,则记录其扫描码至缓冲区,并返回其扫描码;无按键则返回0;不清除缓冲区。
mode为0时,从键盘缓冲区取出按键,并清除缓冲区。
若没有的话,则等待。
如:
ESC
UP
DOWN
LEFT
RIGHT
F1
F2
A
Z
a
z
#include
#inlcude
unionkeyTest
{
intc;
charch[2];
};
voidmain(void)
{unionkeyTestk;
while
(1)
{
while(bioskey
(1)==0);
/*function1returns0untilakeyispressed*/
k.c=bioskey(0);
/*function0returnsthekeythatiswaiting*/
printf(“High=[%d],Low=[%d]\n”,k.c,k.ch[1],k.ch[0]);
}
}
例3:
C提供的随机函数:
voidrandomize(); //初始化随机数发生器
intrandom(intubound);//返回范围在0到ubound-1之间的一个随机整数。
2、图形模式
不同的显示器适配器(显卡)有不同的图形分辨率。
即是同一显卡,在不同模式下也有不同分辨率。
因此,在屏幕作图之前,必须根据显卡种类将显示器设置成为某种图形模式。
VGALO 0 16色 640*200
VGA VGAMED 1 16色 640*350
VGAHI 2 16色 640*480
(1)图形模式的初始化
在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidinitgraph(int*gdriver,int*gmode,char*path);
表2.图形驱动器、模式的符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(gdriver) 图形模式(gmode)
─────────── ─────────── 色调 分辨率
符号常数 数值 符号常数 数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA 1 CGAC0 0 C0 320*200
CGAC1 1 C1 320*200
CGAC2 2 C2 320*200
CGAC3 3 C3 320*200
CGAHI 4 2色 640*200
───────────────────────────────────
MCGA 2 MCGAC0 0 C0 320*200
MCGAC1 1 C1 320*200
MCGAC2 2 C2 320*200
MCGAC3 3 C3 320*200
MCGAMED 4 2色 640*200
MCGAHI 5 2色 640*480
───────────────────────────────────
EGA 3 EGALO 0 16色 640*200
EGAHI 1 16色 640*350
───────────────────────────────────
EGA64 4 EGA64LO 0 16色 640*200
EGA64HI 1 4色 640*350
───────────────────────────────────
EGAMON 5 EGAMONHI 0 2色 640*350
───────────────────────────────────
IBM8514 6 IBM8514LO 0 256色 640*480
IBM8514HI 1 256色1024*768
───────────────────────────────────
HERC 7 HERCMONOHI 0 2色 720*348
───────────────────────────────────
ATT400 8 ATT400C0 0 C0 320*200
ATT400C1 1 C1 320*200
ATT400C2 2 C2 320*200
ATT400C3 3 C3 320*200
ATT400MED 4 2色 320*200
ATT400HI 5 2色 320*200
───────────────────────────────────
VGA 9 VGALO 0 16色 640*200
VGAMED 1 16色 640*350
VGAHI 2 16色 640*480
───────────────────────────────────
PC3270 10 PC3270HI 0 2色 720*350
───────────────────────────────────
DETECT 0 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例子1:
使用图形初始化函数设置VGA高分辨率图形模式
#include
intmain()
{
intgdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"c:
\\tc");//图形模式初始化
bar3d(100,100,300,250,50,1); /*画一长方体*/
getch();
closegraph();//关闭图形模式,返回默认文本模式
return0;
}
例子2:
自动进行硬件测试后进行图形初始化
有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,TurboC提供了一个自动检测显示器硬件后进行图形初始化的方法。
即用gdriver=DETECT语句后再跟initgraph()函数就行了。
例3:
#include
intmain()
{intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,c:
\\tc");
bar3d(50,50,150,30,1);
getch();
closegraph();
return0;
}
(2)退出图形状态
TurboC提供了函数closegraph(),其调用格式为:
voidfarclosegraph(void);
调用该函数后可退出图形状态而进入文本方式(TurboC默认方式),并释放用于保存图形驱动程序和字体的系统内存。
(3)屏幕颜色的设置和清屏函数
对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。
在TurboC中分别用下面两个函数。
voidfarsetbkcolor(intcolor);//设置背景色:
voidfarsetcolor(intcolor);//设置作图色:
其中color为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见下表所示。
表3有关屏幕颜色的符号常数表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义 符号常数 数值 含义
───────────────────────────────────
BLACK 0 黑色 DARKGRAY 8 深灰
BLUE 1 兰色 LIGHTBLUE 9 深兰
GREEN 2 绿色 LIGHTGREEN 10 淡绿
CYAN 3 青色 LIGHTCYAN 11 淡青
RED 4 红色 LIGHTRED 12 淡红
MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红
BROWN 6 棕色 YELLOW 14 黄色
LIGHTGRAY 7 淡灰 WHITE 15 白色
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
清除图形屏幕内容使用清屏函数,其调用格式如下:
voidefarcleardevice(void);
有关颜色设置、清屏函数的使用。
例4:
#include
#include
intmain()
{ intgdriver,gmode,i;
gdriver=DETECT;
initgraph(&gdriver,&gmode","");
setbkcolor(0);
cleardevice();
for(i=0;i<=15;i++)
{ setcolor(i);
circle(320,240,20+i*10);
delay(100);
}
for(i=0;i<=15;i++)
{
setbkcolor(i);
cleardevice();
circle(320,240,20+i*10);
delay(100);
}
closegraph();
return0;
}
(4).基本图形函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
本节对这些函数
作一全面的介绍。
一、画点
1.画点函数
voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象素画一个按color所确定颜色的点。
对于颜色color的值可从表3中获得而对x,y是指图形象元的坐标。
对VGA适配器, 它的最高分辨率为640x480,屏幕的左上角坐标为(0,0),右下角坐标为(639,479), 关于点的另外一个函数是:
intfargetpixel(intx,inty);
它获得当前点(x,y)的颜色值。
2.有关坐标位置的函数
intfargetmaxx(void); //返回x轴的最大值。
intfargetmaxy(void);//返回y轴的最大值。
intfargetx(void);//返回光标在x轴的位置。
voidfargety(void); //返回光标有y轴的位置。
voidfarmoveto(intx,inty);
移动光标到(x,y)点,虽不是画点,在移动过程中亦画点。
voidfarmoverel(intdx,intdy);
移动光标从当前位置(x,y)移动到(x+dx,y+dy)的位置,移动过程中不画点。
二、画线
1.画线函数
TURBOC提供了一系列画线函数,下面分别叙述:
voidfarline(intx0,inty0,intx1,inty1);
画一条从点(x0,y0)到(x1,y1)的直线。
voidfarlineto(intx,inty);
画一从当前光标到点(x,y)的直线。
voidfarlinerel(intdx,intdy);
画一条从当前光标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。
voidfarcircle(intx,inty,in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 图形 编程