在dos下汉字与英文显示小结

 以前很少接触到dos, 由于工作的关系,我不得不在dos下写一些字符显示之类的程序。有些东西只有自己经历过了,才有点感触。我觉得我自己到现在以来很不自信,特别对自己的记忆力有十二分的不自信。很多东西看过了,以为就知道了。到了用得到的时候,才知道,原来自己还是一巧不通。

      今天我想把过去写的汉字显示程序及英文程序记录下来,以便将来查阅。

汉字显示原理:本程序主要是查汉字库HZK16,将我们输入汉字的内码转化区位码,计算出汉字在汉字库中的偏移量。开辟一个内存,在用putpixel()打印出来汉字。

/**********************************
* 汉化显示程序
**********************************
* x, y is position.
* z is between hz and hz width
* p_hz is charater pointer.
* color is hz color
* type is hz type default is 1 ------get rid of int type,
* size is hz size default is 1 16*16
*/
void hzShow(int x, int y, int z, unsigned char *p_hz, rgb color, int size)
{
 int i, j, k;
 unsigned char hz16[16][2], hz24[24][3];
 const unsigned char *string;
 FILE *fp_hzk;

 string = p_hz;

 if(size == 1)
 {
  fp_hzk = fopen(PATH_HZK, "rb");
  if(fp_hzk == NULL)
  {
   printf("hzk16 file can't open !");
   getch();
   exit(0);
  }
  while(*string)
  {
   i = *string - 0xa0;
   j = *(string+1) - 0xa0;
   fseek(fp_hzk, (94*(i-1)+(j-1))*32l, SEEK_SET);
   fread(hz16, 32, 1, fp_hzk);
   for(i=0; i<16; i++)
    for(j=0; j<2; j++)
     for(k=0; k<8; k++)
      if((hz16[i][j] & (0x80>>k)) != NULL)
       putPixel(j*8+k+x, i+y, color);
   string += 2;
   x = x + z + 16;
  }
  fclose(fp_hzk);
 }
 else if(size == 2)
 {
  fp_hzk = fopen("c://hzk2424.dat", "rb");
  if(fp_hzk == NULL)
  {
   printf("hzk24 file can't open !");
   getch();
   exit(0);
  }
  while(*string)
  {
   i = *string - 0xa0;
   j = *(string+1) - 0xa0;
   fseek(fp_hzk, (94*(i-1)+(j-1))*72l, SEEK_SET);
   fread(hz24, 72, 1, fp_hzk);
   for(i=0; i<24; i++)
    for(j=0; j<3; j++)
     for(k=0; k<8; k++)
      if((hz24[i][j] & (0x80>>k)) != NULL)
       putPixel(j*8+k+x, i+y, color);
   string += 2;
   x = x + z + 24;
  }
  fclose(fp_hzk);
 }
}

       英文显示原理:也可以像汉字一样打印出来,但是手上没英文字库,而且字库本身固化在VIDEO ROM中。所以利用BIOS功能调用直接取得英文字库的起始地址。程序如下:

void outTextxy(int x,int y,unsigned char *ch,rgb color)
{
 struct REGPACK in;
 int pbp,pb;
 const unsigned char *string;
 unsigned char ch_ch[16][1];
 unsigned char *e_addr;
 int i,j,k;

 string=ch;
 in.r_ax=0x1130;
 in.r_bx=0x0600;
 intr(0x10,&in);
 pbp=in.r_bp;
 while(*string)
 {
  i=*string;
  pb=i*16+pbp;
  e_addr=(unsigned char*)MK_FP(0xc000,pb);
  memcpy(ch_ch,e_addr,16);
  for(i=0;i<16;i++)
   for(j=0;j<1;j++)
    for(k=0;k<8;k++)
     if((ch_ch[i][j]&(0x80>>k))!=NULL)
      putPixel(j*8+k+x,i+y,color);
  string++;
  x+=8;
 }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值