天天看点

[转]C语言图形编程(四) -图形文本

一、图形文本函数

    85. outtext() 当前位置显示字符串函数

    86. outtextxy() 在(x,y)处显示字符串函数

    87. sprintf() 格式化输出函数

二、图形文本设置

    88. settextstyle() 设置文本型式函数

    89. settextjustify() 设置文本排齐函数

    90. setusercharsize() 设置用户字符比例函数

    91. gettextsettings() 获取文本设置函数

    92. textheight() 文本高度函数

    93. textwidth() 文本宽度函数

   如果没有文本,图形也派不太多的用场。但是图形模式一旦设置,就无法进行常规文本显示。标号和文字信息只能用图形文本显示。图形文本显示与常规文本显示不同。例如,常规字符屏幕的位置其行列坐标表示已不再适用,这时单个字符可显示在屏幕上的任何位置。另外图形文本显示既可以水平显示,也可以垂直显示,字母大小也可以改变,同时可以提供几种不同的字型。总之,常规文本显示简单容易;图形文本显示复杂不易操作。所以,在C语言里提供了几个函数来简化操作,控制图形文本显示。

一、图形文本函数

   在图形模式下,屏幕上显示字符串,可以用outtext(),outtextxy(),sprintf()。

85. outtext() 当前位置显示字符串函数

功能: 函数outtext() 在图形模式下用当前文本设置(字体、字符大小、文本显示方向及文本排齐方式)在当前位置显示一个字符串。

用法: 此函数调用方式为void outtext(char *string);

说明: 参数string指向要显示的字符串。

   调用该函数 也可以根据需要事先设置当前绘图色,选择字体、字符大小、确定文本显示方向及水平垂直两个方向的文本排齐方式。

   如果当前显示方向是水平的,那么当前光标位置CP会移动所显示字符的长度,否则CP不变;在图形模式下,光标不可见,但是即使是不可见光标,在屏幕上光标位置CP还是存在的。

   这个函数对应的头文件是graphics.h

例: 使用outtext()函数的例子见86.outtextxy()函数的例子中。

86. outtextxy() 在(x,y)处显示字符串函数

功能:函数outtextxy() 在图形模式下屏幕坐标像素点(x,y)处显示一个字符串。

用法: 这个函数的调用方式为void outtextxy(int x,int y,char *string);

说明: 参数(x,y)给定要显示字符串的屏幕位置,string指向该字符串。调用此函数不影响当前光标位置,当然光标是不可见的。

   该函数也要用当前绘图色、字体、字符大小、文本显示方向和水平垂直两个方向的文本排齐方式。

   outtextxy()的对应头文件是graphics.h

返回值: 无

例: 下面的程序中调用了outtext()和outtextxy()两个函数:

#include<graphics.h>

void main()

{

   int driver,mode;

   int i;

   driver=DETECT;

   mode=0;

   initgraph(&driver,&mode,"");

   outtext("This is an example");

   outtext("another line");

   for(i=100;i<200;i+=8)

      outtextxy(200,i,"hello");

   getch();

   restorecrtmode();

}

87. sprintf() 格式化输出函数

功能: 函数sprintf()用来作格式化的输出。

用法: 此函数调用方式为int sprintf(char *string,char *format,arg_list);

说明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组),然后再调用outtextxy()函数将串里的字符显示在屏幕上。arg_list为参数表,可有不定个数。通常在绘图方式下输出数字时可调用sprintf()函数将所要输出的格式送到第一个参数,然后显示输出。

如果没有文本,图形也派不太多的用场。但是图形模式一旦设置,就无法进行常规文本显示。标号和文官信息只能用图形文本显示。图形文本显示与常规文本显示不同。例如,常规字符屏幕的位置其行列坐标表示已不再适用,这时单个字符可显示在屏幕上的任何位置。另外图形文本显示既可以水平显示,也可以垂直显示,字母大小也可以改变,同时可以提 供几种不同的字型。总之,常规文本显示简单容易;图形文本显示复杂不易操作。所以,在C语言里提 供了几个函数来简化操作,控制图形文本显示。

二、图形文本设置

   常规文本模式显示相当于在纸上打字,而图形文本模式显示更接近于排版印刷。这种增强性能的关键是改变字体及字符大小。选择不同的水平位置文本排齐,甚至可以在垂直方向而不是水平方向显示文本。这些都要调用文本设置函数来实现。

88. settextstyle() 设置文本型式函数

功能: 函数settextstyle() 设置图形文本当前字体、文本显示方向(水平显示或垂直显示)以及字符大小。

