C语言项目实践指导书(图形程序设计)

更新时间:2024-06-16 10:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

大连东软信息学院 电子工程系 2014级 本科

C语言项目实践指导书

(图形程序设计)

2015年8月

大连东软信息学院

Dalian Neusoft University of Information

目录

0 C语言图形程序开发环境(4学时) ......................................................................................- 2 - 1 图形模式的初始化 ...................................................................................................................- 2 - 2 独立图形运行程序的建立 .......................................................................................................- 6 - 3 屏幕颜色的设置和清屏函数(4学时) ................................................................................- 7 - 4 基本图形函数(4学时) ..................................................................................................... - 10 - 5 封闭图形的填充(4学时) ................................................................................................. - 16 - 6 有关图形窗口和图形屏幕操作函数(4学时) ................................................................. - 21 - 7 图形模式下的文本输出(4学时) ..................................................................................... - 24 - 8 使用gotoxy & window函数(2学时) .............................................................................. - 30 - 9 按键(4学时) ..................................................................................................................... - 32 - 10 TC向VC控制台程序移植(2学时) ................................................................................ - 34 - 11 菜单制作(6学时) ........................................................................................................... - 40 - 12 综合程序设计(12学时) ................................................................................................. - 40 - 补充1 声音............................................................................................................................... - 41 - 补充2 鼠标............................................................................................................................... - 41 - 参考文献.................................................................................................................................... - 44 -

- 1 -

C语言项目实践(图形程序设计)分为14个部分(节),主要实践内容包括图形模式的初始化、基本图形功能、图形窗口以及图形模式下的文本输出等图形函数的使用,以及按键处理、菜单制作、TC向VC控制台程序移植、声音和鼠标的添加等。学生通过编辑、编译、调试、运行项目报告中的原代码和回答相关的问题,掌握C语言图形应用程序中常用函数的作用与使用方法,并综合运用《C语言程序设计》和《数据结构》课程所学知识,设计、实现具有创新功能的程序。成果物是一个综合性较好的图形应用程序和项目报告。

项目报告中除了第2节,其它各节都有程序练习和问题,由学生按要求填写完成。

0C语言图形程序开发环境(4学时)

C语言项目实践(图形程序设计)的开发环境是TurboC。Turbo C集成开发环境是由Borland公司开发的一套 C 语言开发工具,它集成了程序编辑、调试、链接等多种功能。关于Turbo C 2.0的安装与使用参考“Turbo C 2.0集成开发环境.pdf”文档。

Turbo C提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h中。使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。

如果想用C语言在VC++编译器中编辑图形界面程序,需安装VC++和EasyX。 EasyX是基于C++开发的,与TC的图形库一定程度上保持一致。关于VC++和EasyX 图形库的安装将在第10节“TC向VC控制台程序移植”部分进行说明。

1 图形模式的初始化

不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列, 25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:

- 2 -

void far initgraph(int far *gdriver, int far *gmode, char *path);

其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径,如:\或\等。有关图形驱动器、图形模式的符号常数及对应的分辨率见表1。

图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、VGA图形适配器就调用驱动程序EGAVGA.BGI。

表1.1图形驱动器、模式的符号常数及数值

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 图形驱动器(gdriver)

图形模式(gmode)

色调 分辨率

─────────────── 符号常数

数值

─────────────

符号常数

数值

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CGA

1

CGAC0 CGAC1 CGAC2 CGAC3

0 1 2 3 4

C0 320*200 C1 320*200 C2 320*200 C3 320*200 2色 640*200

CGAHI

───────────────────────────────────────────────────

MCGA

2

MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMED MCGAHI

0 1 2 3 4 5

C0 320*200 C1 320*200 C2 320*200 C3 320*200 2色 640*200 2色 640*480

───────────────────────────────────────────────────

EGA

3

EGALO EGAHI

0 1

16色 640*200 16色 640*350

───────────────────────────────────────────────────

EGA64

4

EGA64LO EGA64HI

0 1

16色 640*200 4色 640*350

───────────────────────────────────────────────────

EGAMON

5

EGAMONHI

0

2色 640*350

───────────────────────────────────────────────────

IBM8514

6

IBM8514LO IBM8514HI

0 1

256色640*480 256色1024*768

───────────────────────────────────────────────────

- 3 -

HERC 7 HERCMONOHI 0 2色 720*348

───────────────────────────────────────────────────

ATT400

8

ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI

0 1 2 3 4 5

C0 320*200 C1 320*200 C2 320*200 C3 320*200 2色 320*200 2色 320*200

───────────────────────────────────────────────────

VGA

9

VGALO VGAMED VGAHI

0 1 2

16色 640*200 16色 640*350 16色 640*480

───────────────────────────────────────────────────

PC3270

10

PC3270HI

0

2色 720*350

───────────────────────────────────────────────────

DETECT

0

用于硬件测试

例1.1:使用图形初始化函数设置VGA高分辨率图形模式。

#include

