不依赖高点阵字库实现屏幕汉字显示的
不依赖高点阵字库实现屏幕汉字显示的论文 不依赖高点阵字库实现屏幕汉字显示的论文
在设计软件封面或菜单标
时,常需用到放大的汉字显示。通常采用的
是一边从高点阵字库中读取汉字的字形码,一边加以变换在图形方式下绘点;但高点阵字库占有较大存储空间,例如 :2.13汉字系统中四种字体(宋、仿宋、黑、楷)的40x40点阵字库共占用近5m字节的硬盘空间。一般汉字操作系统中的汉字显示都采用16x16点阵字库(仅占约260k字节);而由于硬盘空间的限制,并不是每台微机上都装有高点阵字库。如何使汉字放大显示程序不依赖高点阵字库而独
立运行?本文提供一种方法,将需要放大显示的汉字串的字形码一次性从2.13i高点阵字库(40x40点阵)读入一个subhzk文件,以后每次显示放大汉字时只需从该文件读取字模信息,而subhzk比高点阵字库要小的多。这样,汉字显示程序运行时就彻底摆脱了高点阵字库(只需打开文件subhzk),可在西文方式或任何中文方式下运行。程序采用turbo c2.0编写,汉字放大显示程序disphz运行时只需将subhzk和相应显示器的图形驱动程序(如cga.bgi、egavga.bgi)随disphz.exe放在同一
下即可。须注意的是,40x40点阵字模(字形码)实际上由40×36点阵组成,其汉字字形码排列格式为
@@t5s06100.gif;图1@@程序
:/*程序readghz.c:将需放大显示的汉字串的字形码从2.13系统40x40点阵字库读入文件
subhzk*/#include stdio.h #include io.h int
openhzk40(int);file *fp,*fptr; /*定义全局文件指针*/char *hzk-table[]={"c:\\213\\hzk40s","c:\\231\\hzk40f","c:\\213\\hzk40h","c:\\213\hzk40k"};main(){unsigned char *string="管理信息系统";/*需放大的汉字串*/unsigned char
inter-code ,zone-code,bit-code;int locate,hzk-num,flag=0char *p,dot-arrays[180];if((fptr=fopen("subhzk","wb"))==null){printf("cannot open file\n");exit
(1);} /*打开或创建文件subhzk */openhzk40
(1);p=string;while(*p){inter-code=*p++;if(inter-code
0xal)if(flag==0){zone-code=(inter-code-0xa0) 0x7f;/*汉字区
码*/flag=1;}eles{bit-code=(inter-code-0xa0) 0x7f;/*汉字位码*/flag=0;locate=(zone-code-0x10)*94+bit-code-1;/*汉字字模地址*/fseek(fp,locate*180l,seek-set);/*置文件指针于汉字字模地
址*/fread(dot-arrays,sizeof(dot-arrays),1,fp);/*读汉字字模于数组中*/fwrite(dot-arrays,sizeof(dot-arrays),1,fptr);/*写汉字字模到文件*/}}fclose(fp);fclose(fptr);return 0;}int openhzk40(int hzk-num) /*打开2.13系统40x40点阵字库文件*/{if((fp=fopen(hzk-table[hzk-num],"rb"))==null){cputs("error on open file");getch();exit
(1);}return 0;}/*程序disphz.c:从文件subhzk中读取汉字字形码信息并放大显示*/#include graphics.h #include stdio.h #include fcntl.h #define red 4#define grok 0#define strlen 6/*要显示的汉字串所含汉字个数*/int writehz
(int,int,int,int,int,int);void init-graph();void far restorecr tmode();file *fp;main (){init-graph(); /*初始化图形模式*/if((fp=fopen("subhzk","rb"))==null){printf("cannot open file/n");exit
(1);}writehz(30,30,10,2,2,red);fclose(fp);getch();restorecr tmode();return 0;}void init-graph(){int
gdriver=detect,gmode,errorcode;initgraph( gdriver, gmode,"");errorcode=graphresult();if(errorcode!=grok){printf("graphics
error:%s\n",grapherrormsg(errorcode));printf("press any key to halt:");getch();exit();}}/*汉字字模读取与放大显示*/int writehz(int x,int y,int z,int x-zoom,int y-zoom,int color){int i,j,k,n;char dot-arrays[180]; /*定义180字节数组,暂存汉字字模*/for(n=0;n
strlen;n++){fread(dot-arrays,sizeof(dot-arrays),1,fp);for(i=0;i i++) /*绘汉字上排(1至72字节所含点阵)*/for(j=0,j j++)for(k=0;k 8,k++)if((dot-arrays[i*2+j] (7-k))
1)putpixel(x-zoom*(x+i),y-zoom*(y+j*8+k),color);for(i=0;i i++) /*绘汉字下排(73至180字节所含点阵);*/for(j=0,j j++)for(k=0,k 8,k++)if((dot-arrays[72+i*3+j] (7-k))
1)putpixel(x-zoom*(x+i),y-zoom*(y+16+j*8+k),color);x=x+36+z; /*移位,准备绘下一汉字*/}return 0;}