第11章文本窗口与图形显示技术学习目标本章内容中我们将学习1.文本窗口的程序设计2.图形显示技术的应用3.汉字显示方法及其应用11.1文本窗口的程序设计学一学1.窗口定义TurboC使用函数window()定义屏幕窗口,函数原型为:voidwindow(intx1,inty1,intx2,inty2);其中参数x1,y1是窗口左上角的坐标,x2,y2是右下角的坐标。2.窗口操作函数(1)设置背景颜色voidtextbackground(intcolor);(2)设置文本颜色voidtextcolor(intcolor);(3)字符串输出voidcputs(char*string);(4)光标定位voidgotoxy(intx,inty);(5)清除窗口文本voidclrscr();试一试问题11.1定制一个宽44列,高17行的英文名片。使名片窗口左上角坐标是(7,7),背景颜色为白色,字符为黑色。然后在名片窗口中显示单位、姓名、通信地址和联系方式等内容文本字符。【解题步骤】1.利用函数window()定义屏幕窗口;2.利用函数textbackgroud()、textcolor()分别设置窗口背景颜色和文本颜色;3.利用清屏函数clrscr(),使设置的颜色生效;4.利用窗口操作函数gotoxy()定位输出光标;5.用窗口操作函数cputs(),输出名片上的文本字符;6.重新用函数window()恢复全屏幕窗口,textbackground(BLACK)恢复0号背景颜色,textcolor(7)恢复7号文本颜色;7.用clrscr(),使设置的颜色生效。设计目标程序代码voidmain(){textbackground(BLUE);/*设置蓝色屏幕背景颜色*/clrscr();/*清屏,使设置的背景颜色生效*/window(7,7,51,24);/*创建左上角(7,7),右下角(51,24)的窗口*/textbackground(WHITE)/*设置白色窗口背景颜色*/textcolor(BLACK);/*设置黑色文本颜色*/clrscr();/*清屏,使设置的颜色生效*/gotoxy(13,4);/*光标定位在坐标(13,4)处*/cputs(SHENZHENPOLYTECHNIC);/*输出字符串SHENZHENPOLYTECHNIC*/gotoxy(13,6);cputs(DepartmentofComputer);gotoxy(18,10);程序代码cputs(WangZhanhua);gotoxy(5,14);cputs(Add:XiliLake,Shenzhen,P.R.China);gotoxy(5,15);cputs(Post:518055E-mail:wzh@oa.szpt.net);gotoxy(5,16);cputs(Tel:0755-26731092Fax:0755-26731197);getch();window(1,1,80,25);/*恢复全屏幕窗口*/textbackground(BLACK);/*恢复0号背景颜色*/textcolor(7);/*恢复7号前景颜色*/clrscr();/*清屏,使设置的颜色生效*/}练一练在问题11.1中,修改程序,使背景颜色为红色,字符为蓝色。并且闪烁显示姓名“WangZhanhua”字符。11.2图形显示技术的应用学一学1.图形系统的初始化voidfarinitgraph(intfar*gdriver,intfar*gmode,charfar*path)2.常用画图函数3.图形系统的关闭voidfarclosegraph(void);常用画图函数voidfarline(intx1,inty1,intx2,inty2)voidfarlineto(intx,inty)voidfarcircle(intx,inty,intradius)voidfarsetcolor(intcolor)voidfarsetbkcolor(intbcolor)voidfarsetfillstyle(intpattern,intcolor)试一试问题11.2在屏幕上画一条直线.【解题步骤】1.对图形系统初始化;2.调用画线函数line()画一条直线;3.关闭图形系统,将屏幕恢复为调用initgraph()之前的模式。【程序代码】#includegraphics.hvoidmain(){intiDriver,iMode;detectgraph(&iDriver,&iMode);initgraph(&iDriver,&iMode,“”);line(10,10,50,50);getch();closegraph();}问题11.3在屏幕上画100条动态直线【解题步骤】1.对图形系统初始化;2.构建循环,画100条动态直线,其中每条直线的两个端点坐标,利用随机函数产生;3.关闭图形系统,将屏幕恢复为调用initgraph()之前的模式。程序代码voidmain(){inti=1,iDriver,iMode;detectgraph(&iDriver,&iMode);initgraph(&iDriver,&iMode,“”);do{x1=rand()%500;y1=rand()%300;x2=rand()%500;y2=rand()%300;line(x1,y1,x2,y2);i=i+1;}while(i=100);closegraph();}问题11.4在屏幕上,以(100,100)为圆心,50为半径,画一个圆【解题步骤】1.初始化图形系统;2.画一个圆;3.关闭图形系统,将屏幕恢复为调用initgraph()之前的模式。程序代码#includegraphics.hvoidmain(){intiDriver,iMode;detectgraph(&iDriver,&iMode);initgraph(&iDriver,&iMode,“”);circle(100,100,50);/*画圆*/getch();closegraph();}练一练1.在屏幕上画一个椭圆。2.在屏幕上画一个圆,然后在圆内随机画100条直线。3.图11-5是一个由不同色彩的线段描绘的钻石线框图,请尝试完成。提示:程序主要由四部分组成(1)图形系统初始化;(2)计算各线段的端点坐标值,存储到数组x和y中t=6.28318/23;r=200;for(i=0;i23;i++){x[i]=r*cos(i*t)+x0;y[i]=r*sin(i*t)+y0;}(3)调用图形函数setcolor()、line(),按设定的前景色彩画线for(i=0;i=n-2;i++){setcolor(hh+1);hh%=14;hh++;if(hh==0)hh++;for(j=i+1;j=n-1;j++)line(x[i],y[i],x[j],y[j]);}(4)关闭图形系统,恢复文本模式。问题11-5给椭圆涂上颜色。【解题步骤】1.对图形系统初始化;2.设置填充模式;3.调用画椭圆函数画椭圆;4.关闭图形系统,将屏幕恢复为调用initgraph()之前的模式。程序代码#includegraphics.hvoidmain(){char*p;intiDriver,iMode;detectgraph(&iDriver,&iMode);initgraph(&iDriver,&iMode,“”);getfillpattern(p);/*取得当前默认的填充模式*/setfillpattern(p,1);/*设置填充方法*/ellipse(100,100,0,360,100,50);/*画椭圆*/fillellipse(100,100,100,50);/*填充椭圆*/closegraph();}11.3汉字显示技术及其应用学一学1.16点阵字模字库中的汉字按16×16点阵模式存储,每个汉字由16×16=256个点组成,占用16×2=32个字节单元。字节的每一位(bit)表示一个点的属性(1—有亮点,0—无亮点)。2.汉字的内码汉字用内码表示,内码为两个字节。为了与西文兼容,汉字系统的内码必须同时允许ASCII码和汉字内码的使用,两者之间不应冲突,所以规定每个字节只用7位(bit),若两个字节的最高位均为1,则该字符为汉字。3.读取汉字字模设某个汉字内码为十六进制数aaff,则区号qh和位号wh分别为:qh=aa–0xa0;wh=ff–0xa0;于是,该汉字在汉字库中的起始位置为(以字节为单位):offset=(94*(qh-1)+(wh-1))*32L;连续读取32个字节就是该汉字的字模。所以,由汉字内码,从汉字库中读取字模的可用以下函数实现。读取字模函数。VoidfnGet_hzm(charcIncode[],charcBytes[]){unsignedcharqh,wh;unsignedlongoffset;qh=cIncode[0]-0xa0;wh=cIncode[1]-0xa0;offset=(94*(qh-1)+(wh-1))*32L;fseek(fp,offset,SEEK_SET);fread(cBytes,1,32,fp);}字模显示函数voidfnDisp_hzm(intiX,intiY,intiColor,charcBuf[]){inti,j,k;for(i=0;i16;i++)for(j=0;j2;j++)for(k=0;k8;k++)if(cBuf[i*2+j](7-k)&1)putpixel(iX+j*8+k,iY+i,iColor);}汉字显示函数voidfnDisHz16X16(intiX,intiY,intiWidth,intiColor,char*pStr){unsignedcharcBuf[35];while(*pStr){if((*pStr&0x80)&&(*(pStr+1)&0x80)){fnGet_hzm(pStr,cBuf);fnDisp_hz(iX,iY,iColor,cBuf);iX+=(16+iWidth);pStr+=2;}}}试一试问题11.6将问题11.1的英文名片,替换为中文,并将背景设为蓝色,文字设为黄色,【解题步骤】1.在例11.3的程序中添加fnGet_hzm(),fnDisp_hzm()和fnDisHz16X16()子函数;2.打开汉字库;3.调用函数fnDisHz16X16()显示汉字;4.关闭文件。程序代码voidmain(){intGraphDrive,GraphMode,i;fp=fopen(hzk16.dot,rb);if(fp==NULL)exit();detectgraph(&GraphDrive,&GraphMode);initgraph(&GraphDrive,&GraphMode,D:\\tc);程序代码setfillstyle(1,1);bar(10,10,400,320);fnDisHz16X16(20,15,4,14,2,3,cMain[0]);setcolor(14);outtextxy(120,100,Main[1]);fnDisHz16X16(240,110,4,14,1,1,cMain[2]);fnDisHz16X16(60,80,4,14,2,2,王章华)程序代码fnDisHz16X16(250,170,4,14,1,1,副教授);fnDisHz16X16(50,250,4,14,1,1,cMain[3]);outtextxy(50,280,cMain[4]);outtextxy(50,290,cMain[5]);fclose(fp);getch();closegraph();}问题11.7开发移动广告牌:深圳职业技术学院【解题步骤】1.同问题11.6一样,定义fnGet_hzm(),fnDisp_hzm()和fnDisHz16X16()子函数;2.打开汉字库,进行图形系统初始化;3.设置填充模式;4.画长方条形图并着色,调用函数