C语言图形编程

C语言图形编程(一、字符屏幕)- -

                                      

一、屏幕操作函数
     1. clrscr()清除字符窗口函数
     2. window()字符窗口函数
     3. gotoxy()光标定位函数
     4. clreol() 清除光标行尾字符函数
     5. insline() 插入空行函数
     6. delline() 删除一行函数
     7. gettext() 拷进文字函数
     8. puttext() 拷出文字函数
     9. movetext() 移动文字函数
二、字符属性函数
    10. textmode() 文本模式函数  
    11. highvideo()高亮度函数
    12. lowvideo() 低亮度函数
    13. normvideo(void);
    14. textcolor() 文本颜色函数
    15. textattr() 文本属性函数
    16.textbackground() 文本背景函数
三、 屏显状态函数
    17. wherex() 光标处x坐标函数
    18. wherey() 光标处y坐标函数
    19. gettextinfo() 获取文本窗口信息函数




    在Borland C++里面提供了字符屏幕和图形函数。字符屏幕的核心是窗口(Window),它是屏幕的活动部分,字符输出或显示在活动窗口中进行。窗口在缺省时,就是整个屏幕。窗口可以根据需要指定其大小。同样,对图形函数的操作,也提供了(Viewport)。也就是说图形函数的操作都是在视口上进行。图形视口与字符窗口具有相同的特性,用户可以在屏幕上定义大小不同的视口,若不定义视口大小,它就是整个屏幕。
    窗口是在字符屏幕下的概念,只有字符才能在窗口中显示出来,这时用户可以访问的最小单位为一个字符。视口是在图形屏幕状态下的概念,文本与图形都可以在视口上显示,用户可访问的最小单位是一个像素(像素这一术语最初用来指显示器上最小的、单独的发光点单元。然而现在,其含义拓宽为指图形显示器上的最小可访问点)。
    字符和图形状态下,屏幕上的位置都是由它们的行与列所决定的。有一点须指出:字符状态左上角坐标为(1,1),但图形左上角坐标为(0,0)。
    了解字符屏幕和图形函数与窗口和视口的关系是很重要的。例如,字符屏幕 光标位置函数gotoxy()将光标移到窗口的x,y位置上,这未必是相对于整个屏幕。下面介绍常用的几类字符屏幕函数的功能用途、操作方法及其例行程序。

一、屏幕操作函数
    编写程序绘图经常要用到对字符屏幕进行操作。例如,在往屏幕上写字符之前,首先要将屏幕清除干净。又如,有时需要在屏幕上多处写上肉中刺样的字符内容,这时最好用屏幕拷贝来高效率地完成这一任务。对这些操作,Borland C++提供了一系列字符屏幕操作函数来实现。

1. clrscr()清除字符窗口函数
功能:函数clrscr()清除整个当前字符窗口,并且把光标定位于左上角(1,1)处。
用法:此函数调用方式为 void clrscr(void);
说明:括号中void 表示无参数。
      该函数相应的头文件为conio.h
返回值:无
例:使用这个函数的例子见4.clreol()函数的实例中。

2. window()字符窗口函数
功能: 函数window()用于在指定位置建立一个字符窗口。
用法: 此函数调用方式为 void window(int left,int top,int right,int bottom);
说明: 函数中参数left,top为窗口左上角坐标;right,bottom为其右下角坐标。
       若有一个坐标是无效的,则window()函数不起作用。一旦该函数调用成功,那么所有定位坐标都是相对于窗口的,而不是相对于整个屏幕。但是建立窗口所用的坐标总是相对整个屏幕的绝对坐标,而不是相对当前窗口的相对坐标。这样用户就可以根据各种需要建立多个互不嵌套的窗口。
       此函数的头文件为conio.h。
返回值:无
例: 调用这个函数的实现例见3.gotoxy()函数的例子中。

3. gotoxy()光标定位函数
功能: 函数gotoxy()将字屏幕上的光标移到当前窗口指定的位置上。
用法: 这个函数调用方式为void gotoxy(int x,int y);
说明: 括号里x,y是, 光标定位的坐标,如果其中一个坐标值无效(如坐标超界),那么光标不会移动。
       此函数在字符状态(有时称为文本状态)下经常用到 ,其相应的头文件为conio.h
返回值:无
例: 下面程序建立两个窗口,然后在窗口里显示字符,字符的位置是调用该函数确定的。
#include"conio.h>
void border(int startx,int starty,int endx,int endy)
{
   register int i;
   gotoxy(1,1);
   for(i=0;i<=endx-startx;i++)
      putch('-');
   gotoxy(1,endy-starty);
   for(i=0;i<=endx-startx;i++)
      putch('-');
   for(i=2;i<=endy-starty;i++){
      gotoxy(1,i);
      putch('1');
      gotoxy(endx-startx+1,i);
      putch('1');
   }
}

main()
{
   void border(int,int,int,int);
   clrscr();
   window(6,8,38,12);
   border(6,8,38,12);
   gotoxy(2,2);
   printf("window 1");
   window(8,16,40,24);
   border(8,16,40,24);
   gotoxy(3,2);
   printf("window 2");
   getch();
}

4. clreol() 清除光标行尾字符函数
功能: 函数clreol()在当前字符窗口中清除从光标位置到行尾的所有字符,而光标位置保持不变。
用法: 它的调用方式为void clreol(void);
说明: 此函数的相应头文件为 conio.h
返回值:无
例: 程序中使用了函数clreol()和clrscr()
#include "conio.h>
void main()
{
   register int i;
   gotoxy(6,8);
   printf("This is a test of the clreol() function.");
   getch();
   gotoxy(6,8);
   clreol();
   for(i=0;i<20;i++)
      printf("Hello/n");
   getch();
   clrscr();
}

5. insline() 插入空行函数
功能: 函数insline()插入一空行到当前光标所在行上,同时光标以下的所有行都向下顺移一行。
用法: 此函数的调用方式为void insline(void);
说明: 该函数只用于文本方式,并且在当了符窗口才有效。
       这个函数的对应头文件是 conio.h
返回值:无
例: 程序给出了insline()函数的用法。
#include "conio.h"
void main()
{
   registser int i;
   clrscr();
   for(i=1;i<24;i++)
   {
      gotoxy(1,i);
      printf("This is line %d/n",i);
   }
   getch();
   gotoxy(1,10);
   insline();
   getch();
}

6. delline() 删除一行函数
功能: 函数delline()删除当前窗口内光标所在行,同时把该行下面 所有行都上移一行。
用法: 此函数调用方式为 void delline(void);
说明: 注意,如果当前窗口小于整个屏幕,那么该函数只影响到窗口内的字符。
       这个函数相应的头部文件是conio.h
返回值: 无
例:先在屏幕上显示16行文字,然后删除第4行
#include "conio.h"
void main()
{
   register int i;
   clrscr();
   for(i=0;i<16;i++) printf("line %d/n",i);
   getch();
   gotoxy(1,4);
   delline();
   getch();
}

7.gettext() 拷进文字函数
功能: 函数gettext()用于文本状态下将屏幕上矩形域内的文字拷进内存。
用法: 该函数调用方式为 int gettext(int left,int top,int right,int bottom,void *buffer);
说明: 函数中参数left,top为矩形区域的左上角坐标,right,bottom为其右下角坐标,这些坐标是屏幕的绝对坐标,不是窗口的相对坐标。buffer指针必须指向一个足够保存该矩形域内文字的内存。所用内存大小按下式计算:
   点头用字节数=矩形哉内的行数×矩形域的列数×2
这里将行数乘以列数再乘以2的原因是保存屏幕上每个字符要用两个字节存储单元,一个字节存储单元存放字符本身,而另一个存放其属性。
此函数相应的头文件是 conio.h
返回值: 若函数调用成功则返回1,否则返顺0。
例: 把屏幕左上角点(1,1)和右下角点(10,10)的区域拷贝到buf指向的内存中去。
   buf=(char *)malloc(10*10*2);
   if(!buf)gettext(1,1,10,10,buf);

8. puttext() 拷出文字函数
功能: 函数puttext()把先前由gettext()保存到buffer指向的内存中的文字拷出到屏幕上一个矩形区域中。
用法: 此函数调用方式为 int puttext(int left,int top,int right,int bottom,void *buffer);
说明: 函数里left,top为给出的屏幕上矩形区域的左上角点,right,bottom为其右下角点,其坐标是用屏幕的绝对坐标,而不是用窗口的相对坐标。
   该函数相应的头文件为conio.h
返回值: 函数调用成功返回值为1,否则返回0。
例: 屏幕上某个区域内容拷进buf指向的内存中,然后又将这些文字拷出到屏幕上新位置。
   buf=(char *)malloc(10*10*2);
   gettext(1,1,10,10,buf);
   puttext(16,16,30,30,buf);

9. movetext() 移动文字函数
功能: 函数movetext()将屏幕上一个矩形区域的文字移到另一个区域上。
用法: 该函数调用方式为 int movetext(int left,int top,int right,int bottom,int newleft,int newtop);
说明: 上面left,top为矩形区域上角坐标,right,bottom为其右下角坐标,newleft,newright为移动到区域左上角坐标。这些坐标是屏幕的绝对坐标,不是窗口的相对坐标。
   若要把屏幕上一段文字移到屏幕的另一位置,那么使用movetext()函数比用gettext()然后再用puttext()效率更高。
   此函数相应的头文件是conio.h
返回值: 如果有一个以上坐标无效,那么函数返回值为0,否则返回1。
列: 把屏幕左上角点(8,8),右下角点(20,20)的矩形区域文字移动到左上角点(10,10)的位置上:
   movetext(8,8,20,20,10,10);

