在C语言中实现汉字显示

Posted on 2007-09-08 01:00 IanZhu 阅读(899) 评论(0)  编辑 收藏 引用
 

在我推荐的文章中对汉字的编码作了详尽的介绍,在此就不多说了.
对汉字在计算机中的编码了解之后,我们应该怎样编写汉字显示程序呢.
既然汉字是以字模的形式保存的,那么我们就应该获得汉字在汉字库中的字模储存位置.
我们可以用以下方式来得到字模的储存位置:
字模首地址=((机内码低字节+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);
      /*由于16X16点阵中有16行*/
   for(i=0;i<16;i++)
   {   /*每一行有两个字节*/
    for(j=0;j<2;j++)
    {  /*得到一个字节*/
     tempChar=fgetc(pointHZK16);
     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+=16+distanceHZK16;
   chinese+=2;  /*由于汉字的储存只占二个字节空间*/
  }
  else/*不是汉字*/
   chinese++;  /*由于非汉字的储存只占一个字节空间*/
 }
 fclose(pointHZK16);
 return ;
}
希望这些代码对大家在对汉字的显示的有所参考.我得提醒一下,上面的程序不能显示其它字符.
要显示其它字符就需要获得其它字符的信息(字符的长,宽).


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 10, comments - 10, trackbacks - 0, articles - 4

Copyright © IanZhu