int main() { int gdriver, gmode;

gdriver=VGA; gmode=VGAHI;

initgraph(&gdriver, &gmode, \

bar3d(100, 100, 300, 250, 50, 1);/*画一长方体*/

getch();

closegraph(); return 0; }

有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C提供了一个自动检测显示器硬件的函数,其调用格式为:

void detectgraph(int *gdriver, *gmode);

例1.2:自动进行硬件测试后进行图形初始化。

#include int main() {

- 4 -

int gdriver, gmode;

detectgraph(&gdriver, &gmode);/*自动测试硬件*/

printf(\输出测试结果*/ getch();

initgraph(&gdriver, &gmode, \根据测试结果初始化图形*/ bar3d(10, 10, 130, 250, 20, 1); getch(); closegraph(); return 0; }

上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法,即用gdriver= DETECT语句后再跟initgraph()函数就行了。采用这种方法后, 上例可改为:

例1.3:

#include int main() {

int gdriver=DETECT, gmode; initgraph(&gdriver, &gmode, \ bar3d(50, 50, 150, 30, 1); getch(); closegraph(); return 0; }

另外,Turbo C提供了退出图形状态的函数closegraph(), 其调用格式为: void far closegraph(void);

调用该函数后可退出图形状态而进入文本方式(Turbo C 默认方式),并释放用于保存图形驱动程序和字体的系统内存。

- 5 -

程序练习1.1:编辑例1.3程序,存为.c文件,在TC环境下编译、调试、运行,运行结果如图1.1所示。

图1.1初始化图形程序运行结果截图

问题1.1:写出初始化图形程序的必要步骤。

问题1.2:关于图形程序的初始化,你遇到的问题和解决方法是什么?

问题1.3:修改代码snake.c,进行代码规范性练习。 修改后规范的代码:

2独立图形运行程序的建立

Turbo C对于用initgraph()函数直接进行的图形初始化程序,在编译和链接时并没有将相应的驱动程序(*.BGI)装入到执行程序,当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char *path中所规定的路径中去找相应的驱动程序。若没有驱动程序,则在C:\\TC中去找, 如C:\\TC中仍没有或TC不存在,将会出现错误:

BGI Error: Graphics not initialized (use 'initgraph')

因此,为了使用方便, 应该建立一个不需要驱动程序就能独立运行的可执行图形程序,Turbo C中规定用下述步骤(这里以EGA、VGA显示器为例):

(1)在C:\\TC子目录下输入命令:BGIOBJ EGAVGA

此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。 (2)在C:\\TC子目录下输入命令:TLIB LIB\\GRAPHICS.LIB+EGAVGA 此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。 (3)在程序中initgraph()函数调用之前加上一句:

- 6 -

registerbgidriver(EGAVGA_driver) ;

该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。

经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。 假设已作了前两个步骤,若再向例3中加 registerbgidriver()函数则变成: 例2.1:

#include #include int main() {

int gdriver=DETECT,gmode;

registerbgidriver(EGAVGA_driver) ;/ *建立独立图形运行程序 */ initgraph( gdriver, gmode,\ bar3d(50,50,250,150,20,1); getch(); closegraph(); return 0; }

上例编译链接后产生的执行程序可独立运行。

如不初始化成EGA或CGA分辨率,而想初始化为CGA分辨率,则只需要将上述步骤中有EGAVGA的地方用CGA代替即可。

3屏幕颜色的设置和清屏函数(4学时)

对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数。

设置背景色:void far setbkcolor( int color); 设置作图色:void far setcolor(int color);

其中color 为图形方式下颜色的规定数值,对EGA, VGA显示器适配器,有关颜色的符号常数及数值如表3.1所示。

- 7 -

表3.1 有关屏幕颜色的符号常数表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数

数值

含义

符号常数

数值

含义

───────────────────────────────────────────────────────────

BLACK BLUE

GREEN CYAN RED

0 1

黑色 兰色 绿色 青色 红色 洋红 棕色 淡灰

DARKGRAY

8

深灰 深兰 淡绿 淡青 淡红 淡洋红 黄色 白色

LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED

9 10 11 12

2 3 4 5 6

MAGENTA BROWN

LIGHTMAGENTA YELLOW WHITE

13 14 15

LIGHTGRAY 7

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

对于CGA适配器,背景色可以为表3中16种颜色的一种,但前景色依赖于不同的调色板。共有四种调色板,每种调色板上有四种颜色可供选择。不同调色板所对应的原色见表3.2。

表3.2 CGA调色板与颜色值表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

调色板

颜色值

───────────────── ───────────────────────── 符号常数

数值

0

1

2

3

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ C0

C1 C2 C3

0 1 2 3

背景 背景 背景 背景

绿 青

黄 白 黄 白

洋红 淡红 淡洋红

淡绿 淡青

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

清除图形屏幕内容使用清屏函数,其调用格式如下: voidfar cleardevice(void);

有关颜色设置、清屏函数的使用请看例5。 例3.1:

#include

#include int main() {

int gdriver, gmode, i;

- 8 -

gdriver=DETECT;

registerbgidriver(EGAVGA_DRIVER);/*建立独立图形运行程序*/ initgraph(&gdriver, &gmode, \图形初始化*/ setbkcolor(0); /*设置图形背景*/ cleardevice(); for(i=0; i<=15; i++) {

setcolor(i); /*设置不同作图色*/

circle(320, 240, 20+i*10);/*画半径不同的圆*/ delay(100);/*延迟100毫秒*/ }

for(i=0; i<=15; i++) {

setbkcolor(i);/*设置不同背景色*/ cleardevice();

circle(320, 240, 20+i*10); delay(100); }

closegraph(); return 0; }

另外,Turbo C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。 int far getcolor(void); 返回现行作图颜色值。 int far getmaxcolor(void); 返回最高可用的颜色值。

程序练习3.1:编辑例3.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果如图3.1 – 3.2所示。

图3.1 屏幕颜色设置与清屏程序运行结果截图1

- 9 -

图3.2 屏幕颜色设置与清屏程序运行结果截图2 问题3.1:说明以上运行结果。 问题3.2:按照示例填写表3.3。 表3.3 屏幕颜色设置于清屏等函数表 函数名称 函数功能及返回值 清屏函数,返回值void 函数原型 void cleardevice() 包含的头文件 graphics.h 示例: cleardevice bar3d circle delay setcolor setbkcolor getcolor getbkcolor getmaxcolor 程序练习3.2:设计并实现一个独特的屏幕颜色设置程序。 程序功能说明: 代码: 运行结果: 4基本图形函数(4学时)

基本图形函数包括画点、线以及其它一些基本图形的函数。 一、画点 1. 画点函数

void far putpixel(int x, int y, int color);

- 10 -

该函数表示有指定的象元画一个按color所确定颜色的点。对于颜色color的值可从表3.1中获得,x, y是指图形象元的坐标。

在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480 为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。Turbo C 的图形函数都是相对于图形屏幕坐标,即象元来说的。

关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 2. 有关坐标位置的函数 int far getmaxx(void); 返回x轴的最大值。 int far getmaxy(void); 返回y轴的最大值。 int far getx(void); 返回游标在x轴的位置。 void far gety(void); 返回游标有y轴的位置。 void far moveto(int x, int y);

移动游标到(x, y)点,不是画点,在移动过程中亦画点。 void far moverel(int dx, int dy);

移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。 二、画线 1. 画线函数

Turbo C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。 void far lineto(int x, int y);

- 11 -

画一作从现行游标到点到(x, y)的直线。 void far linerel(int dx, int dy);

画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。 void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。

void far arc(int x, int y, int stangle, int endangle, int radius);

以(x, y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在Turbo C中规定x轴正向为0度, 逆时针方向旋转一周,依次为90, 180, 270和360度(其它有关函数也按此规定, 不再重述)。

void ellipse(int x, int y, int stangle, int endangle, int xradius,int yradius); 以(x, y)为中心,xradius, yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0, endangle=360时,画出一个完整的椭圆。

void far rectangle(int x1, int y1, int x2, inty2);

以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints);

画一个顶点数为numpoints, 各顶点坐标由polypoints 给出的多边形。 polypoints整型数组必须至少有2倍顶点数个元素。每一个顶点的坐标都定义为x,y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。

例4.1:用drawpoly()函数画箭头。 #include

#include int main() {

int gdriver, gmode, i;

int arw[16]={200, 102, 300, 102, 300, 107, 330,100, 300, 93, 300, 98, 200, 98, 200, 102};

- 12 -

gdriver=DETECT;

registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice();

setcolor(12); /*设置作图颜色*/ drawpoly(8, arw); /*画一箭头*/ getch(); closegraph(); return 0; }

2. 设定线型函数

在没有对线的特性进行设定之前, Turbo C用其默认值, 即一点宽的实线,但Turbo C也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择: 一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。 void far setlinestyle(int linestyle, unsigned upattern, intthickness);

该函数用来设置线的有关信息,其中linestyle是线形状的规定,见表4.1,thickness是线的宽度,见表4.2。

表4.1 有关线的形状(linestyle)

━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义 ───────────────────────── SOLID_LINE CENTER_LINE

0 实线 2 中心线 3 点画线 4 用户定义线

DOTTED_LINE 1 点线 DASHED_LINE USERBIT_LINE

━━━━━━━━━━━━━━━━━━━━━━━━━

表4.2 有关线宽(thickness)

━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数

- 13 -

数值 含义

───────────────────────── NORM_WIDTH THIC_WIDTH

1 一点宽 3 三点宽

━━━━━━━━━━━━━━━━━━━━━━━━━

对于upattern, 只有linestyle选USERBIT_LINE 时才有意义( 选其它线型,uppattern取0即可)。uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。

void far getlinesettings(struct linesettingstype far *lineinfo);

该函数将有关线的信息存放到由lineinfo 指向的结构中,linesettingstype的结构如下:

struct linesettingstype{

int linestyle; unsigned upattern; int thickness; }

下面两句程序可以读出当前线的特性: struct linesettingstype *info; getlinesettings(info);

void far setwritemode(int mode);

该函数规定画线的方式。如果mode=0, 则表示画线时将所画位置的原来信息覆盖了(这是Turbo C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。

例4.2:有关线型设定和画线函数的例子。 #include

#include int main() {

int gdriver, gmode, i; gdriver=DETECT;

- 14 -

registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice(); setcolor(GREEN); circle(320, 240, 98); setlinestyle(0, 0, 3); /*设置三点宽实线*/ setcolor(2); rectangle(220, 140, 420, 340); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1); /*设置一点宽用户定义线*/ line(220, 240, 420, 240); line(320, 140, 320, 340); getch(); closegraph(); return 0; } 程序练习4.1:编辑例4.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。 程序练习4.2:编辑例4.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。 问题4.1:在表4.3中填写10个以上画点、画线(直线、圆、矩形)和线型设定的函数。 表4.3 基本图形函数表 函数名称