10. textmode() 文本模式函数
功能: 函数textmode()针屏幕设置为文本模式(或者说字符状态)。
用法: 函数调用方式为 void textmode(int mode);
说明: 参数mode必须为表1-2中所示的模式之一⑴以用模式名(符号值),也可以用其等价的整数值。

表1-2 文本模式
----------------------------------------------------------------
模式名(符号值)         等价整数值      说   明

BW40                        0          40列黑白
C 40                        1          40列彩色
BW80                        2          80列黑白
C 80                        3          80列彩色
MONO                        7          80列单色
LASTMODE                   -1          上次模式
----------------------------------------------------------------

   调用该函数后,屏幕复位,并且所有字符的属性恢复其缺省值。
   此函数对应的头文件是conio.h
返回值: 无
例: 把屏幕设置为80列彩色模式
   textmode(C80);


二、字符属性函数
   用户可以设置字符显示的高亮度或低亮度的写的符闪烁及其背景颜色等。具有这些操作的函数称为字符属性函数。除了仅支持单模式和单色的显示卡外,字符属性函数适用于其余所有的显示卡。

11. highvideo()高亮度函数
功能: 函数highvideo()设置屏幕为高亮度显示。
用法: 此函数调用方式为void highvideo(void);
说明: 调用该函数后,写到屏幕上的字符是高亮度的。此函数只适用于文本模式状态(或说字符屏幕状态)。
   这个函数对应的头文件为 conio.h
返回值: 无
例: 设置屏幕显示为高亮度的。
   highvideo();

12. lowvideo() 低亮度函数
功能: 函数lowvideo()设置屏幕为低亮度显示。
用法: 该函数调用方式为void lowvideo(void);
说明: 调用该函数后,此时写到屏幕上的字符是低亮度的。这个函数只适用于文本模式状态(或说字符屏幕状态)。
   此函数相应的头文件是 conio.h
返回值: 无
例: 设置屏幕显示为低亮度的
   lowvideo();

13. normvideo(void);
功能: 函数normvideo()设置屏幕为正常亮度显示。
用法: 这个函数调用方式为void normvideo(void);
说明: 调用该函数后,此时写到屏幕上的字符是正常亮度的,该函数只适用于文本模式状态(或说字符状屏幕状态)。
   此函数相应的头文件为conio.h
返回值: 无
例: 设置屏幕显示为正常亮度。
   normvideo();

14. textcolor() 文本颜色函数
功能: 函数textcolor()设置字符屏幕下文本颜色(或字符颜色),它也可以用于使字符闪烁。
用法: 这个函数调用方式为void textcolor(int color);
说明: 函数中参数color的有效值可取表1-3中的颜色名(即宏名)或等价值。

表1-3 颜色名与等价值
---------------------------------------------------
   名          等价值      含 义
BLACK             0          黑
BLUE              1          蓝
GREEN             2          绿
CYAN              3          青
RED               4          红
MAGENTA           5          洋红
BROWN             6          棕
LIGHTGRAY         7          淡灰
DRAKGRAY          8          深灰
LIGHTBLUE         9          淡蓝
LIGHTGREEN       10          淡绿
LIGHTCYAN        11          淡青
LIGHTRED         12          淡红
LIGHTMAGENTA     13          淡洋红
YELLOW           14          黄
WHITE            15          白
BLINK           128          闪烁
------------------------------------------------------------

textcolor()函数执行后,只影响其后输出探险符颜色,而不改变已经在当前屏幕上的其它字符颜色。显然,如果需要输出的字符闪烁,只要将函数中参数color取为BLINK即可,如果要使字符带颜色闪烁,就必须将所选的颜色值与128作“或”运算。
   此函数相应的头文件是 conio.h
返回值: 无
例: 下面程序段中第一条语句使输出的字符闪烁,第三条语句使字符输出为经色同时闪烁:
   textcolor(BLINK);
   printf("hello");
   textcolor(RED|BLINK);

15. textattr() 文本属性函数
功能: 函数textattr()用于设置文本属性,即字符背景颜色、字符本身颜色和字符闪烁与否。
用法: 函数调用方式为void textattr(int attribute);
说明: 设置字符背景颜色属性字节的最简单方法是,用所选的背景颜色值乘以16再与字符颜色值作按位或(OR)运算。例如需要红色背景、绿色字符,就设置成RED*16|GREEN,若还要字符闪烁,就把背景颜色值、字符颜色值与闪烁值一起
按位作或运算。如蓝背景、黄字符且闪烁,就设置成为:
   YELLO|128|BLUE*16
   第0位用于设置字符颜色。
   此函数相应的头文件为conio.h
返回值: 无
例: 设置背景为蓝色、字符为红色并且字符闪烁:
   textattr(RED|128|BLUE*16);

16.textbackground() 文本背景函数
功能: 函数textbackground()设置字符屏幕下文本背景颜色(或字符背景颜色)。
用法: 此函数调用方式为void textbackground(int bcolor);
说明: 参数bcolor 的有效值取表1-4背景颜色(即宏名)或等价值。
表1-4 背景颜色与等价值
-------------------------------------------------
   背景颜色            等价值         含   义
-------------------------------------------------
   BLACK                 0               黑
   BLUE                  1               蓝
   GREEN                 2               绿
   CYAN                  3               青
   RED                   4               红
   MAGENTA               5               洋红
   BROWN                 6               棕
-------------------------------------------------

调用该函数只影响后续写的字符背景颜色,而不改变当前显示在屏幕上的字符背景颜色。
   这个函数对应的头文件是conio.h
返回值: 无
例: 设置文本背景颜色为蓝色:
   textbackground(BLUE));


三、 屏显状态函数
这里提供三个在文本模式下屏幕显示状态的函数

17. wherex() 光标处x坐标函数
功能: 函数wherex()返回当前窗口中光标处横向坐标。
用法: 此函数调用方式为int wherex(void);
说明: 这个函数调用无参数,其对应的头文件是conio.h
返回值: 函数调用成功,返回光标处x坐标值。
例: 调用这个函数的实例见18.wherey()函数的例中。

18. wherey() 光标处y坐标函数
功能: 函数wherey()返回当前窗口中光标处纵向坐标。
用法: 该函数调用方式为int wherey(void);
说明: 此函数调用无参数,其相应的头文件是conio.h
返回值: 函数调用成功,返回光标处y坐标值。
例: 调作函数wherex()与wherey(),返回当前光标处x坐标与y坐标,并赋给整型变量xpos ,ypos。
   int xpos,ypos;
   xpos=wherex();
   ypos=wherey();

19. gettextinfo() 获取文本窗口信息函数
功能: 函数gettextinfo()获取当前文本窗口信息,并存放在实参结构中。
用法: 函数调用方式为void gettextinfo(struct text-info *info);
说明: 函数中参数info 为struct text-info结构型指针,struct text-info结构在此函数相应的头文件中定义为:
   struct text-info{
      unsigned char winleft;         // 窗口左上角x坐标
      unsigned char wintop;          // 窗口左上角y坐标
      unsigned char winright;        // 窗口右下角x坐标
      unsigned char winbottom;       // 窗口右下角y坐标
      unsigned char attribute;       // 文本属性
      unsigned char normattr;        // 正常属性
      unsigned char currmode;        // 当前屏显模式
      unsigned char screenhight      // 文本窗口高度(以行数计)
      unsigned char screenwidth;     // 文本窗口宽度(以字符个数计)
      unsigned char curx;            // 光标处x坐标
      unsigned char cury;            // 光标处y坐标
  };
   记住,调用函数gettextinfo()时,要传递struct text-info结构型指针或该结构的首地址,不要传递结构变量本身。
   这个函数对应的头文件是conio.h
返回值: 返回文本窗口角点坐标、高宽度、文本属性等值,并存放在info所指向的结构变量中。
例: 程序语句说明如何正确调用gettextinfo()函数:
   struct text-info win-status;
   gettextinfo(&win-status);

C语言图形编程(二、图形显示)- -

                                      

一、确定显示卡
二、选择显示模式   
三、图形显示
    20. detectgraph() 显示卡检测函数
    21. initgraph() 图形初始化函数
    22. getdrivername() 获取图形驱动程序名的指针
    23. getgraphmode() 获取图形模式函数
    24. getmoderange()获取模式值范围函数
    25. getmaxmode()获取最大显示模式函数
    26. getmodename()获取显示模式名函数
    27. graphdefaults()图形设置复位缺省值函数
    28. setgraphmode() 设置图形模式函数
    29. restorecrtmode() 恢复文本显示模式函数
    30. graphresult() 图形操作结果函数
    31. grpaherrormsg() 图形错误信息函数
    32. setgraphbufsize()设置图形缓冲区大小函数
    33. setactivepage() 设置可输出显示页函数
    34. setvisualpage() 设置可见显示页数
    35. closegraph()关闭图形模式函数
    




一、确定显示卡
   微机系统显示部分由显示器(monitor)和显示卡(adapter)两部分组成。显示器是独立于主机的一种外部设备,显示卡或称显示适配卡,也有的称图形卡,是插在主机上的一块电路板。但也有的显示卡与主机板设计在一起。显示卡包括寄存器组、存储器和控制电路三大部分。其中存储器又包括显示RAM和ROM BIOS两部分,微机对显示屏幕的所有操作都是通过显示卡来实现的。因此要进行图形显示 ,首先要确定计算机上安装的是何种显示卡。一种方法是询问计算机或终端使用者,确定将要使用的显示卡类型。这种方法很难,因为甚至专业程序员也不总是能确定他正在使用什么样的硬件。另一种方法是用软件查询硬件以识别当前的配置。如果有一些识别硬件的标准,这就很简单了。在Borland C中对现在所使用的各种显示卡提供了支持,这只要调用detectgraph()函数就可以了,该函数为程序员确定计算机上使用的显示卡类型。

