QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2807|回复: 1
打印 上一主题 下一主题

[转帖]TC在图形状态下快速显示彩色汉字

[复制链接]
字体大小: 正常 放大
sxqiang        

9

主题

2

听众

75

积分

与你共勉

升级  73.68%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-5-22 00:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
在用Turbo C提供的图形函数进行作图时,为了使屏幕显示更加直观明了,常常需要在图形显示的同时,显示必要的汉字说明。这时Turbo C提供的一些函数就不能用了。<BR>在汉字操作系统中,有一个16×16点阵的汉字库,主要用于屏幕显示。字库中的汉字按16×16点阵模式存储,即每个汉字相当于16×16=256个点组成。占用16×2=32个连续的字节单元。字节的每一位(bit)表示一个点的属性:1表示亮点,0表示暗点。连续的两个字节表示该汉字字模的一行。32个字节的排列顺序如图:<BR>@@T5S08100.GIF;图1@@<BR>计算机对西文字符采用一个字节表示,我国规定汉字用内码(2个字节)表示。为了保证中西文兼容,也就是说,汉字系统的内码必须同时允许ASCII码和汉字的同时使用,而两者之间不能发生冲突。目前规定每个字节只用七位,若两个字节的最高位均为1,则该字符为汉字。<BR>国标对汉字库的结构作了统一的规定:即将汉字库分为若干个区,每个区有94个汉字。<BR>每一个汉字在字库中有一个固定的区和位,即每一个汉字有一个区位码。知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以,只要通过内码就可以得到区位码,从而也就得到了汉字的字模。<BR>设一个汉字的内码为ddff,则此汉字的区码为dd-161;位码为ff-161;该汉字字模的第一个字节在字库中的位置是(94×区码+位码)×32。这时只要连续的读出32个字节,就可以得到该汉字的字模。<BR>有些文章和书籍采用写点的方式来处理这32个字节。即某位为1,则写点,某位为0,则不写点。如果这样处理,则每个汉字需循环256次,写256个点,字数越多,则会显得很慢。<BR>Turbo C提供了这样两个函数:<BR>setlinestyle(int linestyle,unsignedupattern,int thickness);<BR>line(int x0,int y0,int x1,int y1);<BR>setlinestyle函数为设置线型函数,当linestyle取USERBIT-LINE且thickness取NORM-WIDTH时,其后的line函数就会按upattern的16位二进制数画一点宽的线。upattern的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。<BR>我们在读字模的时候可以一次读2个字节,形成一个16位的二进制数,把此二进制数设为upattern,然后画线。这样只需循环16次就可写完一个汉字。速度得到很大的提高。尤其在字数较多时,更体现出此方法的优势。<BR>以下为用画线的方法在西文状态下显示汉字的函数,在Turbo C++1.0、DOS6.0、兼容386机上运行通过。<BR>#include&lt;graphics.h&gt;<BR>#include&lt;stdio.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>FILE *stream; //设 stream为全程变量//<BR>void open-file()<BR>{//打开汉字库函数,使用的汉字库为UCDOS的16点阵字库:HZK16//<BR>if((stream=fopen("hzk16","rb"))==NULL)<BR>{ printf("Can't Open File HZK16"); exit(1);}<BR>}<BR>void close-file()<BR>{//关闭汉字库函数//<BR>fclose(stream); return;<BR>}<BR>void write16(unsigned char *word,int x,int y,int wd,int col)<BR>{//word为所要显示的汉字串,x,y为要显示汉字的起始坐标,wd为两个汉字//<BR>//之间的间隔,col为要显示汉字的颜色.//<BR>register int k,i;<BR>unsigned char cw[33];<BR>char c[2];<BR>unsigned long int qu-ma,wei-ma;<BR>setcolor(col);settextstyle(0,HORIZ-DIR,1);<BR>for(k=0;word[k]!='/0';k+=2)<BR>{ if((word[k]&amp;0x80)!=0) //判断是否为汉字,是则往下运行//<BR>{ qu-ma=word[k]-161; wei-ma=word[k+1]-161;<BR>if(fseek(stream,(94*qu-ma+wei-ma)*32,SEEK-SET)!=0)<BR>{ printf("fseek call fail"); exit(-1);<BR>}<BR>i=flell(stream); fread(cw,32,1,stream);<BR>i=ftell(stream);<BR>for(i=0;i&lt;32;i+=2)<BR>{ setlinestyle(4,cw&lt;&lt;8|cw[i+1],1);<BR>line(x+15,y,x,y); y++;<BR>} y-=16;x=x+15+wd;<BR>}<BR>else //不是汉字,则进行西文处理//<BR>{ c[0]=word[k]; c[1]='\0';<BR>outtextxy(x,y+4,c); x=x+8+wd;k--;<BR>}<BR>}<BR>setlinestyle(0,0,1); return;<BR>}<BR>main()<BR>{//演示程序:在屏幕上显示汉字“用画线的方法快速显示彩色汉字 abc ABC”//<BR>int gd=VGA,gm=VGAHI,i;<BR>initgraph(&amp;gd,&amp;gm,"");<BR>open-file();<BR>for(i=1;i&lt;16;i++)<BR>write16(“用画线的方法快速显示彩色汉字 abc ABC”,85,i*30,8,i);<BR>close-file(); getch();<BR>closegraph(); return;<BR>}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
不在学习中进步,就在无聊中堕落

1

主题

2

听众

27

积分

升级  23.16%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-5-11 15:18 , Processed in 0.503408 second(s), 57 queries .

回顶部