函数功能及返回值 - 15 -

函数原型 包含的头文件

程序练习4.3:设计并实现一个独特的图形绘制程序。 程序功能说明: 代码: 运行结果: 5封闭图形的填充(4学时)

填充就是用规定的颜色和图模填满一个封闭图形。 一、先画轮廓再填充

Turbo C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时, Turbo C以默认方式填充。

void far bar(int x1, int y1, int x2, int y2);

确定一个以(x1, y1)为左上角, (x2, y2)为右下角的矩形窗口, 再按规定图模和颜色填充。

说明:此函数不画出边框,所以填充色为边框。

void far bar3d(int x1, int y1, int x2, int y2, int depth, inttopflag);

当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶, 实际上很少这样使用。

说明: bar3d()函数中, 长方体第三维的方向不随任何参数而变, 即始终为45度的方向。

void far pieslice(int x, int y, int stangle, int endangle, intradius);

- 16 -

画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0, endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。

void far sector(int x, int y, int stanle, intendangle, intxradius, int yradius); 画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。 二、设定填充方式

Turbo C有四个与填充方式有关的函数: void far setfillstyle(int pattern, int color);

color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的。符号常数如表5.1所示。

表5.1关于填充式样pattern的规定

━━━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 EMPTY_FILL SOLID_FILL LINE_FILL