二、选择显示模式
   显示模式是指显示卡支持的分辨率与相应的颜色配置。每台计算机都配置了某种类型显示卡,可以为该显示卡指定显示模式。

三、图形显示
    进行图形显示首先要确定显示卡,然后选择其显示模式。这些工作都可以调用图形功能函数来完成,其实就是把适合于显示卡的图形驱动程序装入内存。如果图形驱动程序未装入内存,那么图形函数就不能操作。

20. detectgraph() 显示卡检测函数
功能: 函数detectgraph()在计算机上安装有显示卡的情况下,测定其显示卡的类型。
用法: 此函数调用方式为void detectgraph(int *driver,int *mode);
说明: 函数把driver所指向的整型变量设置为图形驱动程序的代码,把mode所指向的整型变量设置为显示卡支持的最高有效模式(即该显示卡能支持的最高分辨率)。
   该函数相应的头文件为graphics.h
返回值: 返回适合于该显示卡的图形驱动程序的代码(也称等价值),并存放在driver指向的变量中。若计算机系统中无图形硬件,则由driver指向的变量设置为-2。
例: 检测计算机是否装有显示卡:
   int driver,mode;
   detectgraph(&driver,&mode);
   if(driver==-2)
   {
      printf("no graphics adapter in the computer");
      exit(1);
   }

21. initgraph() 图形初始化函数
功能: 函数initgraph()用于初始化图形系统,把适合的图形驱动程序装入内存,设置图形函数所用的显示模式。
用法: 该函数调用方式为void initgraph(int *driver,int *mode,char *path);
说明: 1) 函数中参数driver指向图形驱动程序(或者等价值)。
   在头部文件graphics.h中定义了图形驱动程序的宏名与其等价 ,如下:
宏   名              等价值
------------------------------
DETECT                  0
CGA                     1
MCGA                    2
EGA                     3
EGA64                   4
EGAMONO                 5
IBM8514                 6
HERCMONO                7
ATT400                  8
VGA                     9
PC3270                 10
--------------------------------

注:在现在的计算机中,上表中的许多显示卡已经过时,不再使用。

这样就不必担心图形驱动程序的准确名字,而只要用其等价值即可,若使用detect(即等价值0)时,initgraph()函数自动检测当前计算机中装有的显示卡类型,并且选用最大分辨率的显示模式。
2)参数mode指向显示模式或用等价值(风表1-5),mode所指的值必须是有效模式之一。
3)参数path指向图形驱动程序所在的路径,例如path="C:/TC/BG1".若没有指定路径,就在当前目录下寻找。
   一般图形驱动程序包含在.BGI文件中,这些文件是系统可以得到的。这个函数对应的头文件是graphics.h。
返回值: 无
例: 调用initgraph()自动检测硬件图形系统,并选用最大分辨率显示模式。
   init drver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");

22. getdrivername() 获取图形驱动程序名的指针
功能: 函数getdrivername()返回指向当前图形驱动程序名的指针。
用法: 此函数调用方式为char *getdrivername(void);
说明: 本函数可以用来检测显示卡,但只能在initgraph()设置图形驱动程序和显示模式之后调用。
   该函数相应的头文件为graphics.h
返回值: 返回一指针,指向含有当前图形驱动程序名的字符串。
例: 显示当前图形驱动程序名:
   #include<graphics.h>
   #include<stdio.h>
   void main()
   {
      int graphdriver=DETECT,graphmode;
      char *s;
      initgraph(&graphdriver,&graphmode,"");
      s=getdrivername();
      outtext("Using driver:");
      outtext(s);
      getch();
      closegraph();
   }

23. getgraphmode() 获取图形模式函数
功能: 函数getgrapgmode()返回当前图形模式。
用法: 该函数调用方式为int getgraphmode(void);
说明: getgraphmode()函数无参数调用。
      这个函数对应的头文件是graphics.h
返回值: 返回initgraph()或setgraphmode()所设置的当前图形模式值。
例: 显示当前图形模式的代码:
   printf("graphics mode is %d",getgraphmode());

24. getmoderange()获取模式值范围函数
功能: 函数getmoderange()返回指定的图形驱动程序能够支持的最低和最高模式值。
用法: 函数调用方式为 void getmoderange(int driver,int *lowmode,int himode);
说明: 参数driver是用来调用此函数时,指定图形驱动程序等价值或宏名。
       其有效值如下:
   -------------------------------------
      宏  名               等价值
   -------------------------------------    
      DETECT                  0
      CGA                     1
      MCGA                    2
      EGA                     3
      EGA64                   4
      EGAMONO                 5
      IBM8514                 6
      HERCMONO                7
      ATT400                  8
      VGA                     9
      PC3270                 10
   -------------------------------------
  注:上表中的许多显示卡在现在的计算机上已经过时,仅作参考。

   该函数想应的头文件为graphics.h
