副标题#e#
二、设定填充方法
TURBO C有四个与填充方法有关的函数。下面别离先容:
void far setfillstyle(int pattern, int color);
color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的
标记常数如表7所示。
表7. 关于填充式样pattern的划定
━━━━━━━━━━━━━━━━━━━━━━━━━━━
标记常数 数值 寄义
───────────────────────────
EMPTY_FILL 0 以配景颜色填充
SOLID_FILL 1 以实填充
LINE_FILL 2 以直线填充
LTSLASH_FILL 3 以斜线填充(阴影线)
SLASH_FILL 4 以粗斜线填充(粗阴影线)
BKSLASH_FILL 5 以粗反斜线填充(粗阴影线)
LTBKSLASH_FILL 6 以反斜线填充(阴影线)
HATCH_FILL 7 以直方网格填充
XHATCH_FILL 8 以斜网格填充
INTTERLEAVE_FILL 9 以隔断点填充
WIDE_DOT_FILL 10 以稀疏点填充
CLOSE_DOS_FILL 11 以麋集点填充
USER_FILL 12 以用户界说式样填充
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
除USER_FILL(用户界说填充式样)以外, 其它填充式样均可由setfillstyle()函数配置。当选用USER_FILL时, 该函数对填充图模和颜色不作任何改变。之所以界说USER_FILL主要因为在得到有关填充信息时用到此项。
void far setfillpattern(char * upattern,int color);
配置用户界说的填充图模的颜色以供对关闭图形填充。
个中upattern是一个指向8个字节的指针。这8个字节界说了8×8点阵的图形。每个字节的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; /* 现行填充模式 * /
};
#p#副标题#e#
有关图形填充图模的颜色的选择, 请看下面例程。
例11:
#include<graphics.h>
main(){
char str[8]={10,20,30,40,50,60,70,80}; /*用户界说图模*/
int gdriver,gmode,i;
struct fillsettingstype save; /*界说一个用来存储填充信息的布局变量*/
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:\tc");
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); /* 画长方体并填充*/
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("The pattern is %d, The color of filling is %d",
save.pattern, save.color); /*输出今朝填充图模和颜色值*/
getch();
}
以上措施运行竣事后, 在屏幕上显示呈现行填充图模和颜色的常数值。
三、任意关闭图形的填充
截至今朝为止, 我们只能对一些特定形状的关闭图形举办填充, 但还不能对任意关闭图形举办填充。为此, TURBO C 提供了一个可对任意关闭图形填充的函数, 其挪用名目如下:
void far floodfill(int x, int y, int border);
个中: x, y为关闭图形内的任意一点。border为界线的颜色, 也就是关闭图形表面的颜色。挪用了该函数后, 将用划定的颜色和图模填满整个关闭图形。
留意:
1. 假如x或y取在界线上, 则不举办填充。
2. 假如不是关闭图形则填充会从没有关闭的处所溢出去, 填满其它处所。
3. 假如x或y在图形外面, 则填充关闭图形外的屏幕区域。
#p#分页标题#e#
4. 由border指定的颜色值必需与图形表面的颜色值沟通, 但填充色可选任意颜色。下例是有关floodfill()函数的用法, 该措施填充了bar3d()所画长方体中其它两个未填充的面。
例12:
#include<stdlib.h>
#include<graphics.h>
main()
{
int gdriver, gmode;
strct 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);
rectanle(450,400,500,450); /*画一矩形*/
floodfill(470,420, LIGHTRED); /*填充矩形*/
getch();
closegraph();
}
6. 有关图形窗口和图形屏幕操纵函数
一、图形窗口操纵
象文本方法下可以设定屏幕窗口一样, 图形方法下也可以在屏幕上某一区域设定窗口, 只是设定的为图形窗口罢了, 其后的有关图形操纵都将以这个窗口的左上角(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;
};
注明:
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 putimge(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划定如何释放内存中图像。
关于这个参数的界说拜见表8。
表8. putimage()函数中的op值
━━━━━━━━━━━━━━━━━━━━━━━━━━
标记常数 数值 含 义
──────────────────────────
COPY_PUT 0 复制
XOR_PUT 1 与屏幕图像异或的复制
OR_PUT 2 与屏幕图像或后复制
AND_PUT 3 与屏幕图像与后复制
NOT_PUT 4 复制反像的图形
━━━━━━━━━━━━━━━━━━━━━━━━━━
对付imagesize()函数, 只能返回字节数小于64K字节的图像区域, 不然将会堕落, 堕落时返回-1。
本节先容的函数在图像动画处理惩罚、菜单设计能力中很是有用。
例13: 下面措施模仿两个小球动态碰撞进程。
#p#分页标题#e#
#include<stdio.h>
#include<graphics.h>
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);
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();
}
7. 图形模式下的文本输出
在图形模式下, 只能用尺度输出函数, 如printf(), puts(), putchar() 函数输出文本到屏幕。除此之外, 其它输出函数(如窗口输出函数)不能利用, 等于可以输出的尺度函数, 也只以前景致为白色, 按80列, 25行的文本方法输出。
Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。下面将别离举办先容。
一、文本输出函数
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, "your TOEFL score is %d", mark);
这里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()函数输出字符串时, 字符串长方形的这个划定位置就瞄准函数中的(x, y)位置。而对用outtext()函数输出字符串时, 这个划定的位置就位于现行游标的位置。有关参数horiz和vert的取值拜见表9。
表9. 参数horiz和vert的取值
━━━━━━━━━━━━━━━━━━━━━━━━
标记常数 数值 用于
────────────────────────
LEFT_TEXT 0 程度
RIGHT_TEXT 2 程度
BOTTOM_TEXT 0 垂直
TOP_TEXT 2 垂直
CENTER_TEXT 1 程度或垂直
━━━━━━━━━━━━━━━━━━━━━━━━
void far settextstyle(int font, int direction, int charsize);
#p#分页标题#e#
该函数用来配置输出字符的字形(由font确定)、输出偏向(由direction确定)和字符巨细(由charsize确定)等特性。Turbo C2.0对函数中各个参数的划定见下列各表所示:
表10. font的取值
━━━━━━━━━━━━━━━━━━━━━━━━
标记常数 数值 寄义
────────────────────────
DEFAULT_FONT 0 8*8点阵字(缺省值)
TRIPLEX_FONT 1 三倍笔划字体
SMALL_FONT 2 小号笔划字体
SANSSERIF_FONT 3 无衬线笔划字体
GOTHIC_FONT 4 黑体笔划字
━━━━━━━━━━━━━━━━━━━━━━━━
表11. direction的取值
━━━━━━━━━━━━━━━━━━━━━━━━
标记常数 数值 寄义
────────────────────────
HORIZ_DIR 0 从左到右
VERT_DIR 1 从底到顶
━━━━━━━━━━━━━━━━━━━━━━━━
表12. 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 用户界说的字符巨细
━━━━━━━━━━━━━━━━━━━━━━━━
有关图形屏幕下文本输出和字体字型配置函数的用法请看下例:
例14:
#include<graphics.h>
#include<stdio.h>
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);
settextstyle(1, 0, 8); /*三重笔划字体, 程度放大8倍*/
outtextxy(20, 20, "Good Better");
setcolor(15);
settextstyle(3, 0, 5); /*无衬笔划字体, 程度放大5倍*/
outtextxy(120, 120, "Good Better");
setcolor(14);
settextstyle(2, 0, 8);
i=620;
sprintf(s, "Your score is %d", i); /*将数字转化为字符串*/
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);
#p#分页标题#e#
该函数用来配置笔划型字和放大系数, 它只有在settextstyle( ) 函数中的charsize为0(或USER_CHAR_SIZE)时才起浸染, 而且字体为函数settextstyle()划定的字体。挪用函数setusercharsize()后, 每个显示在屏幕上的字符都以其缺省巨细乘以mulx/divx为输出字符宽, 乘以muly/divy为输出字符高。该函数的用法见下例。
例15:
#include<stdio.h>
#include<graphics.h>
int main()
{
int gdirver, gmode;
gdriver=DETETC;
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, "Very Good");
setusercharsize(2, 1, 4, 1);/*程度放大2倍, 垂直放大4倍*/
setcolor(15);
settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/
outtextxy(220, 220, "Very Good");
setusercharsize(4, 1, 1, 1);
settextstyle(3, 0, 0);
outtextxy(180, 320, "Good");
getch();
closegraph();
return 0;
}