在我推荐的文章中对汉字的编码作了详尽的介绍,在此就不多说了.
对汉字在计算机中的编码了解之后,我们应该怎样编写汉字显示程序呢.
既然汉字是以字模的形式保存的,那么我们就应该获得汉字在汉字库中的字模储存位置.
我们可以用以下方式来得到字模的储存位置:
字模首地址=((机内码低字节+95)×94+(机内码高字节+95))×N
注:N为一个汉字点阵字模的字节数。
得到了字模数据之后,再对每个字节的位进行判断,如果位为1,用putpixel()在相就的点上画上一点,
如果位上为0,则不作画点操作.知道了原理之后,开始编程就OK了.以下是我个人编写好的汉字显示
程序,希望对大家有参考作用.
对12X12点阵的汉字显示:
void printCHN12(int xCoor,int yCoor,int color,int distanceHZK12,char *chinese)
/*xCoor,yCoor指出汉字显示的位置,color显示的颜色,distanceHZK12为两个相邻的汉字之间的距离,
chinese是要显示的汉字*/
{
long filePosition; /*存放一个汉字在汉字库中的位置*/
int i,j,k;
int pointX=xCoor,pointY=yCoor; /*给出扫描点的输出位置*/
int tempBit;
char tempChar;
FILE *pointHZK12=fopen("HZK12","rb"); /*打开12X12点阵汉字库*/
while(*chinese)/*遍历所有需要显示的汉字*/
{
if((*chinese) & 0x80) /*判断是否是汉字*/
{
/*获得某汉字在字库中的字模位置*/
filePosition=(long)((*chinese+95)*94+(*(chinese+1)+95))*24;
/*将文件位置指针指向字模的首地址*/
fseek(pointHZK12,filePosition,0);
/*由于12X12点阵中有12行*/
for(i=0;i<12;i++)
{
/*每一行有两个字节*/
for(j=0;j<2;j++)
{
/*得到一个字节*/
tempChar=fgetc(pointHZK12);
/*用来测试字节的位*/
tempBit=0x80;
for(k=0;k<8;k++)
{
if(tempBit & tempChar)
/*作"与"位操作,如果是1,就在这个位置上画点*/
putpixel(pointX+k,pointY,color);
tempBit=tempBit>>1;/*测试下一个位*/
}
pointX+=8;/*下一个字节的输出位置*/
}
pointY++; /*下一行的输出位置*/
pointX-=16;
}
pointY=yCoor; /*下一个汉字的输出位置*/
pointX+=12+distanceHZK12;
chinese+=2; /*由于汉字的储存只占二个字节空间*/
}
else/*不是汉字*/
chinese+=1; /*由于非汉字的储存只占一个字节空间*/
}
fclose(pointHZK12); /*关闭汉字库*/
return ;
}
对16X16点阵汉字的显示:
void printCHN16(int xCoor,int yCoor,int color,int distanceHZK16,char *chinese)
/*xCoor,yCoor指出汉字显示的位置,color显示的颜色,distanceHZK16为两个相邻的汉字之间的距离,
chinese是要显示的汉字*/
{
long filePosition; /*存放一个汉字在汉字库中的位置*/
int i,j,k;
int pointX=xCoor,pointY=yCoor; /*给出扫描点的输出位置*/
char tempChar;
int tempBit;
FILE *pointHZK16=fopen("HZK16","rb"); /*打开16X16点阵汉字库*/
while(*chinese)/*遍历所有需要显示的汉字*/
{
if((*chinese) & 0x80) /*判断是否是汉字*/
{
/*获得某汉字在字库中的字模位置*/
filePosition=(long)((*chinese+95)*94+(*(chinese+1)+95))*32;
/*将文件位置指针指向字模的首地址*/
fseek(pointHZK16,filePosition,0);<