返回值: 返回的最小和最大有效值存放在参数指针lowmode和himode分别指向的整型变量中。
例: 显示当前图形硬件的显示模式的范围值:
   #include"graphics.h"
   void main()
   {
      int driver,mode;
      int low,high;
      mode=0;
     initgraph(&driver,&mode,"");
      getmoderange(driver,&low,&high);
      printf("mode range:%d--%d,low,high);
      getch();
      rstorecrtmode();
   }

25. getmaxmode()获取最大显示模式函数
功能: 函数getmaxmode()返回当前加载的图形驱动程序所支持的最大有效显示模式。
用法: 函数调用方式为int getmaxmode(void);
说明:本函数无参数调用,返回图形驱动程序所支持的最大显示模式,所有图形驱动程序支持从0到getmaxmode()函数返回值中的任一整 数值(对应的显示模式)。
   这个函数对应的头文件是graphics.h
返回值:返回图形驱动程序所支持的显示模式最大值。
例: 显示当前最大显示模式:
   printf("The maxmode of this driver is %d/n",getmaxmode());

26. getmodename()获取显示模式名函数
功能: 函数getmodename()可获取当前图形驱动程序支持的指定显示模式的名字。
用法: 此函数调用方式为char *getmodename(int modecode);
说明: 参数modecode为整型值。用以指定一显示模式值调用该函数。
   这个函数对应的头文件graphics.h
返回值:  返回指定模式值的显示模式名。
例: 显示当前最大显示模式名:
#include<graphics.h>
#include<stdio.h>
void main()
{
   int graphdriver=DETECT,graphmode;
   int modecode;
   char *s;
   initgraph(&graphdriver,&graphmode,"");
   modecode=getmaxmode();
   s=getmodename(modecode);
   outtext("The maxmode name is:");
   outtext(s);
   getch();
   closegraph();
}

27. graphdefaults()图形设置复位缺省值函数
功能: 函数grpahdefaults()把所有图形设置复位为它们的缺省值,这包括把图形视口复位为全屏幕;当前位置定位在0,0;调色板、背景色和绘图色都被复位;填充颜色、填 充图样、文本文字和排齐方式都返回到它位的缺省值。
用法: 此函数调用方式为void graphdefaults(void);
说明: 该函数无参数调用。
      这个函数相应的头文件为graphics.h
返回值: 无
例: 将图形系统恢复为其缺省值:
   graphdefaults();

28. setgraphmode() 设置图形模式函数
   功能: 函数setgraphmode()用当前图形驱动程序有效的图形模式调用,一旦被调用,setgraphmode()选择一个新的图形模式。注意,图形显示模式必须事先由initgraph()初始化。
用法: 该函数调用方式为void setgraphmode(int mode);
说明: 参数mode调用时为指定的模式值。
      此函数相应的头部文件是graphics.h
返回值: 无
例: 把VGA图形卡设置为VGAMED模式:
   setgraphmode(VGAMED);        // 图形系统已经初始化

29. restorecrtmode() 恢复文本显示模式函数
功能: 函数restrecrtmode()将显示模式恢复到调用initgraph()时检测出的初始文本模式。
用法: 这个函数调用方式为void restorecrtmode(void);
说明: 函数restorecrtmode()和setgraphmode()函数一起使用,可以实现文本与图形显示之间的切换。
      此函数对应的头文件为graphics.h
返回值: 无
例: 恢复显示模式为初始文本模式:
   restorecrtmode();

30. graphresult() 图形操作结果函数
功能: 函数graphresult()函数返回最后一次图形操作的代码。
用法: 此函数调用方式为int graphresult(void);
说明: C为图形设置了代码,它们是从-15到0的整数值。其含义见表1-6。
      调用该函数时,出错状态被复位为0,所以返回值(代码)最好存于变量中,以供需要时检测,
      进行下一步图形操作。
      

图形操作信息名称代码含   义
grInvalidDeviceNum -14无效设备号
grInvalidFont-13无效字体文件
grIOerror-12输入输出错误
grError-11一般图形错误
grInvalidMode-10
无效的图形模式
grNoFontMem-9没有足够内存用于装字体文件
grFontNotFound-8没有找到字体文件
grNoFloadMem-7Flood填 充内存不足
grNoScanMem-6Scan填 充内存不足
grNoLoadMem-5没有足够内存装入图形驱动程序
grInvalidDriver-4无效图形驱动程序
grFileNoFound-3没有找到图形驱动文件
grNoDetected-2没有检测到图形硬件
grNoInitGraph-1没有图形初始化
grOK0成功


这个函数对应的头部文件是graphics.h
返回值: 返回最后一次图形操作结果相应的代码。
例: 调用graphresult()函数的实例见下面grapherrormsg()函数的例子。

31. grpaherrormsg() 图形错误信息函数
功能: 函数grapherrormsg()返回指向出错代码相应的错误信息字符串的指针。
用法: 此函数调用方式为char *grapherrormsg(int errcode);
说明: 参数errcode值,即出错代码由调用函数graphresult()获得。这里所有出错代码及相应的错误信息如表1-6中所述。
      该函数相应的头文件是grpahics.h
返回值: 返回一个指向该出错代码相应的错误信息字符串的指针。
例: 用文字形式显示有关出错代码相应的错误信息:
   int errorcode;
   errorcode=graphresult();
   printf(%s",grapherrormsg(errcode));

32. setgraphbufsize()设置图形缓冲区大小函数
功能: 函数setgraphbufsize()用来设置有的图形函数(如floodfill等)所要用到的内存缓冲区大小。
用法: 函数调用方式为unsigned setgraphbufsize(unsigned bufsize);
说明: 这里无符号参数bufsize为所设置的缓冲区大小。
      一般不需要用到该函数,仅使用由initgraph()函数产生的内存缓冲区就够了,缓冲区大小缺省时为4KB(即4096个字节),足以用来填 充一个大约有650个顶点的多边形,但是为了节省内存,用户可以减少缓冲区的大小,或者由于需要更多的缓冲区内存,这时可用函数setgraphbufsize()来增加缓冲区大小。注意,使用setgraphbufsize()函数必须在调用initgraph()之前。
返回值: 返回先前定义的图形缓冲区字节数。
例: 调用此函数设置图形缓冲区为8KB字节:
   setgraphbufsize(0x2000);

33. setactivepage() 设置可输出显示页函数
功能: 函数setactiveage()设置用作图形输出的显示页。
用法: 这个函数调用方式为void setactivepage(int pagenum);
说明: 参数pagenum为选择的显示页号,如果调用成功,那么后续图形输出就写到选定的输出页上。缺省时是以0页作为当前输出页。该函数只在图形驱动程序及其显示模式支持多个显示页时才起作用。
      此函数相应的头文件为graphics.h
返回值: 无
例: 设置1页为输出显示页:
   setactivepage(1);

34. setvisualpage() 设置可见显示页数
功能: 函数setvisualpage()设置屏幕上可见的显示页。
用法: 函数调用方式为void setvisualpage(int pagenum);
说明: 参数pagenum为设置的显示页号。缺省时是以0页作为当前可见页。调用这个函数和调用setactivepage()一样,仅在图形驱动程序及其显示模式支持多个显示页时才有效。用户可以用系统所支持的任何显示页,在它们之间切换,当然一次只能有一个显示页在屏幕上可见,有时需要在一页上建立后备图形葨图像,它在当时不显示,一旦需要时,可以马上切换到该页,如要实现动画效果,只需切换显示页号即可。用setvisualpage()函数选 定实际显示在屏幕上的可见页,用setactivepage()函数选择当前图形输出页,从而实现图形页之间的显示切换,通常这两个函数都是缺省的,这时输出页就是可见页。若不绘制动画就不需要用到这两个函数。
      这两个函数对应的头文件是graphics.h
返回值: 无
例: 设置可见页为第1页:
   setvisualpage(1);

35. closegraph()关闭图形模式函数
功能: 函数closegraph()将系统图形模式关闭,,复位到initgraph()初始文本模式,并且释放图形驱动程序、字体和内部缓冲区所占用的系统内存。
用法: 这个函数调用方式为void closegraph(void);
说明: 当用户的程序既用到图形输出又用到非图形输出时,应该调用此函数。特别是程序多次调用initgraph()函数的情况,要相应地调用closegraph函数,释放调用initgraph()所占用的内存,否则内存很快就满了,程序无法运行,如果程序结束,也可以用restorecrtmode()函数代替该函数,这样任何分配的内存都将释放。
      此函数对应的头文件是graphics.h
返回值: 无
例: 关闭图形系统:
   closegraph();

C语言图形编程(三、绘图函数-01)- -

                                      

、屏幕和视口设置与清除函数
    36. setviewport() 设置图形视口函数
    37. clearviewport()清除图形视口函数
    38. cleardevice() 清除屏幕函数
    39. getviewsettings() 获取图形视口设置函数
二、调色板和颜色函数
    40. setpalette()设置调色板函数
    41. setallpalette()设置整个调色板函
    42. setbackcolor() 设置背景颜色函数
    43. setcolor() 设置颜色函数
    44. getbkcolor() 返回背景色函数
    45. getcolor() 返回当前绘图颜色
    46. getmaxcolor()返回最大颜色值函数
    47. getpalette() 获取调色板函数
    48. getpalettesize() 返回调色板大小函数
    49. getdefaultpalette() 获取缺省调色板函数
三、屏幕位置函数
    50. getmaxx()返回最大x坐标函数
    51. getmaxy() 返回最大y坐标函数
    52. getx() 返回x坐标函数
    53. gety() 返回y坐标函数
    54. moveto()函数
    55. moverel() 相对移动函数
----------------------------------------------------


   Borland C++提供了一整套综合性的图形函数,上节介绍了其中有关图形显示的函数,本节介绍其中的绘图函数,下节将介绍它的图形文本函数。
   一般绘图时,首先要清除屏幕,设置图形视口,设置绘图颜色,然后在屏幕上某个位置画点或直线或曲线等。下面给出具有这些功能的函数。

一、屏幕和视口设置与清除函数

36. setviewport() 设置图形视口函数
功能: 函数setviewport() 设置当前图形视口。
用法: 函数调用方式为void setviewport(int left,int top,int right,int bottom,int clip);
说明: 参数left,top是左上角坐标,right,bottom是右下角坐标,它们都是绝对屏幕坐标。
      传给setviewport()的第五个参数是clip,如果clip为1,则超出视口的输出图形自动被裁剪掉,即所有作图限制于当前图形视口之内,如果clip为0,则不做裁剪,即作图将无限制地扩展于视口周界之外,直到屏幕边界。若无效参数传入setviewport(),则graphresult()函数返回值-11,先前视口设置仍有效。
      setviewport()函数的对应头文件为 graphics.h
返回值: 无
例: 建立对角为(6,6)和(88,88)的视口,并带有裁剪功能:
   setviewport(6,6,88,88,1);

37. clearviewport()清除图形视口函数
功能: 函数clearviewport()清除当前图形视口,并把光标从当前位置移到原点(0,0)。
用法: 该函数调用方式为void clearviewport(void);
说明: 此函数调用执行后,当前图形视口将不复存在。
      这个函数对应的头文件是graphics.h
返回值: 无
例: 清除当前图形视口,但并非整个屏幕:
   clearviewport();

38. cleardevice() 清除屏幕函数
功能: 函数cleardevice() 清除整个屏幕,并且将当前位置移到屏幕原点。
用法: 此函数调用方式为void cleardevice(void);
说明: 该函数类似于文本模式下的函数clrscr(),但clrscr()函数不能在图形方式下工作;同样cleardevice()函数不能在文本模式下工作。
      这个函数相应的头文件为graphics.h
返回值: 无
例: 清除当前整个屏幕:
   cleardevice();

39. getviewsettings() 获取图形视口设置函数
功能: 函数getviewsettings()返回当前图形视口坐标和裁剪标志,坐标是绝对屏幕坐标,裁剪标志 1或 0。
用法: 此函数调用方式为void getviewsettings(struct viewporttype *info);
说明: 该函数执行后,把有关当前视口的信息装入info指向的viewporttype型结构中。
      viewporttype结构定义如下:
      struct viewporttype {
         int left,top,right,bottom;
         int clipflag;
      }
   这里left,top中存放视口左上角坐标,right,bottom中存放视口右下角坐标,clipflag中存放裁剪标志,若clipflag为1 ,执行裁剪以防止超出视口边界,如果clipflag为0,则不对超出边界输出作裁剪。
      getviewsettings()函数对应的头文件是graphics.h
返回值: 无
例: 显示当前视口角点坐标:
   struct viewporttype info;
   getviewsettings(&info);
   printf("left:%d top:%d/n",info.left,info.top);
   printf("right:%d bottom:%d/n",info.right,info.bottom);


二、调色板和颜色函数
进行图形显示或绘图,除了要知道用什么显示卡以及相应的图形驱动程序外,还必须了解它们支持什么样的调色板颜色。

40. setpalette()设置调色板函数
功能: 函数setpalette()可对调色板上的颜色的色彩值重新设定。
用法: setpalette()函数调用方式为void setpalette(int value,int color);
说明: 参数value为色彩值,color为色彩值相应的颜色名。当需要将一颜色指定为一色彩值地,即可调用此函数来设置。

表1-7  预先定义的调色板与色彩
-----------------------------------------------------------------
调色板         色彩0         色彩1         色彩2         色彩3
-----------------------------------------------------------------
  C0            黑色         淡绿           红浅          黄色
  C1            黑色         淡青           粉红          白色
  C2            黑色         绿色           红色          棕色
  C3            黑色         青色          品粉红        淡灰色
-----------------------------------------------------------------
这个函数相对应的头文件为graphics.h
返回值: 无

41. setallpalette()设置整个调色板函数
功能: 函数setallpalette()对某个调色板上的所有颜色重新设定彩色值。
用法: 函数调用方式为void setallpalette(struct palettetype *p);
说明: 在低分辨率图形显示模式下,该函数无效。若函数调用成功,则把p指向的palettetype结构中的色彩值设置为当前调色板所有颜色的新色彩值。
   palettetype结构定义如下:
   struct palettetype {
      unsigned char size;
      signed char color[16];
   };
这里必须把size设置为调色板颜色的数目,并把每个色彩值都装入color数组相应元素中,然后才可用于调用函数。
      此函数对应的头文件是graphics.h
返回值: 无
例:把16色的EGA/VGA显示卡调色板改为其前16种颜色:
   struct palettetype;
   int i;
   for(i=0;i<16;i++) p.color[i]=i;
   p.size=16;
   setallpalette(&p);

42. setbackcolor() 设置背景颜色函数
功能: 函数setbackcolor()把当前调色板颜色的第一个值改成指定的颜色值,以设置背景颜色。
用法: 此函数调用方式为void setbackcolor(int color);
说明: 参数color为指定的背景色,其有效值可以是颜色符号名,也可以是色彩值。表1-8列出了背景颜色供选取。

表1-8 背景颜色值
-----------------------------------------------------------------
   颜色符号名         色彩值      颜色符号名         色彩值
-----------------------------------------------------------------
   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
-----------------------------------------------------------------
      调用该函数,将改变整个屏幕的颜色,如果新的背景色与原来屏幕的图形颜色相同,尽管图形信息不会丢失,但是看不见图形了。如果所选背景色为对比鲜明的颜色,看不见的图形就会重新清晰地显现出来。
      这个函数的头文件为graphics.h
返回值: 无
例: 把背景色置为淡蓝色
   setbackcolor(LIGHTBLUE);

43. setcolor() 设置颜色函数
功能: 函数setcolor()设置当前绘图颜色(或称做前景色)。
用法: 该函数调用方式为voids setcolor(int color);
说明: 参数color为选择的当前绘图颜色。在高分辨率显示模式下,选取的color是实际色彩值,也可以用颜色符号名表示。如果已经摇篮函数setpalette()改变了调色板色彩值,那么符号名就不可能产生预期作用了。
   在低分辨率显示模式(320X200)下,选取的color是调色板颜色号,不是实际色彩值。
      此函数相应的头文件为graphics.h
返回值: 无
例: 设置16种不同的颜色,显示16段直线:
#include<graphics.h>
void main()
{
   int driver,mode;
   int i;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   moveto(0,200);
   for(i=0;i<16;i++)
   {
      setcolor(i);
      linerel(20,0);
   }
   getch();
   restorecrtmode();
}

44. getbkcolor() 返回背景色函数
功能: 函数getbackcolor()返回当前背景颜色。
用法: 函数调用方式为int getbackcolor(void);
说明: 调用该函数后,获得背景色,但其值不一定是调色板上的色彩值。
       这个函数对应的头文件是graphics.h
返回值: 返回当前绘图色彩值。
例: 返回当前背景色彩值:
   printf("background color is %d", getbkcolor());

45. getcolor() 返回当前绘图颜色
用法: 此函数调用方式为int getcolor(void);
说明: 对于使用彩色低分辨率显示模式调色板,返回值是调色板颜色号,而不是实际颜色值,对于高分辨率显示模式,返回值对应于颜色值,除非调色板颜色已被函数setpalette()或setallpalette()改变了。
      这个函数相应的头文件为graphics.h
返回值: 返回当前绘图颜色值。
例: printf("drawing color is %d",getcolor());

46. getmaxcolor()返回最大颜色值函数
用法: 函数调用方式为int getmaxcolor(void);
说明: 该函数调用后,在低分辨率模式下返回值为3(这种模式下有效颜色值为0至3);在高分辨率显示模式下返回值可以是256或更高(此模式下有效颜色值为0至256或更高)。
      这个函数相应的头文件为graphics.h
返回值: 返回当前图形模式下最大颜色值。
例: 显示最大有效颜色值:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   printf(";largest color: %d",getmaxcolor());
   getch();
   restorecrtmode();
}

47. getpalette() 获取调色板函数
功能: 函数getpalette()将当前调色板的值填 入palettetype型结构中。
用法: getpalette()函数调用方式为void getpalette(struct palettetype *p);
说明: 此函数调用执行后,当前调色板的值被装入p指向的结构里;从而可从该结构中获得这个调色板的设置信息。
   palettetype型结构定义如下
   #define MAXCOLORS 15
   struct palettetype {
      unsigned char size;
      signed char colors[MAXCOLORS+1];
   };
   其中size用于存放当前调色板的有效颜色个数;colors数组的每一元素中装入调色板的一个相应颜色值。
   表1-9 列出了这些颜色值(适用于EGA/VGA)
---------------------------------------------------
   颜色符号名                  色彩值
---------------------------------------------------
   EGA_BLACK(EGA黑色)            0
   EGA_BLUE(EGA蓝色)             1
   EGA_GREEN(绿色)               2
   EGA_CYAN(EGA青色)             3
   EGA_RED(红色)                 4
   EGA_MAGENTA(EGA品红)          5
   EGA_BROWN(EGA棕色)            20
   EGA_LIGHTGRAY(EGA淡灰)        7
   EGA_DARKGRAY(EGA深灰)         56
   EGA_LIGHTBLUE(EGA淡蓝)        57
   EGA_LIGHTGREEN(EGA淡绿)       58
   EGA_LIGHTCYAN(EGA淡青)        59
   EGA_LIGHTRED(EGA淡红)         60
   EGA_LIGHTMAGENTA(EGA粉红)     61
   EGA_YELLOW(EGA黄色)           62
   EGA_WHITE(EGA白色)            63

---------------------------------------------------
      getpalette()函数对应的头文件是graphics.h

返回值: 无
例: 显示由自动检测所得显示模式支持的调色板上的颜色数目:
#include<graphics.h>
void main()
{
   int driver,mode;
   struct palettetype p;
   driver=DETECT;      // 自动检测
   mode=0;
   initgraph(&driver,&mode,"");
   getpalette(7p);
   printf("number of colors palette: %d", p.size);
   getch();
   restorecrtmode();
}

48. getpalettesize() 返回调色板大小函数
功能: 函数getalettesize()返回调色板的颜色数目。
用法: 该函数调用方式为int getpalettesize((void);
说明: 调用这个函数后,就知道调色板上有多少颜色数目可在当前显示模式下设置。
      此函数对应的头文件是graphics.h
返回值: 返回当前显示模式支持的调色板的颜色数目。
例: 显示当前显示模式支持的调色板的颜色数目。
   int number;
   number=getpalettesize();
   printf("palette size: %d",number);

49. getdefaultpalette() 获取缺省调色板函数
功能: 函数getdefaultpalette() 返回指向缺省调色板的指针。
用法: 该函数调用方式为struct palettetype *getdefaultpalette(void);
说明: 调色板结构类型palettetype定义如下:
   #define MAXCOLORS 15
   struct palettetype {
      unsigned char size;
      signed char colors[MAXCOLORS+1];
   };
   在调用initgraph()初始化图形系统时,给调色板结构类型变量赋值,作为缺省调色板,调用这个函数可返回指向它的指针。
      此函数相应的头部文件为graphics.h
返回值: 返回指向缺省调色板(结构)的指针。
例: 显示图形系统初始化后所支持的调色板上的各种颜色。
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
   int graphdriver=DETECT,graphmode;
   struct palettetype *palette;
   int errorcode,color;
   initgraph(&graphdriver,&graphmode,"");
   errorcode=graphresult();
   if(errorcode!=grOK){
      printf("Graphics error %s/n",grapherrormsg(errorcode));
      exit(1);
   }
   palette=getdefaultpalette();
   printf("palette->size %d/n",palette->size);
   getch();
   for(color=0;color<palette->size;color++)
   {
      setfillstyle(LINE_FILL,color);
      bar(20*(color-1),0,20*color,20);
      getch();
   }
   if(palette->size>1){
      do
         setpalette(random(palette->size),random(palette->size));
      while(!kbhit());
      getch();
   }
   setallpalette(palette);
   closegraph();
}


三、屏幕位置函数
   在图形模式下,字符屏幕坐标被像素坐标取代了,这种像素坐标根据不同的显示硬件,水平与垂直方向的分辨率可以从320X200变化到1280X1024等。由于分辨率的变化,以致要加载合适的图菜驱动程序,因此大多数图形程序是通过检测硬件开始的,然后使用getmaxx()和getmaxy()等函数来决定屏幕尺寸,调整随后的操作来适应这些屏幕限制。

50. getmaxx()返回最大x坐标函数
功能: 函数getmaxx()返回当前图形模式下的最大x坐标,即最大横向坐标。
用法: 函数调用方式为int maxx(void);
说明: 此函数独立于图形视口设置,仅取决于显示卡的显示模式相应的分辨率。
      这个函数对应的头文件是graphics.h
返回值: 返回当前显示模式最大x坐标值。
例: 使用本函数的例子见51.getmaxy()函数的例子中。

51. getmaxy() 返回最大y坐标函数
功能: 函数getmaxy()返回当前图形模式下的最大y坐标,即最大纵向坐标。
用法: 函数调用方式为int getmaxy(void);
说明: 此函数独立于图形视口设置,仅取决于显示卡的显示模式相应的分辨率。
      这个函数对应的头文件为graphics.h
返回值: 返回当前显示模式的最大y坐标值。
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   printf("max x,y: %d  %d",getmaxx(),getmaxy());
   getch();
   restorecrtmode();
}

