⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzk.h

📁 这个版本修正了已知的Bug,同时添加了部分函数
💻 H
字号:
#include "font.h"

short textasc7(BITMAP *bmp,int x, int y, char * str,unsigned char col);

struct ChinaHzk{
FILE *CHINZK,*ASCZK,*HZK24;
long HZKLEN;
short len;
char *CHzkBuf,*AHzkBuf;
char ChinaName[50],Hzk24Name[50];
char Loadhzk,HZK;
ChinaHzk();
}ChinaHzk;

ChinaHzk::ChinaHzk()
{CHzkBuf=NULL;
 AHzkBuf=NULL;
}

/*将汉字库调入内存
也可提前将字库打开,
ChinaHzk.CHINZK   中文字库结构(ucdos)
ChinaHzk.ASCZK    西文字库结构(ucdos)
退出时关闭.
*/
void setChinaLen(int len)
{ChinaHzk.len=len;}

void CloseHzk()
{
 if(ChinaHzk.CHINZK!=NULL)
delete []ChinaHzk.CHzkBuf;
if(ChinaHzk.ASCZK!=NULL)
delete []ChinaHzk.AHzkBuf;

if(ChinaHzk.HZK24!=NULL)
{
fclose(ChinaHzk.HZK24);
}

}


char LoadAsc()
{       if((ChinaHzk.ASCZK=fopen("asc16","rb"))==NULL)
         {
          sprintf(grp_err,"can not open asc16.");
          return FALSE;
         }
         ChinaHzk.AHzkBuf=new unsigned char [4097];
         if(ChinaHzk.AHzkBuf==NULL){return FALSE;}
         fread(ChinaHzk.AHzkBuf,1,4096,ChinaHzk.ASCZK);
         fclose(ChinaHzk.ASCZK);
         ChinaHzk.Loadhzk=1;
         ChinaHzk.HZK=1;
         fclose(ChinaHzk.ASCZK);
         atexit(CloseHzk);

         return TRUE;
}

char LoadHzk()
{      if((ChinaHzk.CHINZK=fopen("hzk16","rb"))==NULL)
         {
          sprintf(grp_err,"can not open hzk16.");

          return FALSE;
         }
         fseek(ChinaHzk.CHINZK,0,SEEK_END);
         ChinaHzk.HZKLEN=ftell(ChinaHzk.CHINZK);
         rewind(ChinaHzk.CHINZK);
         ChinaHzk.CHzkBuf=new unsigned char [ChinaHzk.HZKLEN+1];
         if(ChinaHzk.CHzkBuf==NULL){return FALSE;}
         fread(ChinaHzk.CHzkBuf,1,ChinaHzk.HZKLEN,ChinaHzk.CHINZK);
         fclose(ChinaHzk.CHINZK);
         ChinaHzk.Loadhzk=1;
         ChinaHzk.HZK=1;
         fclose(ChinaHzk.CHINZK);
         atexit(CloseHzk);
       return TRUE;
}

char load_font()
{if(LoadAsc()||LoadHzk())return FALSE;
else
return TRUE;
}

char LoadHzk24()
{   if((ChinaHzk.HZK24=fopen(ChinaHzk.Hzk24Name,"rb"))==NULL)
       {
       sprintf(grp_err,"Error on open the Hzk24.");

       return FALSE;}
       else
      return TRUE;
}

void show24(BITMAP *bitmap,char *p,int x,int y,unsigned char color)
{
    unsigned int i,c1,c2,f=0;
    int i1,i2,i3,rec;
    int l;
    char by[72];
    while((i=*p++)!=0)
    {
      if(i>0xb0)
	if(f==0)
	{
	  c1=(i-0xb0)&0x07f;
	  f=1;
	}
	else
	{
	  c2=(i-0xa1)&0x07f;
	  f=0;
	  rec=c1*94+c2;
	  l=rec*72L;
	  fseek(ChinaHzk.HZK24,l,SEEK_SET);
	  fread(by,72,1,ChinaHzk.HZK24);
	  for(i1=0;i1<24;i1++)
	    for(i2=0;i2<=2;i2++)
	      for(i3=0;i3<8;i3++)
		if(getbit(*(by+i1*3+i2),7-i3))
		 putpixel(bitmap,x+i1,y+i2*8+i3,color);
		 x=x+24+ChinaHzk.len;
	  }
       }
}