用法: 此函数调用方式为void settextstyle(int font,int direction,int charsize);

说明: 函数括号中,font为文本字体参数,direction为文本显示方向,charsize为字符大小参数。头部文件graphics中分别对它们进行了定义。表1-14所列为标准字体。

表1-14 图形文本标准字体

--------------------------------------------------------------------

      字体符号名            等价值         含     义

--------------------------------------------------------------------

   DEFAULT_FONT               0         8*8点阵字型(缺省字体)

   TRIPLEx_FONT                1         笔划式三倍字型(三倍字体)

   SMALL_FONT                  2         笔划式小字型(小字体)

   SANS_SERIF_FONT             3         笔划式字(Sanserif字体)

   GOTHIC_FONT                 4         笔划黑体字型(哥特体)

--------------------------------------------------------------------

   在设置字体之前,被选字体的.CHR文件必须装在initgraph()中指定的driverpath(驱动程序路径)目录或子目录里。

缺省时图形文本显示方向为水平方向,但可以设置图形文本显示方向为垂直方向(逆时针转90度)。表1-15给出了这两个图形文本显示方向。

表 1-15 图形文本显示方向

------------------------------------------------------------

   显示方向符号名       等价值         说         明

------------------------------------------------------------

   HORIZ_DIR               0        从左到右显示(水平方向)

   VERT_DIR                1        从底向上显示(垂直方向)

------------------------------------------------------------

在垂直显示时,文本字符串从底部向上显示,目前还没有现成的规定从上到下或从左到右的显示,但若需要也可设计。

对点阵字体,字符大小可以在0到10之间选择。对于笔划字体,charsize(字符大小参数)=0表示以缺省比例显示即4倍或由函数setusercharsize()设置的用户自定字符的比例放大显示。最大有效的charsize值为0。

   如果有错误参数值传给函数settextstyle(),graphresult()函数将给出值-11(表示一般图形错误),当前的文本型式保持不变。

   settextstyle()函数相应的头文件为graphics.h

返回值:无

例: 下面的程序中使用了settextstyle()函数,显示不同的文本字体和大小:

#include<graphics.h>

#include<conio.h>

void main()

{

   int driver,mode;

   mode=0;

   initgraph(&driver,&mode,"");

   outtext("Normal");

   settextstyle(GOTHIC_FONT,HORIZ_DIR,2);

   outtext("Gothic");

   settextstyle(TRIPLEx_FONT,HORIZ_DIR,2);

   outtext("Triplex");

   settextstyle(SANS_SERIF_FONT,HORIZ_DIR,7);

   outtext("Sans serif");

   getch();

   restorecrtmode();

}

89. settextjustify() 设置文本排齐函数

功能: 函数settextjustify() 设置水平方向和垂直方向的文本排齐方式。

用法: 该函数调用方式为void settextjustify(int horiz,int vert);

说明: 参数horiz,vert确定水平方向、垂直方向的文本排齐方式,其值如表1-16所示。

表 1-16 图形文本排列方式

---------------------------------------------------------------------------

   水平方向排齐         等价值         垂直方向排齐         等价值

      符号名                              符号名

---------------------------------------------------------------------------

   LEFT_TExT               0            BOTTOM_TExT            0

   CENTER_TExT             1            CENTER_TExT            1

   RIGHT_TExT              2            TOP_TExT               2

---------------------------------------------------------------------------

   对于水平方向排齐,若取LEFT_TExT,则文本左边不敢当前位置CP对齐,向右显示文本字符串。若取CENTER_TExT,则文本字符串的中心与当前位置CP对准显示,若取RIGHT_TExT,则文本右边与当前位置CP对齐,向左显示文本字符串。至于垂直方向排齐BOTTOM_TExT,是文本字符串的底线与当前位置CP对准。CENTER_TExT是文本字符串的中线与CP对上,TOP_TExT是文本字符串的顶线过CP,缺省值为水平方向文本排齐方式LEFT_TExT以及垂直方向文本排齐方式TOP_TExT。

   settextjustify()函数对应的头文件为graphics.h

例: 下面的程序语句使图形文本字符串靠右,即字符串右边紧靠当前位置排齐,并且其顶线过CP:

   settextjustify(RIGHT_TExT,TOP_TExT);

90. setusercharsize() 设置用户字符比例函数

功能: 函数setusercharsize() 可以让用户自定义笔划字体的字符比例,但对于缺省字体的字符无效,因为缺省字体是由硬件定义的8*8点阵字体。