数值 含义 0 以背景颜色填充 1 以实填充 2 以直线填充 3 以斜线填充(阴影线) 4 以粗斜线填充(粗阴影线) 5 以粗反斜线填充(粗阴影线) 6 以反斜线填充(阴影线) 7 以直方网格填充 8 以斜网格填充 10 以稀疏点填充 11 以密集点填充 12 以用户定义式样填充

───────────────────────────

LTSLASH_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HATCH_FILL

XHATCH_FILL WIDE_DOT_FILL CLOSE_DOS_FILL USER_FILL

INTTERLEAVE_FILL 9 以间隔点填充

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。

void far setfillpattern(char * upattern,int color);

设置用户定义的填充图模的颜色以供对封闭图形填充。

- 17 -

其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。

每个字节的8位二进制数表示水平8点, 8个字节表示8行, 然后以此为模型向个封闭区域填充。

void far getfillpattern(char * upattern);

该函数将用户定义的填充图模存入upattern指针指向的内存区域。 void far getfillsetings(struct fillsettingstype far * fillinfo);

获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype 结构定义如下:

struct fillsettingstype{

int pattern; /* 现行填充模式 * / int color; /* 现行填充模式 * / };

例5.1:图形填充图模的颜色的选择。 #include

main(){

char str[8]={10,20,30,40,50,60,70,80}; /*用户定义图模*/ int gdriver,gmode,i;

struct fillsettingstype save; /*定义一个用来存储填充信息的结构变量*/ gdriver=DETECT;

initgraph(&gdriver,&gmode,\ setbkcolor(BLUE); cleardevice(); for(i=0;i<13;i++) {

setcolor(i+3);

setfillstyle(i,2+i); /* 设置填充类型 * bar(100,150,200,50); /*画矩形并填充*/ bar3d(300,100,500,200,70,1); /* 画长方体并填充*/

- 18 -

pieslice(200, 300, 90, 180, 90);/*画扇形并填充*/ sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/ delay(1000); /*延时1秒*/ }

cleardevice(); setcolor(14);

setfillpattern(str, RED); bar(100,150,200,50); bar3d(300,100,500,200,70,0); pieslice(200,300,0,360,90); sector(500,300,0,360,100,50); getch();

getfillsettings(&save); /*获得用户定义的填充模式信息*/ closegraph(); clrscr();

printf(\ save.pattern, save.color); /*输出目前填充图模和颜色值*/ getch(); }

以上程序运行结束后, 在屏幕上显示出现行填充图模和颜色的常数值。 三、任意封闭图形的填充

截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此, Turbo C 提供了一个可对任意封闭图形填充的函数,其调用格式如下:

void far floodfill(int x, int y, int border);

其中: x, y为封闭图形内的任意一点。border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用规定的颜色和图模填满整个封闭图形。

注意:

1. 如果x或y取在边界上, 则不进行填充。

- 19 -

2. 如果不是封闭图形则填充会从没有封闭的地方溢出去, 填满其它地方。 3. 如果x或y在图形外面, 则填充封闭图形外的屏幕区域。

4. 由border指定的颜色值必须与图形轮廓的颜色值相同,但填充色可选任意颜色。

例5.2:填充bar3d()所画长方体中其它两个未填充的面。

#include #include main() {

int gdriver, gmode; struct fillsettingstype save; gdriver=DETECT;

initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice(); setcolor(LIGHTRED); setlinestyle(0,0,3);

setfillstyle(1,14); /*设置填充方式*/

bar3d(100,200,400,350,200,1); /*画长方体并填充*/ floodfill(450,300,LIGHTRED); /*填充长方体另外两个面*/ floodfill(250,150, LIGHTRED);

rectangle(450,400,500,450); /*画一矩形*/ floodfill(470,420, LIGHTRED); /*填充矩形*/ getch(); closegraph(); }

程序练习5.1:编辑例5.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

- 20 -

程序练习5.2:编辑例5.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

程序练习5.3:设计并实现一个独特的图形填充程序。 程序功能说明: 代码:

运行结果:

6有关图形窗口和图形屏幕操作函数(4学时)

一、图形窗口操作

象文本方式下可以设定屏幕窗口一样,图形方式下也可以在屏幕上某一区域设定窗口,只是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角(0,0)作为坐标原点,而且可为通过设置使窗口之外的区域为不可接触。

这样,所有的图形操作就被限定在窗口内进行。 void far setviewport(int xl,int yl,int x2, int y2,int clipflag);

设定一个以(xl,yl)象元点为左上角,(x2,y2)象元为右下角的图形窗口,其中x1,y1,x2,y2是相对于整个屏幕的坐标。若clipflag为非0, 则设定的图形以外部分不可接触,若clipflag为0, 则图形窗口以外可以接触。