52. getx() 返回x坐标函数
功能: 函数getx()返回当前图形模式下当前位置的x坐标(水平像素坐标)。
用法: 此函数调用方式为int getx(void);
说明: 这里坐标是相对于当前图形视口的,如果没有设置图形视口,那么缺省的图形视口为整个屏幕。这类似于文本模式下使用wherex()函数。
      getx()函数相应的头文件是graphics.h
返回值:返回当前x坐标值。
例: 见53.gety()函数中的例子。

53. gety() 返回y坐标函数
功能: 函数gety()返回图菜模式下当前位置的y坐标(垂直像素坐标)。
用法: 此函数调用方式为int gety(void);
说明: 函数返回的坐标是相对于当前图形视口的,如果没有设置图形视口,那么缺省的图形视口为整个屏幕,这类似于文本模式下使用wherey()函数。
      gety()函数对应的头文件是graphics.h
返回值: 返回当前y坐标值。
例: 显示图形模式下当前位置的x,y坐标值:
printf("x: %d, y: %d", getx(),gety());

54. moveto()函数
功能: 函数moveto()将当前位置移动到指定坐标的位置
说明: 这相当于文本模式下gotoxy()函数的操作,它提供对等的功能。
      此函数对应的头文件为graphics.h
返回值: 无
例: 把当前位置移到(66,88)位置上:
   moveto(66,88);