用法:此函数调用方式为void setusercharsize(int xmul,int xdiv,int ymul,int ydiv);

说明: 参数xmul/xdiv为设置的字符宽度比例,参数ymul/ydiv为设置的字符高度比例。该函数调用后,屏幕上显示的字符宽为其缺省值8个像素乘以宽度比例,高为其缺省值8个像素乘以高度比例。注意,只有在调用settextstyle()函数设置参数charsize为0 时,字符调节参数才有效。若要显示高度比例为3,宽是高的2倍的字符,可以用下述方法调用函数setuserchrsize():

   xmul=6;xdiv=1;

   ymul=3;ydiv=1;

   setusercharsize(xmul,xdiv,ymul,ydiv);

   这里产生的字符为12个像素宽,48个像素高。

   setusercharsize()函数对应的头文件为graphics.h

返回值: 无

例: 显示大号字符文字:

#include<graphics.h>

void main()

{

   int driver,mode;

   driver=DETECT;

   mode=0;

   initgraph(&driver,&mode,"");

   settextstyle(TRIPLEx_FONT,HORIZ_DIR,0);

   setusercharsize(5,1,5,1);

   outtext("big");

   getch();

   restorecrtmode();

}

91. gettextsettings() 获取文本设置函数

功能: 函数gettextsettings() 将当前字体、显示方向、字符大小和水平垂直方向文本排齐方式等设置值填入textsettingstype型结构里,从而可从中获取文本信息。

用法: gettextsettings() 函数的调用方式为void gettextsettings(struct textsettingstype *info);

说明: 函数中textsettingdtype型结构在头部文件graphics.h中定义如下:

   strcut textsettingstype {

         int font;     // 字体

         int direction;    // 水平或垂直方向

         int charsize;     // 字符大小

         int horiz;        // 水平排齐方式

         int vert;         // 垂直排齐方式

      };

   结构中成员font的取值为下列各值之一:

         值            字体

      -------------------------------

         0            缺省字体

         1            三倍字体

         2            小字体

         3            SansSerif字体

         4            哥特体

      -------------------------------

      变量charsize的值是确定输出字符大小的系数,在0到10之间选取。

      direction方向变量可设置为水平显示HORIZ_DIR(缺省值),或设置为垂直显示VERT_DIR。horiz和vert为文本排齐方式变量,其值是下列中的一个:

      符号名               值         说        明

   ---------------------------------------------------------------

      LEFT_TExT            0         CP(当前位置在左边)

      CENTER_TExT          1         CP在中心

      RIGHT_TExT           2         CP在右边

      BOTTOM_TExT          3         CP在底部

      TOP_TExT             4         CP在顶部

   ---------------------------------------------------------------

      另见settextjustify()函数的说明部分。

      这个函数对应的头文件为graphics.h

返回值: 返回当前文本设置信息并装入info指向的结构里,然后便可以从该结构中获得文本设置各值。

例: 读入当前文本设置值。

   struct textsettingstype ts;

   gettextsettings(&ts);

92. textheight() 文本高度函数

功能: 函数textheight() 返回字符串的高度。

用法: 函数调用方式为int textheight(char *string);

说明: 参数string指向字符串.函数textheight()按当前字体、字符大小、比例因子和文本方向,计算出字符串高度的像素数。这可以是当前单字符的高度,也可以是当前整个字符串的高度值。

      此函数对应的头文件为graphics.h

返回值: 返回字符串高度像素数。

例: 显示数字字符的高度:

#include<graphics.h>

void main()

{

   int driver,mode;

   driver=0;

   mode=0;

   initgraph(&driver,&mode,"");

   printf(height: %d",textheight("8"));

   getch();

   restorecrtmode();

}

93. textwidth() 文本宽度函数

功能: 函数textwidth() 返回字符串的宽度。

用法: 此函数调用方式为int textwidth(char *string);

说明: 参数string指向字符串。函数textwidth()按当前字体、字符大小、比例因子和文本方向,计算出字符串宽度的像素数。这既可以是单字符的宽度,又可以是整个字符串的宽度,并且通常是整个字符串的宽度值。

      这个函数对应的头文件是graphics.h

返回值: 返回字符串宽度像素数。

例: 显示字符串hello的宽度:

#include<graphics.h>

void main()

{

   int driver,mode;

   driver=DETECT;

   mode=0;

   initgraph(&driver,&mode,"");

   printf("width: %d",textwidth("hello"));

   getch();

   restorecrtmode();

}