7. 图形模式下的文本输出
在图形模式下,只能用标准输出函数, 如printf(), puts(), putchar()函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数, 也只以前景色为白色,按80列, 25行的文本方式输出。 TurboC2.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(inthoriz, 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的取值参见表9。
表9. 参数horiz和vert的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 用于
————————————————————————
LEFT_TEXT 0 水平
RIGHT_TEXT 2 水平
BOTTOM_TEXT0 垂直
TOP_TEXT 2 垂直
CENTER_TEXT1 水平或垂直
━━━━━━━━━━━━━━━━━━━━━━━━
void farsettextstyle(int font, int direction, int charsize);
该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。TurboC2.0对函数中各个参数的规定见下列各表所示:
表10. font的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值 含义
————————————————————————
DEFAULT_FONT0 8*8点阵字(缺省值)
TRIPLEX_FONT1 三倍笔划字体
SMALL_FONT2 小号笔划字体
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
#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);
settextstyle(1, 0, 8);
outtextxy(20, 20, "Good Better");
setcolor(15);
settextstyle(3, 0, 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点阵字以个的字体), 只能在水平和垂直方向以相同的放大倍数放大。为此TurboC2.0又提供了另外一个setusercharsize() 函数,对笔划字体可以分别设置水平和垂直方向的放大倍数。该函数的调用格式为:
void farsetusercharsize(int mulx, int divx, int muly, int divy);
该函数用来设置笔划型字和放大系数,它只有在settextstyle( )函数中的charsize为0(或USER_CHAR_SIZE)时才起作用,并且字体为函数settextstyle()规定的字体。调用函数setusercharsize()后, 每个显示在屏幕上的字符都以其缺省大小乘以mulx/divx为输出字符宽,乘以muly/divy为输出字符高。该函数的用法见下例。
例15:
#include
#include
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);
outtextxy(120, 120, "Very Good");
setusercharsize(2, 1, 4, 1);
setcolor(15);
settextstyle(3, 0, 5);
outtextxy(220, 220, "Very Good");
setusercharsize(4, 1, 1, 1);
settextstyle(3, 0, 0);
outtextxy(180, 320, "Good");
getch();
closegraph();
return 0;
}
#ifndef _TURBOC_
#ifndef _BORLANDC_
#error You need a Turbo/Borland C compiler to compiler thisprogram.
#endif
#endif
#include <conio.H>
#include <graphics.H>
char *text1 = "Just a simple demostration Here";
char *text2 = "by akuma@tds";
void fade_in(int Color, int DelayTime)
{
int Count;
for (Count = 0 ; Count < 63 ; Count++) {
setrgbpalette(Color,Count,Count,Count);
delay(DelayTime);
}
}
void fade_out(int Color, int DelayTime)
{
int Count;
for (Count = 63 ; Count > 0 ; Count--) {
setrgbpalette(Color,Count,Count,Count) ;
delay(DelayTime) ;
}
}
int main(int argc, char *argv[])
{
int GraphicDriver = VGA, GraphicMode =VGAHI;
int font_color = 2;
(void)argc;
(void)argv;
initgraph( & GraphicDriver, &GraphicMode, "");
setrgbpalette(font_color, 0, 0, 0);
setcolor(font_color);
settextstyle(SCRIPT_FONT, HORIZ_DIR, 4);
outtextxy(80, 215, text1);
settextstyle(TRIPLEX_FONT, HORIZ_DIR,3);
outtextxy(130, 180, text2);
fade_in(font_color, 15);
delay(3000);
fade_out(font_color, 15);
getch();
closegraph();
return 0;
}