Turbo C 在图形状态下快速显示彩色汉字-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝30
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:276回复:0

  Turbo C 在图形状态下快速显示彩色汉字

楼主#
更多 发布于:2016-05-07 22:12
Turbo C 在图形状态下快速显示彩色汉字_北京北大青鸟马甸华腾培训学校_北大青鸟计算机网络工程师,电脑培训学校
在用 Turbo C 提供的图形函数进行作图时,为了使屏幕显示更加直观明了,常常需要在图形显示的同时,显示必要的汉字说明。这时Turbo C
提供的一些函数就不能用了。

在汉字操作系统中,有一个 16×16 点阵的汉字库,主要用于屏幕显示。字库中的汉字按 16×16
点阵模式存储,即每个汉字相当于 16×16=256 个点组成。占用 16×2=32 个连续的字节单元。字节的每一位 (bit) 表示一个点的属性:1
表示亮点,0 表示暗点。连续的两个字节表示该汉字字模的一行。32 个字节的排列顺序如图:
@@T5S08100.GIF;图1@@

计算机对西文字符采用一个字节表示,我国规定汉字用内码( 2 个字节)表示。为了保证中西文兼容,也就是说,汉字系统的内码必须同时允许 ASCII
码和汉字的同时使用,而两者之间不能发生冲突。目前规定每个字节只用七位,若两个字节的最高位均为 1,则该字符为汉字


国标对汉字库的结构作了统一的规定:即将汉字库分为若干个区,每个区有 94
个汉字。每一个汉字在字库中有一个固定的区和位,即每一个汉字有一个区位码。知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以,只要通过内码就可以得到区位码,从而也就得到了汉字的字模。

设一个汉字的内码为 ddff,则此汉字的区码为 dd-161;位码为 ff-161;该汉字字模的第一个字节在字库中的位置是(
94×区码+位码)×32。这时只要连续的读出 32 个字节,就可以得到该汉字的字模。

有些文章和书籍采用写点的方式来处理这 32
个字节。即某位为 1,则写点,某位为 0,则不写点。如果这样处理,则每个汉字需循环 256次,写 256 个点,字数越多,则会显得很慢。

Turbo C 提供了这样两个函数:

setlinestyle(int
linestyle,unsignedupattern,int thickness);
line(int x0,int y0,int x1,int
y1);

setlinestyle 函数为设置线型函数,当 linestyle 取 USERBIT-LINE 且 thickness 取
NORM-WIDTH 时,其后的 line 函数就会按 upattern 的 16 位二进制数画一点宽的线。upattern的每一
位代表一个象元,如果那位为 1,则该象元打开,否则该象元关闭。

我们在读字模的时候可以一次读 2 个字节,形成一个 16
位的二进制数,把此二进制数设为 upattern,然后画线。这样只需循环 16 次就可写完一个汉字。速度得到很大的提高。尤其在字数较多时,更体现出此方法的优势。

以下为用画线的方法在西文状态下显示汉字的函数,在 Turbo C++1.0、DOS6.0、兼容 386 机上运行通过。

#include
#include
#include
FILE
*stream; //设 stream 为全程变量//
void open-file()
{//打开汉字库函数,使用的汉字库为 UCDOS 的
16 点阵字库:HZK16//
if((stream=fopen("hzk16","rb"))==NULL)
{ printf("Can't
Open File HZK16"); exit(1);}
}
void close-file()
{//关闭汉字库函数//
fclose(stream); return;
}
void write16(unsigned char *word,int x,int
y,int wd,int col)
{//word 为所要显示的汉字串,x,y 为要显示汉字的起始坐
标,wd 为两个汉字//
//之间的间隔,col 为要显示汉字的颜色.//
register int k,i;
unsigned char cw[33];
char c;
unsigned long int qu-ma,wei-ma;
setcolor(col);settextstyle(0,HORIZ-DIR,1);
for(k=0;word[k]!='/0';k+=2)
{ if((word[k]&0x80)!=0) //判断是否为汉字,是则往下运行//
{ qu-ma=word[k]-161;
wei-ma=word[k+1]-161;
if(fseek(stream,(94*qu-ma+wei-ma)*32,SEEK-SET)!=0)
{ printf("fseek call fail"); exit(-1);
}
i=flell(stream);
fread(cw,32,1,stream);
i=ftell(stream);
for(i=0;i<32;i+=2)
{
setlinestyle(4,cw<<8|cw[i+1],1);
line(x+15,y,x,y); y++;
}
y-=16;x=x+15+wd;
}
else //不是汉字,则进行西文处理//
{ c[0]=word[k]; c='\0';
outtextxy(x,y+4,c); x=x+8+wd;k--;
}
}
setlinestyle(0,0,1);
return;
}
main()
{//演示程序:在屏幕上显示汉字“用画线的方法快速显示彩色汉字 abc ABC”//
int
gd=VGA,gm=VGAHI,i;
initgraph(&gd,&gm,"");
open-file();
for(i=1;i<16;i++)
write16(“用画线的方法快速显示彩色汉字 abc ABC”,85,i*30,8,i);
close-file(); getch();
closegraph(); return;
}



 

 Only
you!!!


 










优质IT资源分享社区为你提供此文。 [font=Tahoma  ]
本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。 [font=Tahoma  ]

C、C++教程视频
优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客