首页 > 范文大全 > 正文

不依赖高点阵字库实现屏幕汉字显示

开篇:润墨网以专业的文秘视角,为您筛选了一篇不依赖高点阵字库实现屏幕汉字显示范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

在设计软件封面或菜单标题时,常需用到放大的汉字显示。通常采用的方法是一边从高点阵字库中读取汉字的字形码,一边加以变换在图形方式下绘点;但高点阵字库占有较大存储空间,例如 :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=0

char *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<36;i++) /*绘汉字上排(1至72字节所含点阵)*/

for(j=0,j<2;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<36;i++) /*绘汉字下排(73至180字节所含点阵);*/

for(j=0,j<3;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;

}