55. moverel() 相对移动函数
功能: 函数moverel()根据指定的偏移量,将当前位置移动一个相对距离(即偏移量大小的距离),成为新的当前位置。
用法: 此函数调用方式为void moverel(int dx,int dy);
说明: 参数dx为x方向相对移动距离dy为y方向相对移动距离。相对移动对图形应用程序,往往要比绝对移动方便一些。
      这个函数对应的头文件是graphics.h
返回值: 无
例: 下面的程序,当语句执行到当前位置在(90,90),则执行后将移动到(100,120)的位置上。即x方向相对移动10,y方向相对移动30:
    moverel(10,30);

C语言图形编程(三、绘图函数-02) A

                                      

四、图形和图像函数
(一) 像素函数
    56. putpiel() 画像素点函数
    57. getpixel()返回像素色函数
(二) 直线和线型函数
    58. line() 画线函数
    59. lineto() 画线函数
    60. linerel() 相对画线函数
    61. setlinestyle() 设置线型函数
    62. getlinesettings() 获取线型设置函数
    63. setwritemode() 设置画线模式函数
(三)、多边形函数
    64. rectangle() 画矩形函数
    65. bar() 画条函数
    66. bar3d() 画条块函数
    67. drawpoly() 画多边形函数
(四)、 圆、弧和曲线函数
    68. getaspectratio()获取纵横比函数
    69. circle()画圆函数
    70. arc() 画圆弧函数
    71. ellipse()画椭圆弧函数
    72. fillellipse() 画椭圆区函数
    73. pieslice() 画扇区函数
    74. sector() 画椭圆扇区函数
    75. getarccoords()获取圆弧坐标函数
(五)、 填充函数
    76. setfillstyle() 设置填充图样和颜色函数
    77. setfillpattern() 设置用户图样函数
    78. floodfill() 填充闭域函数
    79. fillpoly() 填充多边形函数
    80. getfillsettings() 获取填充设置函数
    81. getfillpattern() 获取用户图样设置函数
(六)、图像函数
    82. imagesize() 图像存储大小函数
    83. getimage() 保存图像函数
    84. putimage() 输出图像函数



四、图形和图像函数
   对许多图形应用程序,直线和曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。
(一) 像素函数

56. putpixel() 画像素点函数
功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。
用法: 函数调用方式为void putpixel(int x,int y,int color);
说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。
       此函数相应的头文件是graphics.h
返回值: 无
例: 在屏幕上(6,8)处画一个红色像素点:
   putpixel(6,8,RED);

57. getpixel()返回像素色函数
功能: 函数getpixel()返回像素点颜色值。
用法: 该函数调用方式为int getpixel(int x,int y);
说明: 参数x,y为像素点坐标。
       函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数)。
       这个函数相应的头文件为graphics.h
返回值: 返回一个像素点色彩值。
例: 把屏幕上(8,6)点的像素颜色值赋给变量color。
   color=getpixel(8,6);

(二) 直线和线型函数
   有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。
   有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。

58. line() 画线函数
功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。
用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy);
说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。
       此函数相应的头文件为graphics.h
返回值: 无
例: 见函数60.linerel()中的实例。

59. lineto() 画线函数
功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。
用法: 此函数调用方式为void lineto(int x,int y);
说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。
       该函数对应的头文件为graphics.h
返回值: 无
例: 见函数60.linerel()中的实例。

60.linerel() 相对画线函数
功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。
用法: 这个函数调用方式为void linerel(int dx,int dy);
说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。
       函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。
返回值:无
例: 下面的程序为画线函数调用实例:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   setcolor(15);
   line(66,66,88,88);
   lineto(100,100);
   linerel(36,64);
   getch();
   restorecrtmode();
}

61. setlinestyle() 设置线型函数
功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。
用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);
说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。
       参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。
    参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。
    若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。
    Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。

表1-10  线型
-----------------------------------------------------
   名        称      取 值         含    义
-----------------------------------------------------
   SOLID_LINE          0             实线
   DOTTED_LINE         1             点线
   CNTER_LINE          2             中心线
   DASHED_LINE         3             虚线
   USERBIT_LINE        4             用户自定义线型
-----------------------------------------------------

表1-11 线宽
-----------------------------------------------------------
   名         称            取  值      说   明
-----------------------------------------------------------
   NORM_WIDTH(常宽)           1         一个像素宽(缺省值)
   THICK_WIDTH(加宽)          3         三个像素宽
-----------------------------------------------------------

这个函数的头文件是graphics.h
返回值: 无
例: 下面的程序显示了BC中所提供的线型图样:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   for(i=0;i<4;i++)
   {
      setlinestyle(i,0,1);
      line(i*50,200,i*50+60,200)
   }
   getch();
   restorecrtmode();
}

62. getlinesettings() 获取线型设置函数
功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。
用法: 函数调用方式为void getlinesettings(struct linesettingstype *info);
说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。
   linesettingstype型结构定义如下:
   struct linesettingstype {
      int linestyle;
      unsigned upattern;
      int thickness;
   };
   其中linestyle用于存放线型,线型值为表1-10中的各值之一。
   upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。
   thickness为线宽值存放的变量,可参见表1-11。
   getlinesettings()函数对应的头文件为graphics.h
返回值: 返回的线型设置存放在info指向的结构中。
例: 把当前线型的设置写入info结构:
   struct linesettingstype info;
   getlinesettings(&info);


63.setwritemode() 设置画线模式函数
功能: 函数setwritemode() 设置画线模式
用法: 函数调用方式为 void setwritemode()(int mode);
说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将复盖屏幕上原有的图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。
       setwritemode()函数对应的头文件是graphics.h
返回值: 无
例: 设置画线输出模式为0:
   setwritemode(0);

(三)、多边形函数
   对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形的函数。

64. rectangle() 画矩形函数
功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。
用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom);
说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。
      这个函数对应的头文件为graphics.h
返回值: 无
例: 下面的程序画一些矩形实例:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgrpah(&driver,&mode,"");
   rectangle(80,80,220,200);
   rectangle(140,99,180,300);
   rectangle(6,6,88,88);
   rectangle(168,72,260,360);
   getch();
   restorecrtmode();
}

65. bar() 画条函数
功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。
用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom);
说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。
注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。
      这 应的头文件为graphics.h
返回值: 无
例: 见函数bar3d()中的实例。
  
66.bar3d() 画条块函数
功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。
用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag);
说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。
参数topflag相当于一个布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。
要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。
      bar3d()函数对应的头文件为graphics.h
返回值: 无
例: 下面的程序画一个条形和条块:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   setfillstyle(SOLID-FILL,GREEN);
   bar(60,80,220,160);
   setfillstyle(SOLID-FILL,RED);
   bar3d(260,180,360,240,20,1);
   getch();
   restorecrtmode();
}

67. drawpoly() 画多边形函数
功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。
用法: 此函数调用方式为void drawpoly(int pnumber,int *points);
说明: 参数pnumber为多边形的顶点数;参数points指向整型数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。
   drawpoly()函数对应的头文件为grpahics.h
返回值: 无
例: 下面的程序画一个封闭星形图与一个不封闭星形图:
#include<graphics.h>
void main()
{
   int driver,mode;
   static int polypoints1[18]={100,100,110,120,100,130,120,125,140,140,130,120,
   140,110,120,115,100,100};
   static int polypoints2[18]={180,100,210,120,200,130,220,125,240,140,230,120,
   240,110,220,115,220,110};
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   drawpoly(9,polypoints1);
   drawpoly(9,polypoints2);
   getch();
   restorecrtmode();
}

(四)、 圆、弧和曲线函数
   在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。
   为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。

68. getaspectratio()获取纵横比函数
功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。
用法: 此函数调用方式为void getaspectratio(int xasp,int yasp);
说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。
   注意纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。
   getaspectratio()函数对应的头文件为graphics.h
返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。
例: 下面的程序显示纵横比:
   int xasp,yasp;
   float aspectratio;
   getaspectratio(&xasp,&yasp);
   aspectratio=xasp/yasp;
   printf("aspect ratio: %f",aspectratio);

69. circle()画圆函数
功能: 函数circle()使用当前绘图色并以实线画一个完整的圆。
用法:该函数调用方式为void circle(int x,int y,int radius);
说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。
   不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。
   此函数对应的头文件为graphics.h
返回值: 无
例: 画六个同心圆,圆心在(100,100)。
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   circle(100,100,10);
   circle(100,100,20);
   circle(100,100,30);
   circle(100,100,40);
   circle(100,100,50);
   circle(100,100,60);
   getch();
   restorecrtmode();
}

70. arc() 画圆弧函数
功能: 函数arc()使用当前绘图色并以实线画一圆弧。
用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius);
说明: 参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度 ̄360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。
   arc()函数对应的头文件为graphics.h
返回值: 无
例: 以(200,200)为圆心,100为半径,从0度到120度画圆弧:
#include<graphics.h
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&drivwer,&mode,"");
   setcolor(WHITE);
   arc(200,200,0,120,100);
   getch();
   restorecrtmode();
}

 

C语言图形编程(三、绘图函数-02) B- -

                                      

71. ellipse()画椭圆弧函数
功能: 函数ellipse()使用当前绘图色画一椭圆弧。
用法: 该函数调用方式为void ellipse(int x,int y,int startangle,int endangle,
                                       int xradius,int yradius);
说明: 参数x,y为椭圆中心坐标,startangle和endangle为给定的起始角和终止角,xradius与yradius为椭圆的x轴半径与y轴半径,如果startangle为0 ,endangle等于360度,那么画出的是个完整的椭圆。ellipse()函数不同于arc()和circle()函数,屏显纵横比不能自动调节。若需要的是成比例的半径而不是特定的像素距离,则y轴距离必须调节为yradius*aspectratio(y轴半径乘以纵横比)。
   此函数对应的头文件为graphics.h
返回值: 无
例: 在屏幕上画一个鸡蛋形的椭圆。
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   ellipse(200,100,0,360,80,40);
   getch();
   restorecrtmode();
}

72. fillellipse() 画椭圆区函数
功能: 函数fillellipse()使用当前绘图色画一椭圆,然后用当前填充色图样和填充色填充所画的椭圆。
用法: 此函数调用方式为void fillellipse(int x,int y,int xradius,int yradius);
说明: 参数x,y为椭圆中心坐标,xradius,yradius为水平轴半径和垂直轴半径。
       这个函数对应的头文件为graphics.h
返回值: 无
例: 画一填充椭圆:
#include<graphics.h>
#include<stdio.h>
#define R 60
void main()
{
   int driver,mode;
   int xasp,yasp;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   fillellipse(getmaxx()/2,getaxy()/2,66,44);
   getaspectratio(&xasp,&yasp);
   fillellipse(R,R,R,R*(long)xasp/(long)yasp);
   getch();
   closegraph();
}

73. pieslice() 画扇区函数
功能: 函数pieslice()使用当前绘图色画一圆弧,并把弧两端与圆心分别连一直线段(即半径),然后用当前填图样和填充色进行填充,即得扇区。
用法: 这个函数调用方式为void pieslice(int x,int y,int startangle,int endangle,int radius);
说明: 函数pieslice()的操作类似于arc()函数(即同调用参数一样,只是函数名不同),因此调用此函数的详细说明参见函数arc()的相应内容。该函数对屏显纵横比能自动调节进行补偿。
   pieslice()函数对应的头文件为graphics.h
返回值:无
例: 显示一个扇形图,每45度为一个不同的扇区:
#include<graphics.h>
void main()
{
   int driver,mode;
   int i,start,end;
   driver=DETECT;
   mode=0;
   initgraph(&driver,mode,"");
   start=0;
   end=45;
   for(i=0;i<8;i++)
   {
      setfillstyle(SOLID_FILL,i);
      pieslice(260,200,start,end,100);
      start+=45;
      end+=45;
   }
   getch();
   restorecrtmode();
}


74. sector() 画椭圆扇区函数
功能: 函数sector()先用当前绘图色画椭圆扇形轮廓,然后用当前填充图样和填充色进行填充,即得椭圆扇区。
用法: 该函数调用方式为void sector(int x,int y,int startangle,int endangle,int xradius,int yradius);
说明: 参数x,y为椭圆中心坐标,startangle和endangle为起始角与终止角,xradius与yradius是水平轴半径和垂直轴半径即长短轴。当startangle为0,endangle为360度时,调用此函数可画得一个完整的椭圆区。角度增加方向为反时针方向。设定填充图样和填充色,用setfillstyle()或setfillpattern()函数,若画轮廓线或填充扇区出现错误,则graphresult()函数返回值-6。对屏显纵横比,sector()函数不能自动调节补偿。
返回值: 无
例: 画出两个椭圆扇区:
#include<graphics.h>
#include<stdio.h>
#define R 80
void main()
{
   int driver,mode;
   int xasp,yasp;
   initgraph(&driver,&mode,"");
   sector(getmaxx()/2,getmaxy()/2,0,656,R,R);
   getaspectratio(&xasp,&yasp);
   setctor(getmaxx()/2,getmaxy()/2,180,135,R,R*(long)xasp/(long)yasp);
   getch();
   closegraph();
}

75. getarccoords()获取圆弧坐标函数
功能: 函数getarccoords()将最后一次调用arc()或ellipse()画的圆弧或椭圆弧的起终点坐标和中心坐标填入arccoordstype型结构里,进而从该结构中获取这些坐标值。
用法: getarccoords()函数调用方式为void getarccoords(struct arccoordstype *coordsp);
说明: 调用此函数填写coordsp指向的结构,从而获得起终点坐标和中心坐标值。它们可用于画弦、半径以及其它与圆弧端点相连的直线等。pieslice()函数就要用到这些值。如果最后一次调用的函数是circle(),那么getarccoords()将返回圆心坐标和起终点坐标即圆的位置。
   arccoordstype型结构定义如下:
   struct arccoordstype {
      int x,y;
      int xstart,ystart,xend,yend;
   };
   其中,x,y存放中心坐标;xstart,ystart,xend,yend分别存放起终点坐标。
   值得注意的是,结构里起终点(xstart,ystart)与(xend,yend)坐标是像素值,不是角度值,这和调用arc()或ellipse()函数所用的不一样。当然中心坐标(x,y)与调用函数时所用的是一样的。
   这个函数的头文件是graphics.h
返回值: 返回最后一次调用圆或椭圆函数的相应起终点与中心坐标值,并存放在coordsp指向的结构里。
例: 下面的程序画圆心在(100,100)的四分之一圆弧,然后于弧两端点之间连一直线。
#include<graphics.h>
void main()
{
   int driver,mode;
   struct arcccoordstype arcinfo;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   arc(100,100,0,90,88);
   getarccoords(&arcinfo);
   line(arcinfo.xstart,arcinfo.ystart,arcinfo.xend,arcinfo.yend);
   getch();
   restorecrtmode();
}

(五)、 填充函数
   前面已经涉及到了用填充图样和填充色填充图形的问题,如调用pieslice()画扇区就要用填充图样与填充色来填充区域。那么怎样设置填充图样和填充色呢?我们只要简单地学习并练习一下就会掌握其方法。下面介绍用于设置填图样与填充色、建立用户自己的填充图样与填充封闭区域的几个常用函数。

76. setfillstyle() 设置填充图样和颜色函数
功能:setfillstyle()设置填充图样和颜色函数
功能: 函数setfillstyle()为各种图形函数设置填充图样和颜色。
用法: 函数调用方式为void setfillstyle(int pattern,int color);
说明: 参数pattern的值为填充图样,它们在头文件graphics.h中定义,详见表1-12所示。
   参数color的值是填充色,它必须为当前显示模式所支持的有效值。
   填充图样与填充色是独立的,可以是不同的值。

表1-12 填充图样
-------------------------------------------------------------------
   填充图样符号名         取值            说明
-------------------------------------------------------------------
   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         斜网格线填充
   INTEREAVE_FILL           9         间隔点填充
   WIDE_DOT_FILL            10        大间隔点填充
   CLOSE_DOT_FILL           11        小间隔点填充
   USER_FILL                12        用户定义图样填充
-------------------------------------------------------------------

   除了EMPTy_FILL,所有填充图样都使用当前填充色,填充图样USER_FILL只有在用函数setfillpattern()已经建立一个用户定义的填充图样后才能使用。
   此函数对应的头文件为graphics.h
返回值: 无
例: 下面的程序用HATCH_FILL填充一个矩形:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,mode,"");
   setcolor(GREEN);
   rectangle(80,200,200,300)
   setfillstyle(HATCH_FILL,RED);
   floodfill(160,240,GREEN);
   getch();
   restorecrtmode();
}

77. setfillpattern() 设置用户图样函数
功能: 函数setfillpattern() 设置用户的填充图样以供fllodfill(),fillpoly()填充函数等使用。
用法: 此函数调用方式为void setfillpattern(char *pattern,int color);
说明: 参数color设置填充图样的颜色。参数pattern指向一字符数组,该数组至少8个字节长,它定义了一个8像素*8像素的用户填充图样。例如:
   char diamond[8]={0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00};
   diamond为8个字节的数组,每个字节对应于填充图样中的8个像素,字节中的1位,画出一个由color设定颜色的像素,字节中的0位则不画。实际上,diamond数组定义了一个7*7的小钻石图样,右边和底部都留有一个像素的边缘。
   调用setfillpattern()设置用户填充图样后,必须调用setfilstyle()函数,使USER_FILL值成为当前填充图样。
   这个函数对应的头文件为graphics.h
返回值: 无
例:建立一个用户填充图样,并用它填充一个矩形:
#include<graphics.h>
void main()
{
   int driver,mode;
   static char p[8]={10,20,30,40,50,60,70,80};
   driver=DETECT;
   mode=0;
   initgraph(&driver,mode,"");
   setcolor(GREEN);
   rectangle(80,200,220,300);
   setfillpattern(p.RED);
   floodfill(160,260,GREEN);
   getch();
   restorecrtmode();
}

78. floodfill() 填充闭域函数
功能: 函数floodfill()用当前填充图样和填充色填充一个由特定边界颜色(通常是当前绘图色)定义的有界封闭区域。
用法: 该函数调用方式为void floodfill(int x,int y,int bordercolor);
说明: 这里参数(x,y)为指定填充区域中的某点,如果点(x,y)在该填充区域之外,那么外部区域将被填充,但受图形视口边界的限制。如果直线定义的区域出现间断,那么将导致泄漏,即使很小的间断,也将导致泄漏。也就是说,间断将引起区域外被填充。
   参数bordercolor为闭区域边界颜色,若可能的话,建议尽量用下面函数fillpoly()代替floodfill(),以便和将来的版本保持兼容。
   如果出错,graphresult()函数将返回错误代码-7(flood填充内存不足)。
   此函数对应的头文件为graphics.h