void  hzput(int x,int y,int col,BITMAP *bitmap1)
{     register unsigned char dot[16][2];
      register i,j,k,mask;
      if(ChinaHzk.HZK){
        for(i=0;i<=15;i++)
       {for(j=0;j<=1;j++)
        {
         if(!ChinaHzk.Loadhzk||ChinaHzk.CHzkBuf==NULL)
         dot[i][j]=fgetc(ChinaHzk.CHINZK);
        else
         dot[i][j]=*ChinaHzk.CHzkBuf++;
        mask=0x80;
        for(k=0;k<=7;k++)
         {if(dot[i][j]&mask)
          putpixel(bitmap1,x+((j<<3)+k),y+i,col);
          mask>>=1;
         }
        }
       }
      }else
      for(i=0;i<=15;i++)
       {j=0;
        if(!ChinaHzk.Loadhzk||ChinaHzk.AHzkBuf==NULL)
        dot[i][j]=fgetc(ChinaHzk.ASCZK);
       else
        dot[i][j]=*ChinaHzk.AHzkBuf++;
        mask=0x80;
        for(k=0;k<=7;k++)
         {if(dot[i][j]&mask)
          putpixel(bitmap1,x+((j<<3)+k),y+i,col);
          mask>>=1;
         }
        }
        ChinaHzk.HZK=1;
}
//显示字符
void  textout(BITMAP *bitmap1,char *Str,int x,int y,unsigned char col)
{     register unsigned int offset1;
      int oldx;
      register unsigned char *_bakCHzkBuf,*_bakAHzkBuf,val;
      _bakCHzkBuf=ChinaHzk.CHzkBuf;
      _bakAHzkBuf=ChinaHzk.AHzkBuf;
      oldx=x;
      while(*Str)
      {if(*Str=='\n'){y+=17;x=oldx;*Str++;continue;}
       if(!(*Str&0x80)){
     if((!ChinaHzk.Loadhzk)||ChinaHzk.AHzkBuf==NULL){
      val=textasc7(bitmap1,x,y,Str,col);
      if(!val)return;
      Str+=val;
      x+=6*val;
      goto hz;
      }
       offset1=*Str<<4;
       ChinaHzk.HZK=0;
        ChinaHzk.AHzkBuf+=offset1;
       hzput(x,y,col,bitmap1);
        if(x+8+ChinaHzk.len<bitmap1->w)
        {x+=(8+ChinaHzk.len);}
        else
        {y+=17;x=oldx;}
        Str++;
        ChinaHzk.HZK=1;
        ChinaHzk.AHzkBuf=_bakAHzkBuf;
       continue;
       }
       hz:
       offset1=(unsigned int)((((*Str+95)<<6)+((*Str+95)<<5))-            
               ((*Str+95)<<1)+(*(Str+1)+95))<<5;
        ChinaHzk.CHzkBuf+=(unsigned int)(offset1-778240);
        hzput(x,y,col,bitmap1);
        if(x+16+ChinaHzk.len<bitmap1->w)
        {x+=(16+ChinaHzk.len);}
        else
        {y+=17;x=oldx;}
        Str+=2;
        ChinaHzk.CHzkBuf=_bakCHzkBuf;
       }
      }

//显示字符
void OutText(BITMAP *bitmap,int x,int y,char *str,...)
{    va_list ptr;char *strr;
     strr=new char [strlen(str)+2];
     va_start(ptr,str);
     vsprintf(strr,str,ptr);
     va_end(ptr);
     textout(bitmap,strr,x,y,_COLOR);
     delete []strr;
}

void print_letter(BITMAP *bmp,int x, int y, char letter,unsigned char col)
{
static   int y_scan, width;
 static  unsigned char mask;
  static unsigned char * fontptr;
  register int x_scan;
  if(letter <= 31) return;
  letter -= 32;
  width = font_width[(int)letter];
  fontptr = font[(int)letter];
  for(y_scan = 0; y_scan != 7; y_scan++) {
    mask = 128;
    for(x_scan = 0; x_scan != width; x_scan++) {
      if(*fontptr & mask)
      putpixel(bmp,x+x_scan,y+y_scan,col);
      mask >>= 1;
    }
    ++fontptr;
  }
}

short textasc7(BITMAP *bmp,int x, int y, char * str,unsigned char col)
{register short str_num=0;
  while(*str) {
    if((*str&0x80))return str_num;
    print_letter(bmp,x, y, *str,col);
    x += font_width[*str-32];
    ++str;
    str_num++;
  }
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -