C图形方式下的编程

来源:互联网 发布:淘宝最低折扣设置 编辑:程序博客网 时间:2024/05/17 05:17


学习目标

    ·了解PC显示系统的结构

    ·C语言图形初始化的一般方法

    ·C语言常用的图形处理函数

显示系统简介

    PC机显示系统一般是由显示器和显示卡组成。显示器(Monitor)是独立于主机的一种外部设备。显示卡(Adapter)是插在Pc主机上的一块电路板。PC机对显示屏幕的所有操作都是通过显示卡来实现的。

    显示系统的主要特性

    1.显示分辨率

显示分辨率是指屏幕上所能显示的像素点数,通常用列数和行数的乘积宋表示。为了获得良好的显示效果,要求显示器的分辨率与对应分辨率的显示卡相匹配。通常,高分辨率的显示效果比低分辨率的效果好。但是,显示分辨率的提高对显示器与显示卡的硬、软件要求更高。特别是分辨率的提高在很大程度上受到显示器的显示尺寸和扫描频率的限制,也受到显示卡的显存的限制。

    根据应用情况的不同,在不超过显示器最高分辨率的条件下,可以通过对显示卡的设置而使用不同的分辨率。

    2.显示速度

显示速度是指在屏幕上显示图形和字符的速度。显示速度与显示分辨率和显示器的扫描频率密切相关。显示分辨率越高,整个屏幕上的像素点数就越多,显示速度就越慢。在这种情况下,为了提高显示速度,就需要提高扫描频率。

    如果显示器只有一种扫描频率,则它只能与一种显示卡相匹配使用。随着显示技术的发展,目前一般的显示器可以适应具有多种分辨率与显示速度的显示卡。

    颜色与灰度是衡量显示系统的重要参数。单色显示器只有亮和暗两种灰度;彩色显示器的颜色和灰度要受显示内存的限制,分辨率越高,颜色越丰富,所需要的显示内存就越多。

    4.图形显示能力

    图形显示能力是显示系统对屏幕上的每一个像素点都可以设置成不同的值的能力。通常,图形显示对硬件的要求比字符显示要求高得多,同时,图形显示对显示缓冲区的要求也比字符显示时高得多。

显示卡的种类

常用的显示卡有以下几种

1.MDA卡

    MDA卡(Monochrome Display Adapter——单色字符显示器适配卡)与单色字符显示器配接,它只支持字符显示功能,无图形功能。

    2.HGC卡

  HGC卡(Hercules GraphicsCard——单色显示图形卡)不仅支持字符显示,而且支持单色图形功能。在图形方式下,其图形显示分辨率最高可达720~348点阵。通过软件的设置,还可以支持640~400单色图形显示以及模拟CGA卡图形方式。

    3.CGA卡

    CGA卡(ColorGraphicsAdapter--彩色图形显示卡)支持字符/图形两种方式。

在字符方式下,它支持80列、25行及奶列、25行的方式,颜色可选16种。但是字符的质量比较差,只有8X8点阵。在图形方式下,它支持最大为640~200分辨率,但只有黑、白两种颜色。此外,它还支持320~200的分辨率,每个像素点可以有四种颜色。CGA卡有16K的显示缓冲区,用于显示字符及属性或图形方式下的图形数据。

    4.EGA卡

   EGA卡(Enhanced GraphicsAdapter——增强型图形显示卡)的字符显示能力和图形显示能力都比CGA卡有了较大的提高,显示分辨率达到640~350,最高分辨率图形方式的颜色达到了16种。EGA卡的显示模式也比CGA卡丰富,并且兼容CGA卡及MDA卡的显示模式。

    5.VGA卡

  VGA卡(Video GraphicsArray一一视频图形阵列)是一种功能十分强大、颜色丰富的显示卡。VGA的标准分辨率可达到640~480,并且具有16种颜色。一些兼容的VGA卡(如TVGA卡、EVGA卡)的分辨率可达640~480(256种颜色)、800~600(16种颜色)或1024~768(16种颜色)。VGA卡兼容MDA卡、CGA卡、EGA卡的所有显示模式。

   随着显示技术的发展,目前的显示卡的分辨率一般都可以达到1024X768,显示32位真彩(232种颜色)。

    视频BIOS

视频BIOS(BasicI/OSystem基本输入/输出系统)是与显示卡配套的一个重要组成部分。用户通过调用它可以完成一些与显示有关的控制功能。对于要用到显示系统的一般程序设计都可以通过调用视频BIOs或视频函数库来完成。但要想获得更高性能的显示程序,还需要对显示卡的寄存器和显示内存直接进行编程。

显示模式

    显示模式按功能可以分为字符模式和图形模式两大类。

  字符模式也称为字母数字模式,即A/N模式(A1phaNumbermode)。在这种模式下,显示缓冲区中存放的是显示字符的代码和属性,而显示屏幕被分为若干个字符显示行和列。图形模式(Graphics mode)也称为APA模式(A1l Points Addressablemode)。在这种模式下,显示缓冲区中存放的是显示器屏幕上的每个像素点的颜色或灰度值,而显示屏幕被划分为像素行和像素列。

    由于显示卡的种类很多,其中有些显示模式在不同类型的显示卡及不同厂家的显示卡之间是通用的,这类显示模式称为标准模式。还有些模式是专用的,称为非标准模式。通常,显示模式号小于14H的是标准模式;其他则为非标准模式。

图形模式的初始化

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

    设置屏幕为图形模式,可用下列图形初始化函数:

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

  其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、VGA图形适配器的图形驱动程序为EGAVGA.BGI。

    有时编程者并不知道所用的图形显示器适配器种类,而且我们为了将编写的程序可以用于不同图形驱动器,增强程序的通用性,我们通常不指定图形显示器适配器种类,而使用Turbo C提供了一个自动检测显示器硬件的函数,其调用格式为:

    void far detectgraph ( int *gdriver, *gmode);

    其中gdriver和gmode意义同上。

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

     #include "graphics.h"

     main( )

       {

          int gdriver, gmode;

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

          printf("driver is %d, mode is %d\n", gdriver,gmode);    /*输出结果*/

          getch();

          initgraph(&gdriver, &gmode, "");     /* 根据测试结果初始化图形*/

          circle(320,240,50);

          circle(320,240,80);

          circle(320,240,110);

          getch();

          closegraph();

       }

上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置。其中,closegraph()为退出图形状态的函数,其调用格式为:voidfarclosegraph(void);调用该函数后可退出图形状态而进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。同时TurboC提供了一种更简单的初始化图形的方法,即用gdriver=DETECT语句后再跟initgraph()函数就行了。比如,上例可改为例2的样子。

例2:

     #include "graphics.h"

     main()

     {

           int gdriver=DETECT, gmode;

           initgraph(&gdriver, &gmode, "");

           circle(320,240,50);

           circle(320,240,80);

           circle(320,240,110);

           getch();

           closegraph();

        }

屏幕颜色的设置

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

  void far setbkcolor (int color);  设置背景色

  void far setcolor (int color);  设置作图色

    其中color为图形方式下颜色的规定数值,符号常数及数值如下所示。

符号常数    数值    含义    字符或背景

BLACK    0    黑    两者均可

BLUE    1    兰    两者均可

GREEN    2    绿    两者均可

CYAN    3    青    两者均可

RED    4    红    两者均可

MAGENTA    5    洋红    两者均可

BROWN    6    棕    两者均可

LIGHTGRAY    7    淡灰    两者均可

DARKGRAY    8    深灰    只用于字符

LIGHTBLUE    9    淡兰    只用于字符

LIGHTGREEN    10    淡绿    只用于字符

LIGHTCYAN    11    淡青    只用于字符

LIGHTRED    12    淡红    只用于字符

LIGHTMAGENTA    13    淡洋红    只用于字符

YELLOW    14    黄    只用于字符

WHITE    15    白    只用于字符

BLINK    128    闪烁    只用于字符

清除图形屏幕内容使用清屏函数,其调用格式如下

void far cleardevice(void);

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

例3:

     #include "stdio.h"

     #include "graphics.h"

     main()

     {

          int gdriver, gmode, i,j;

          gdriver=DETECT;

          initgraph(&gdriver, &gmode, ""); /*图形初始化*/

          setbkcolor(0);                   /*设置图形背景*/

          cleardevice();

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

          {

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

            circle(319, 239, 20+i*15);     /*画半径不同的圆*/

            delay(3000);                   /*延迟3000毫秒*/

          }

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

          {

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

             cleardevice();

       for(j=0; j<=15;j++)

          {

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

            circle(319, 239, 20+j*15);     /*画半径不同的圆*/

            delay(3000);

             }

          }

      getch();

      closegraph();

      }

  另外,TURBO C也提供了几个获得现行颜色设置情况的函数。

  int far getbkcolor(void); 返回现行背景颜色值。

  int far getcolor(void); 返回现行作图颜色值。

  int far getmaxcolor(void); 返回最高可用的颜色值。

基本图形函数

  基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。

    画点

  1. 画点函数 void far putpixel(int x, int y, int color);该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从上表中获得而对x,y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int fargetpixel(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); 画一作从现行游标到点(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为半径,画一个圆。

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

 voidellipse(int x, int y, int stangle, int endangle,int xradius,intyradius);以(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)为右下角画一个矩形框。

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

    2. 设定线型函数

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

void far setlinestyle(intlinestyle,unsigned upattern,int thickness); 该函数用来设置线的有关信息,其中linestyle是线形状的规定,

见下表:

有关线的形状(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
─────────────────────────
SOLID_LINE 0 实线
DOTTED_LINE 1 点线
CENTER_LINE 2 中心线
DASHED_LINE 3 点画线
USERBIT_LINE 4 用户定义线
━━━━━━━━━━━━━━━━━━━━━━━━━
有关线宽(thickness)
thickness是线的宽度,见下表。
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
─────────────────────────
NORM_WIDTH 1 一点宽
THIC_WIDTH 3 三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━
  对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此进uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstypefar *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)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。
  封闭图形的填充
  填充就是用规定的颜色和图模填满一个封闭图形。
  1.先画轮廓再填充
  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 depthint topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。
  void far pieslice(int x,int y,int stangle,int endangle,int radius); 画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。
  void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。
  2.设定填充方式
  TURBO C有四个与填充方式有关的函数。下面分别介绍:
  void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数如下表所示。关于填充式样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个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。
void far getfillpattern(char * upattern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。
  void far getfillsetings(struct fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:
struct fillsettingstype
{
int pattern; /* 现行填充模式 * /
int color; /* 现行填充模式 * /
}; 
3. 任意封闭图形的填充
  截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此,TURBO C 提供了一个可对任意封闭图形填充的函数,其调用格式如下: void far floodfill(int x, int y, int border); 其中:x, y为封闭图形内的任意一点。border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用规定的颜色和图模填满整个封闭图形。
注意:
  1. 如果x或y取在边界上,则不进行填充。
  2. 如果不是封闭图形则填充会从没有封闭的地方溢出去,填满
其它地方。
  3. 如果x或y在图形外面,则填充封闭图形外的屏幕区域。
  4. 由border指定的颜色值必须与图形轮廓的颜色值相同, 但填充色可选任意颜色。下例是有关floodfill()函数的用法,该程序填充了bar3d()所画长方体中其它两个未填充的面。
  有关图形窗口和图形屏幕操作函数
  1、图形窗口操作
  象文本方式下可以设定屏幕窗口一样,图形方式下也可以在屏幕上某一区域设定窗口,只是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角 (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 viewporttypefar * viewport); 获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport中,其中viewporttype的结构说明如下:
struct viewporttype
{
int left, top, right, bottom;
int cliplag;
};
注明:
  ①窗口颜色的设置与前面讲过的屏幕颜色设置相同,但屏幕背景色和窗口背景色只能是一种颜色,如果窗口背景色改变,整个屏幕的背景色也将改变这与文本窗口不同。
  ②可以在同一个屏幕上设置多个窗口,但只能有一个现行窗口工作,要对其它窗口操作,通过将定义那个窗口的setviewport()函数再用一次即可。
  ③前面讲过图形屏幕操作的函数均适合于对窗口的操作。
  2、屏幕操作
  除了清屏函数以外,关于屏幕操作还有以下函数:
  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规定如何释放内存中图像。 关于这个参数的定义参见下表:
putimage()函数中的op值
━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含 义
──────────────────────────
COPY_PUT 0 复制
XOR_PUT 1 与屏幕图像异或的复制
OR_PUT 2 与屏幕图像或后复制
AND_PUT 3 与屏幕图像与后复制
NOT_PUT 4 复制反像的图形
━━━━━━━━━━━━━━━━━━━━━━━━━━
对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。这在图像动画处理、菜单设计技巧中非常有用。
图形模式下的文本输出
  在图形模式下,只能用标准输出函数,如printf(),puts(),putchar()函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。
  Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。下面将分别进行介绍。
  1.文本输出函数 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 指向的字符串中,返回值等于写入的字符个数。
  例如:
  'C110F1sprintf(s, "your TOEFL score is %d", mark);这里s应是字符串指针或数组,mark为整型变量。
  2.有关文本字体、字型和输出方式的设置
  有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。
  void far settexjustify(int horiz, int vert); 该函数用于定位输出字符串。
  对使用outtextxy(int x, int y, char far *str textstring)函数所输出的字符串,其中哪个点对应于定位坐标(x,y)在TurboC2.0中是有规定的。如果把一个字符串看成一个长方形的图形,在水平方向显示时,字符串长方形按垂直方向可分为顶部,中部和底部三个位置,水平方向可分为左,中,右三个位置,两者结合就有9个位置。
   settextjustify()函数的第一个参数horiz 指出水平方向三个位置中的一个,第二个参数vert指出垂直方向三个位置中的一个,二者就确定了其中一个位置。当规定了这个位置后,用outtextxy () 函数输出字符串时,字符串长方形的这个规定位置就对准函数中的(x,y)位置。而对用outtext()函数输出字符串时,这个规定的位置就位于现行游标的位置。有关参数 horiz和vert的取值参见下表:
参数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);
该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。
Turbo C2.0对函数中各个参数的规定见下列各表所示:
font的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
────────────────────────
DEFAULT_FONT 0 8*8点阵字(缺省值)
TRIPLEX_FONT 1 三倍笔划字体
SMALL_FONT 2 小号笔划字体
SANSSERIF_FONT 3 无衬线笔划字体
GOTHIC_FONT 4 黑体笔划字
━━━━━━━━━━━━━━━━━━━━━━━━
direction的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
────────────────────────
HORIZ_DIR 0 从左到右
VERT_DIR 1 从底到顶
━━━━━━━━━━━━━━━━━━━━━━━━
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 用户定义的字符大小
━━━━━━━━━━━━━━━━━━━━━━━━
  3.用户对文本字符大小的设置
  前面介绍的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为输出字符高。
小结
  这一讲我们首先介绍了PC机的图形显示结构和原理,然后介绍了图形初始化,然后讲了一些图形处理函数。
  这一讲我们共举了三个例子,对于图形处理函数由于时间原因不能举太多的例子了,希望大家自己实际操作一下,会有很大收获的。