返回值: 无
例: 用floodfill() 函数填充一个具有交叉阴影线的品红色椭圆:
#include<graphics.h>
void main()
{
   int driver,mode;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   ellipse(188,88,0,360,100,60);
   setfillstyle(cHATCH_FILL,MAGENTA);
   floodfill(188,88,WHITE);
   getch();
   restorecrtmode();
}

79. fillpoly() 填充多边形函数
功能: 函数fillpoly()用当前绘图色、线型及线宽画出给定点的多边形,然后用当前填充图样和填充色填充这个多边形。
用法: 此函数调用方式为void fillpoly(int pointnum,int *points);
说明: fillpoly()的调用形式与drawpoly()的一样,其参数含义相同。该函数中pointnum为所填充多边形的顶点数,points指向存放所有顶点坐标的整型数组。有时顶点数目是通过过计算sizeof(整型数组)除以两倍的sizeof(int)然后得到的,之所以除以两倍的sizeof(int)是因为每个顶点需要两个整型坐标。
注意,fillpoly()是通过连接起点和终点将图形封闭起来,然后填充被包围的区域。与floodfill()不同的是,fillpoly()所用的填充方法不依靠边界连续的轮廓来确定填充区域。这样间断的线型是允许的,并且可以很简单地填充多边形确定的区域,包括在新的边界范围内任何其它图形上重画。如果出错,graphresult()函数将返回错误代码-6(Scan填充内存不足)。
   这个函数对应的头文件为graphics.h
返回值: 无
例:用红色间隔点填充一个正方形:
#include<graphics.h>
void main()
{
   int driver,mode;  
   static int points[]={100,100,100,200,200,200,100,100};
   driver=DETECT
   mode=0;
   initgraph(&driver,mode,"");
   setfillstyle(INTERLEAVE_FILL,RED);
   fillpoly(4,points);
   getch();
   restorecrtmode();
}

80. getfillsettings() 获取填充设置函数
功能: 函数getfillsettings()将当前填充图样值(符号名或等价值)和填充颜色值(符号名或等价值)填入fillsettingstyle型结构里,从而从该结构中获得当前填充设置(填充图样和填充色)。
用法: 这个函数调用方式为void getfillsettings(struct fillsettingstype *info);
说明: 函数里fillsettingstype 型结构定义如下:
   struct fillsettingstype {
         int pattern;
         int color;
   };
   注意,结构中变量pattern只用于存取一个预先定义的填充图样值,而不是填充图样元素,填充图样及等价值在前面表1-12中已经列出。结构变量color用来存储填充颜色值,它是当前显示模式的有效颜色值之一。
   getfillsettings()函数相应的头文件是graphics.h
返回值:返回当前填充图样和填充色的值,并装入info指向的结构里。
例: 下面的程序把当前填充图样和填充色的值写入fillinfo结构中:
   struct fillsettingstype fillinfo;
   getfillsettings(&fillinfo);

81. getfillpattern() 获取用户图样设置函数
功能: 函数getfillpattern()返回上一次调用setfillpattern()设置的用户定义的填充图样。
用法: 此函数调用方式为void getfillpattern(char *pattern);
说明: 函数一旦调用,就会把定义当前用户填充图样的8个字节填入pattern所指向的数组,该数组必须至少8字节长,用户图样以8个8位字节的模式排列,如果还没有调用setfillpattern()设置用户定义的填充图样,那么函数将填入数组元素的值全为0xff。
   getfillpattern()函数对应的头文件为graphics.h
返回值: 返回用户定义填充图样的8个字节数据(注意不是填充图样元素),并存放在pattern指向的数组里。
例: 显示组成当前用户填充图样的各字节内容:
#include<graphics.h>
void main()
{
   int driver,mode;
   char fp[8];
   int i;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   getfillpattern(fp);
   for(i=0;i<8;i++) printf("%d",fp[i]);
   getch();
   restorecrtmode();
}


(六)、图像函数
   图像复制、擦除以及一般对屏幕图像的操作,这对应用程序是非常有用的,对动画制作是必不可少的。BC提供了以下几个图像操作函数。

82. imagesize() 图像存储大小函数
功能: 函数imagsize()返回存储一块屏幕图像所需的内存大小(即字节数)。
用法: 此函数调用方式为unsigned imagsize(int left,int top,int right,int bottom);
说明: 参数(left,top)为所定义的一块图像屏幕左上角,(right,bottom)为其右下角。
   函数调用执行后,返回存储该块屏幕所需要的字节数。如果所需要字节数大于64KB,那么将返回-1。imagesize()函数一般与下面getimage()函数联用。
   这个函数对应的头文件为graphics.h
返回值: 返回一块图像屏幕存储所需的字节数,如果大于64KB,则返回-1。
例: 确定左上角(10,10)与右下角(100,100)所定义的屏幕图像所需的字节数:
   unsigned size;
   size=imagesize(10,10,100,100);

83. getimage() 保存图像函数
功能: 函数getimage()保存左上角与右下角所定义的屏幕上像素图形到指定的内存区域。
用法: 该函数调用方式为void getimage(int left,int top,int right,int bottom,void *buf);
说明: 函数中参数(left,top)为要保存的图像屏幕的左上角,(right,bottom)为其右下角,buf指向保存图像的内存地址。调用getimage()保存屏幕图像,可用imagesize()函数确定保存图像所需字节数,再用malloc()函数分配存储图像的内存(内存分配必须小于64KB),还可以用下面函数putimage()输出getimage()保存的屏幕图像。
   这个函数对应的头文件为graphics.h
返回值: 无
例: 把带有两对角线的矩形拷贝到屏幕其它位置上:
#include<garphics.h>
#include<stdlib.h>
#include<conio.h>
void main()
{
   int driver,mode;
   unsigned size;
   void *buf;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   sector(15);
   rectangle(20,20,200,200);
   setcolor(RED);
   line(20,20,200,200);
   setcolor(GREEN);
   line(20,200,200,20);
   getch();
   size=imagesize(20,20,200,200);
   if(size!=-1){
      buf=malloc(size);
      if(buf){
         getimage(20,20,200,200,buf);
         putimage(100,100,buf,COPy_PUT);
         putimage(300,50,buf,COPy_PUT);
      }
   }
   outtext("press a key");
   getch();
   restorecrtmode();
}

84. putimage() 输出图像函数
功能: 函数putimage()将一个先前保存在内存中的图像输出到屏幕上。
用法: 此函数调用方式为void putimage(int left,int top,void *buf,int ops);
说明: 参数(left,top)为输出屏幕图像的左上角,即输出图像的起始位置。buf指向要输出的内存中图像。参数ops控制图像以何种方式输出到屏幕上。表1-13给出了图像输出方式。

表1-13  图像输出方式
--------------------------------------------------------------------
   输出方式符号名      取值               含     义
--------------------------------------------------------------------
   COPy_PUT              0         图像输出到屏幕上,取代原有图像
   xOR_PUT               1         图像和原有像素作异或运算
   OR_PUT                2         图像和原有像素作或运算
   AND_PUT               3         图像和原有像素作与运算
   NOT_PUT               4         把求反的位图像输出到屏幕上
--------------------------------------------------------------------

1) COPy_PUT输出方式
   图像中每个像素都直接绘制到屏幕上,取代原有图像像素,包括空白的图像像素(背景)。完全空白的图像可以用来擦除其它图像或屏幕的一部分。但通常选择xOR_PUT输出方式擦除原有图像。
2)xOR_PUT输出方式
   原有屏幕每个像素与相应的图像字节作“异或”运算,其结果画到屏幕上。当某一图像和屏幕上原有图像作“异或”运算时,屏幕显示的是两个图像的合成。若相同的图像作异或运算,将有效地擦除该图像,留下原始屏幕。这种输出方式,对动画制作是非常有用的。
3)OR_PUT输出方式
   每个图像字节和相应的屏幕像素作“或”运算,再将结果画到屏幕上,这种输出方式也叫“两者取一”。记住,像素中的每位和图像中的每位作“或”运算,这样所得结果是背景和图像的彩色合成图像。
4)AND_PUT输出方式
   选择AND_PUT图像输出方式时,屏幕像素和图像字节中都显示的位,运算后仍显示,例如,星图像中的空白背景擦除了方块轮廓以及填充色,只有星图像复盖着的方块留下,即运算后,显示两者相同的图像。
5)NOT_PUT输出方式
   NOT_PUT输出方式,除了把图像的每位求反---图像中所有黑的像素(0000)变成了白色(1111),其它方面与COPy_PUT相同。背景图像被重画后将消失。
   putimage()函数对应的头文件为garphics.h
返回值: 无
例: 下面的程序说明了imagesize(),getimage()和putimage()函数的调用方法:
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
void box(int ,int,int,int,int);
void main()
{
   int driver,mode;
   unsigned size;
   void *buf;
   driver=DETECT;
   mode=0;
   initgraph(&driver,&mode,"");
   box(20,20,200,200,15);
   setcolor(RED);
   line(20,20,200,200);
   setcolor(GREEN);
   line(20,200,200,20);
   getch();
   size=imagesize(20,20,200,200);
   if(size!=-1)
   {
      buf=malloc(size);
      if(buf){
         getimage(20,20,200,200,buf);
         putimage(120,120,buf,COPy_PUT);
         putimage(280,60,buf,COPy_PUT);
      }
   }
   outtext("Press a key");
   getch();
   restorecrtmode)(;
}
void box(int startx,int starty,int endx,int endy,int color)
{
   setcolor(color);
   rectangle(startx,starty,endx,endy);
}
图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值