void far clearviewport(void); 清除现行图形窗口的内容。

void far getviewsettings(struct viewporttype far * viewport);

获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport中,其中viewporttype的结构说明如下:

struct viewporttype{ int left, top, right, bottom; int cliplag;

- 21 -

}; 注明:

1. 窗口颜色的设置与前面讲过的屏幕颜色设置相同, 但屏幕背景色和窗口背景色只能是一种颜色, 如果窗口背景色改变, 整个屏幕的背景色也将改变这与文本窗口不同。

2. 可以在同一个屏幕上设置多个窗口, 但只能有一个现行窗口工作, 要对其它窗口操作, 通过将定义那个窗口的setviewport()函数再用一次即可。

3. 前面讲过图形屏幕操作的函数均适合于对窗口的操作。 二、屏幕操作

除了清屏函数以外, 关于屏幕操作还有以下函数: void far setactivepage(int pagenum); void far setvisualpage(int pagenum);

这两个函数只用于EGA,VGA 以及HERCULES图形适配器。setctivepage() 函数是为图形输出选择激活页。所谓激活页是指后续图形的输出被写到函数选定的pagenum页面, 该页面并不一定可见。setvisualpage()函数才使pagenum 所指定的页面变成可见页。页面从0开始(Turbo C默认页)。如果先用setactivepage()函数在不同页面上画出一幅幅图像,再用setvisualpage()函数交替显示,就可以实现一些动画的效果。

void far getimage(int xl,int yl, int x2,int y2, void far *mapbuf); void far putimage(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);

这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数imagesize()测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf 分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中,需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,其中getimage()函数中的参数op规定如何释放内存中图像。

关于这个参数的定义参见表6.1。

表6.1 putimage()函数中的op值

- 22 -

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 COPY_PUT XOR_PUT OR_PUT AND_PUT NOT_PUT

数值 0 1 2 3 4

含义

──────────────────────────────────────

复制

与屏幕图像异或的复制 与屏幕图像或后复制 与屏幕图像与后复制 复制反像的图形

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。

本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。 例6.1:程序模拟两个小球动态碰撞过程。 #include

#include int main() {

int i, gdriver, gmode, size; void *buf; gdriver=DETECT;

initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice(); setcolor(LIGHTRED); setlinestyle(0,0,1); setfillstyle(1, 10); circle(100, 200, 30); floodfill(100, 200, 12);

size=imagesize(69, 169, 131, 231); buf=malloc(size);

getimage(69, 169, 131, 231,buf); putimage(500, 269, buf, COPY_PUT);

- 23 -

for(i=0; i<185; i++){

putimage(70+i, 170, buf, COPY_PUT); putimage(500-i, 170, buf, COPY_PUT); }

for(i=0;i<185; i++){

putimage(255-i, 170, buf, COPY_PUT); putimage(315+i, 170, buf, COPY_PUT); } getch(); closegraph(); }

程序练习6.1:编辑例6.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

问题6.1:说明程序是如何模拟两个小球动态碰撞的。

程序练习6.2:设计并实现一个独特的动画程序。 程序功能说明: 代码:

运行结果:

7图形模式下的文本输出(4学时)

在图形模式下,只能用标准输出函数, 如printf(), puts(), putchar() 函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。

Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。 一、文本输出函数

- 24 -

void far outtext(char far *textstring);

该函数输出字符串指针textstring所指的文本在现行位置。 void far outtextxy(int x, int y, char far *textstring);

该函数输出字符串指针textstring所指的文本在规定的(x, y)位置。 其中x和y为象元坐标。

这两个函数都是输出字符串, 但经常会遇到输出数值或其它类型的数据,此时就必须使用格式化输出函数sprintf()。

sprintf()函数的调用格式为:

int sprintf(char *str, char *format, variable-list);

它与printf()函数不同之处是将按格式化规定的内容写入str 指向的字符串中,返回值等于写入的字符个数。

例如:

sprintf(s, \

这里s应是字符串指针或数组,mark为整型变量。 二、有关文本字体、字型和输出方式的设置

有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。

void far settexjustify(int horiz, int vert); 该函数用于定位输出字符串。

对使用outtextxy(int x, int y, char far *str textstring) 函数所输出的字符串,其中哪个点对应于定位坐标(x, y)在Turbo C2.0中是有规定的。如果把一个字符串看成一个长方形的图形,在水平方向显示时, 字符串长方形按垂直方向可分为顶部,中部和底部三个位置,水平方向可分为左、中、右三个位置,两者结合就有9个位置。

settextjustify()函数的第一个参数horiz指出水平方向三个位置中的一个,第二个参数vert指出垂直方向三个位置中的一个,二者就确定了其中一个位置。当规定了这个位置后,用outtextxy()函数输出字符串时。字符串长方形的这个规定

- 25 -

位置就对准函数中的(x, y)位置。而对用outtext()函数输出字符串时,这个规定的位置就位于现行游标的位置。有关参数horiz和vert的取值参见表7.1。

表7.1 参数horiz和vert的取值

━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 LEFT_TEXT RIGHT_TEXT TOP_TEXT

数值 用于 0 水平 2 水平 0 垂直 2 垂直 1 水平或垂直

────────────────────────

BOTTOM_TEXT CENTER_TEXT

━━━━━━━━━━━━━━━━━━━━━━━━

void far settextstyle(int font, int direction, int charsize);

该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。Turbo C2.0对函数中各个参数的规定如表7.2 - 7.4所示:

表7.2 font的取值

━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 DEFAULT_FONT TRIPLEX_FONT SMALL_FONT

SANSSERIF_FONT GOTHIC_FONT

数值 含义

0 8*8点阵字(缺省值) 1 三倍笔划字体 2 小号笔划字体 3 无衬线笔划字体 4 黑体笔划字

────────────────────────

━━━━━━━━━━━━━━━━━━━━━━━━

表7.3 direction的取值

━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义 ──────────────────────── HORIZ_DIR 0 从左到右 VERT_DIR 1 从底到顶

━━━━━━━━━━━━━━━━━━━━━━━━

- 26 -

表7.4 charsize的取值

━━━━━━━━━━━━━━━━━━━━━━━━

符号常数或数值

含义

────────────────────────

1 8*8点阵 2 16*16点阵 3 24*24点阵 4 32*32点阵 5 40*40点阵 6 48*48点阵 7 56*56点阵 8 64*64点阵 9 72*72点阵 10 80*80点阵

USER_CHAR_SIZE=0 用户定义的字符大小 ━━━━━━━━━━━━━━━━━━━━━━━━

例7.1:有关图形屏幕下文本输出和字体字型设置函数的用法。 #include

#include int main() {

int i, gdriver, gmode; char s[30]; gdriver=DETECT;

initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice();

setviewport(100, 100, 540, 380, 1); /*定义一个图形窗口*/ setfillstyle(1, 2); /*绿色以实填充*/ setcolor(YELLOW); rectangle(0, 0, 439, 279); floodfill(50, 50, 14); setcolor(12);

- 27 -

settextstyle(1, 0, 8); /*三重笔划字体, 水平放大8倍*/ outtextxy(20, 20, \ setcolor(15);

settextstyle(3, 0, 5); /*无衬笔划字体, 水平放大5倍*/ outtextxy(120, 120, \ setcolor(14); settextstyle(2, 0, 8); i=620;

sprintf(s, \将数字转化为字符串*/ outtextxy(30, 200, s); /*指定位置输出字符串*/ setcolor(1); settextstyle(4, 0, 3); outtextxy(70, 240, s); getch(); closegraph(); return 0; }

三、用户对文本字符大小的设置

前面介绍的settextstyle()函数,可以设定图形方式下输出文本字符这字体和大小但对于笔划型字体(除8*8点阵字以个的字体),只能在水平和垂直方向以相同的放大倍数放大。为此Turbo C2.0又提供了另外一个setusercharsize() 函数,对笔划字体可以分别设置水平和垂直方向的放大倍数。该函数的调用格式为:

void far setusercharsize(int mulx, int divx, int muly, int divy);

该函数用来设置笔划型字和放大系数, 它只有在settextstyle( ) 函数中的charsize为0(或USER_CHAR_SIZE)时才起作用, 并且字体为函数settextstyle()规定的字体。调用函数setusercharsize()后,每个显示在屏幕上的字符都以其缺省大小乘以mulx/divx为输出字符宽,乘以muly/divy为输出字符高。该函数的用法见下例。

例7.2:

- 28 -

#include

#include int main() {

intgdriver, gmode; gdriver=DETECT;

initgraph(&gdriver, &gmode, \ setbkcolor(BLUE); cleardevice();

setfillstyle(1, 2); /*设置填充方式*/ setcolor(WHITE); /*设置白色作图*/ rectangle(100, 100, 330, 380);

floodfill(50, 50, 14); /*填充方框以外的区域*/ setcolor(12); /*作图色为淡红*/

settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/ outtextxy(120, 120, \

setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/ setcolor(15);

settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/ outtextxy(220, 220, \ setusercharsize(4, 1, 1, 1); settextstyle(3, 0, 0); outtextxy(180, 320, \ getch(); closegraph(); return 0; }

程序练习7.1:编辑例7.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

- 29 -

程序练习7.2:编辑例7.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

问题7.1:说明sprintf函数与printf函数的区别。

程序练习7.3:设计并实现一个独特的文本输出程序。 程序功能说明: 代码:

运行结果:

8 使用gotoxy&window函数(2学时)

gotoxy函数的功能是在文本窗口中设置光标,其函数原型是:void gotoxy(int x, int y); 使用方法如下:

例8.1:使用gotoxy定位函数。

#include void main(void) {

clrscr();/*清屏函数*/ textbackground(2); gotoxy(1, 5);/*定位函数*/

cprintf(\textbackground(3); gotoxy(20, 10);

cprintf(\

- 30 -

}

window函数的功能是定义活动文本模式窗口,其函数原型是:void window(int left, int top, int right, int bottom); 使用方法如下:

例8.2:使用window函数。

#include

#define SHOW_HIGH BLACK #define SHOW_NORMOL WHITE void main(void) {

textbackground(SHOW_HIGH);

textcolor(SHOW_NORMOL); clrscr(); gotoxy(1,3);

printf(\window(12,5,68,20);

textbackground(SHOW_HIGH);

clrscr();

window(1,5,80,7); }

textbackground(RED); clrscr();

程序练习8.1:编辑例8.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

程序练习8.2:编辑例8.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

问题8.1:说明以上程序中window函数的4个参数的含义。

- 31 -

9 按键(4学时)

按键相关函数说明如表9.1所示。

表9.1 按键函数

函数名 kbhit()(VC++6.0下为_kbhit()) bioskey() 函数功能及返回值 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 函数原型 int kbhit(void); 包含头文件 conio.h 检查是否有键按下,何键按下。cmd 操作取int 值:0 bioskey()返回按健的键值,该值是 2个bioskey(int 字节的整型数。若没有键按下,则该函数一直cmd) ; 等待,直到有键按下。当按下时,若返回值的低 8 位为非零,则表示为普通键,其值代表该键的 ASCII 码。若返回值的低 8 位为 0,则高8位表示为扩展的 ASCII码,表示按下的是特殊功能键。 1 bioskey()查询是否有键按下。若返回非 0 值,则表示有键按下,若为 0表示没键按下。 2 bioskey()将返回一些控制键是否被按过,按过的状态由该函数返回的低 8位的各位值来表示: 字节位 对应的 16 进制数 含义 0 0x01 右边的 shift 键被按下 1 0x02 左边的 shift 键被按下 2 0x04 Ctrl 键被按下 9 3 0x08 Alt 键被按下 4 0x10 Scroll Lock 已打开 5 0x20 Num Lock 已打开 6 0x40 Caps Lock 已打开 7 0x80 Inset 已打开 当某位为 l 时,表示相应的键已按,或相应的控制功能已有效,如选参数 cmd 为 2,若 key值为 0x09,则表示右边的 shift 键被按,同时又按了 Alt 键。 bios.h 例9.1:获取按键值。 #include #include void main(void) {

- 32 -

}

int key;

while ((key=bioskey(0)) != 0 && key!=0x11b)/*0x11b--ESC*/ { }

printf(\

例9.2:按键处理程序。

#include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b void main(void) { int key; while(1) {

while(!kbhit())/*没有按键按下*/ {

}

key=bioskey(0);/*接收按键*/ if(key==ESC)/*按ESC键退出*/

break;

printf(\delay(500);

else if(key==UP||key==0x1177)/*判断是否往相反的方向移动*/

printf(\

- 33 -

} }

else if(key==RIGHT||key==0x2064)

printf(\

else if(key==LEFT||key==0x1e61)

printf(\

else if(key==DOWN||key==0x1f73)

printf(\

程序练习9.1:编辑例9.1程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

问题9.1:解释程序运行结果数值的含义。

程序练习9.2:编辑例9.2程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

问题9.2:键盘上字母w,a,s,d对应的键值是什么?

程序练习9.3:设计并实现一个独特的按键处理程序。 程序功能说明: 代码:

运行结果:

10 TC向VC控制台程序移植(2学时)

- 34 -

很多图形类和游戏类的程序都是用Turbo C编写的。由于C 语言标准的不完善,这些程序大多数都不能直接在VC中编译。如果想用C语言在VC++编译器中编辑图形界面程序,需安装VC++和EasyX。EasyX是基于C++开发的,与TC的图形库一定程度上保持一致,但是不代表相同的代码可以同样地运行。下面以 VC 6.0 为范例(高版本的 VC大同小异),同时请安装最新版本的 EasyX 图形库。VC++安装参考“VC6.0安装.txt”文档,EasyX安装参考“EasyX安装.doc”文档。移植前注意:确保TC代码可以正确运行。将TC代码复制粘贴到VC 里面。注意,VC里面代码文件的扩展名要用 .cpp,不能用 .c。以下解决办法不分先后顺序,哪条对应就按照哪条修改。如果没找到对应的解决办法,可以暂时跳过,先改后面的。可能修改了第 3 条错误,第 2 条错误也就没有了。可能解决一个问题后,会出现 10 个新问题,这不要紧。细心、耐心一些,一个一个问题慢慢处理,并不复杂。

错误提示:fatal error C1083: Cannot open include file: 'bios.h': No such file or directory

解决办法:删掉 #include

错误提示:fatal error C1083: Cannot open include file: 'dos.h': No such file or directory

解决办法:删掉 #include

错误提示:error C2065: 'bioskey' : undeclared identifier

解决办法:根据 bioskey 的参数,适当的用 getch / kbhit 代替。由于 bioskey 参数较多,具体修改方法请参考:http://www.easyx.cn/skills/View.aspx?id=77 错误提示:error C2065: 'getch' : undeclared identifier

解决办法:由于TC2.0对于一些常用函数可以不引用头文件,这是不标准的写法,在之后的编译器都会报错。请增加相关的头文件引用: #include

错误提示:error C2065: 'registerbgidriver' : undeclared identifier 解决办法:删除错误行代码:registerbgidriver(xxx); 错误提示:error C2065: 'detectgraph' : undeclared identifier 解决办法:删除错误行代码:detectgraph(xxx);

- 35 -

错误提示:error C2065: 'restorecrtmode' : undeclared identifier 解决办法:删除错误行代码:restorecrtmode();

错误提示:error C2065: 'setviewport' : undeclared identifier

解决办法:请参考文章:http://www.easyx.cn/skills/View.aspx?id=53 ; 错误提示:error C2065: 'sleep' : undeclared identifier

解决办法:改用 Sleep,并将参数扩大 1000 倍。例如,原来是 sleep(3);,修改为 Sleep(3000);

错误提示:error C2065: 'delay' : undeclared identifier 解决办法:将 delay 修改为 Sleep 即可。

错误提示:error C2065: 'EGA' : undeclared identifier或:error C2065: 'EGAHI' : undeclared identifier

解决办法:通常在含有该错误的代码行会有类似定义:

int gdriver = EGA, gmode = EGAHI;

将这行代码删掉即可。这两个变量在之后会这样使用: initgraph(&gdriver, &gmode, \将这行代码修改为 initgraph(640, 480);

错误提示:error C2065: 'getmaxx' : undeclared identifier 解决办法:将 getmaxx() 修改为 getwidth();

错误提示:error C2065: 'getmaxy' : undeclared identifier 解决办法:将 getmaxy() 修改为 getheight();

错误提示:error C2065: 'graphresult' : undeclared identifier 解决办法:将 graphresult(); 用数字 0 替换。 错误提示:error C2065: 'grOk' : undeclared identifier 解决办法:将 grOk 用数字 0 替换。

错误提示:error C2065: 'grapherrormsg' : undeclared identifier 解决办法:将 grapherrormsg(xxx) 用一对半角空双引号 \替换。

错误提示:error C2065: '_AX' : undeclared identifier (可能是 _AH、_AL、_BX、_CX 等寄存器)

- 36 -

错误提示:error C2065: 'geninterrupt' : undeclared identifier

解决办法:前面两个错误提示通常会一起发生,这些代码是调用中断时使用的,比如在 TC 里面调用鼠标的代码。所以,具体解决办法要根据调用什么中断来解决,需要查中断手册。例如以下的 TC 代码:

void GetMousePos() {

_AX=0x33; geninterrupt(0x33); MouseX=_CX; MouseY=_DX; }

查询中断手册后可以得知,该功能是用来获取鼠标的当前坐标。所以,这个 GetMousePos() 函数就要相应的修改成 VC 版本,例如:

void GetMousePos() {

HWND hwnd = GetHWnd(); POINT point; GetCursorPos(&point); ScreenToClient(hwnd, &point); MouseX = point.x; MouseY = point.y; }

错误提示:error C2665: 'settextstyle' : none of the 4 overloads can convert parameter 3 from type 'const int'

解决办法:settextstyle 是 tc 下设置字体的函数,功能很简单,第一个参数设置字形(0-4 共 5种),第二个参数设置文字输出方向(0、1 分别表示横、竖),第三个参数设置文字大小(设置为 n 表示高度为 8 * n)。在 easyx 下的settextstyle 函数实现了更丰富的字体设置,需要做适当移植,详见帮助中 settextstyle 函数的说明。

- 37 -

错误提示:error C2660: 'ellipse' : function does not take 6 parameters

解决办法:tc 里面的 ellipse() 函数用来画椭圆弧,在 EasyX 里面改用 arc() 函数来完成。除了需要将函数名由 ellipse 修改为 arc 外,还需要调整对应的参数。请参考 EasyX 帮助文档获取函数原型并作适当调整。例如,tc 中代码:

ellipse(x, y, sa, ea, xr, yr); 在 vc 中修改为:

arc(x - xr, y - yr, x + xr, y + yr, sa * PI / 180, ea * PI / 180); 错误提示:error C2660: 'arc' : function does not take 5 parameters

修改方法:tc 里面的 arc() 函数用来画圆弧,和 EasyX 里面 arc() 函数的参数略有不同,需要调整对应的参数。请参考 EasyX 帮助文档获取函数原型并作适当调整。例如,tc 中代码: arc(x, y, r, sa, ea); 在 vc 中修改为:

arc(x - r, y - r, x + r, y + r, sa * PI / 180, ea * PI / 180); 错误提示:error C2065: 'settextjustify' : undeclared identifier

解决办法:删除 settextjustify(xxx) 语句。该函数目前在 vc 下没有特别理想的替换方案。该函数目的是调整 outtextxy输出字符串的位置,删除后,后面的文字输出位置会有偏移(不会影响程序执行流程),因此还需要根据情况调整后面的文字输出语句的坐标,或者替换为drawtext 函数等。 错误提示:error C2065: 'gotoxy' : undeclared identifier

解决办法:严格来说,gotoxy 函数并不是在 graphics.h 里面定义的,这个函数是 tc 的 conio.h 里面定义的,在 vc 中没有。解决这个错误,需要在程序中增加一个自定义函数,如下: // 移动光标到指定位置

void gotoxy(int x, int y) {

COORD coord = {x - 1, y - 1};

- 38 -

}

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

如果编译没有错误了,但是程序还是不能运行,就需要修改一些运行时导致问题的地方:

1. setcolor 等颜色相关。

例如,setcolor(4);,在 TC 下设置为 4 号调色板颜色,默认是红色,但在 EasyX 下,可以使用 24 位真彩色,每个颜色分量都是 0~255,那么 4 号颜色只表示很暗的红色,肉眼

几乎看不到。因此,setcolor(4) 可以修改为 setcolor(RED),等等。其他涉及到颜色的语句也要这么修改。 2. setfillstyle

tc 下的 setfillstyle 函数在 EasyX 下对应为两个函数:setfillcolor 和 setfillstyle,因此需要做相应调整。 tc 下的 setfillstyle 语句格式为: void setfillstyle(int pattern, int color);

常见的 pattern 为 1 或 SOLID_FILL,表示固实填充。 而 EasyX 的 setfillcolor 和 setfillstyle 语句格式为: void setfillcolor(COLORREF color);

void setfillstyle(int pattern, const char *pupattern = NULL); 例如,tc 中的:

setfillstyle(1, 4); // 设置为红色固实填充 在 EasyX 中可以修改为以下两条语句: setfillcolor(RED); setfillstyle(SOLID_FILL);

程序练习10.1:编辑snake3程序,存为.c文件,在TC环境下编译、调试、运行,运行结果截图。

程序练习10.2:将snake3.c移植到VC环境下编译、调试、运行,运行结果截图。

- 39 -

本文来源:https://www.bwwdw.com/article/2y03.html

Top